《R语言实战》自学笔记71-主成分和因子分析

《R语言实战》自学笔记71-主成分和因子分析,第1张

主成分分析

成分分析((Principal Component Analysis,PCA)是一种数据降维技巧,它能将大量相关变量转化为一组很少的不相关变量,这些无关变量称为主成分(原来变量的线性组合)。整体思想就是化繁为简,抓住问题关键,也就是降维思想。

主成分分析法是通过恰当的数学变换,使新变量——主成分成为原变量的线性组合,并选取少数几个在变差总信息量中比例较大的主成分来分析事物的一种方法。主成分在变差信息量中的比例越大,它在综合评价中的作用就越大。

因子分析

探索性因子分析法(Exploratory Factor Analysis,EFA)是一系列用来发现一组变量的潜在结构的方法。它通过寻找一组更小的、潜在的或隐藏的结构来解释已观测到的、显式的变量间的关系。

PCA与EFA模型间的区别

参见图14-1。主成分(PC1和PC2)是观测变量(X1到X5)的线性组合。形成线性组合的权重都是通过最大化各主成分所解释的方差来获得,同时还要保证个主成分间不相关。相反,因子(F1和F2)被当做是观测变量的结构基础或“原因”,而不是它们的线性组合。

R的基础安装包提供了PCA和EFA的函数,分别为princomp()和factanal()。

最常见的分析步骤

(1)数据预处理。PCA和EFA都根据观测变量间的相关性来推导结果。用户可以输入原始数据矩阵或者相关系数矩阵到principal()和fa()函数中。若输入初始数据,相关系数矩阵将会被自动计算,在计算前请确保数据中没有缺失值。

(2)选择因子模型。判断是PCA(数据降维)还是EFA(发现潜在结构)更符合你的研究目标。如果选择EFA方法,你还需要选择一种估计因子模型的方法(如最大似然估计)。

(3)判断要选择的主成分/因子数目。

(4)选择主成分/因子。

(5)旋转主成分/因子。

(6)解释结果。

(7)计算主成分或因子得分。

PCA的目标是用一组较少的不相关变量代替大量相关变量,同时尽可能保留初始变量的信息,这些推导所得的变量称为主成分,它们是观测变量的线性组合。如第一主成分为:

它是k个观测变量的加权组合,对初始变量集的方差解释性最大。第二主成分也是初始变量的线性组合,对方差的解释性排第二,同时与第一主成分正交(不相关)。后面每一个主成分都最大化它对方差的解释程度,同时与之前所有的主成分都正交。理论上来说,你可以选取与变量数相同的主成分,但从实用的角度来看,我们都希望能用较少的主成分来近似全变量集。

主成分与原始变量之间的关系

(1)主成分保留了原始变量绝大多数信息。

(2)主成分的个数大大少于原始变量的数目。

(3)各个主成分之间互不相关。

(4)每个主成分都是原始变量的线性组合。

数据集USJudgeRatings包含了律师对美国高等法院法官的评分。数据框包含43个观测,12个变量。

用来判断PCA中需要多少个主成分的准则:

根据先验经验和理论知识判断主成分数;

根据要解释变量方差的积累值的阈值来判断需要的主成分数;

通过检查变量间k × k的相关系数矩阵来判断保留的主成分数。

最常见的是基于特征值的方法。每个主成分都与相关系数矩阵的特征值相关联,第一主成分与最大的特征值相关联,第二主成分与第二大的特征值相关联,依此类推。

Kaiser-Harris准则建议保留特征值大于1的主成分,特征值小于1的成分所解释的方差比包含在单个变量中的方差更少。Cattell碎石检验则绘制了特征值与主成分数的图形。这类图形可以清晰地展示图形弯曲状况,在图形变化最大处之上的主成分都可保留。最后,你还可以进行模拟,依据与初始矩阵相同大小的随机数据矩阵来判断要提取的特征值。若基于真实数据的某个特征值大于一组随机数据矩阵相应的平均特征值,那么该主成分可以保留。该方法称作平行分析。

图形解读:线段和x符号组成的图(蓝色线):特征值曲线;

红色虚线:根据100个随机数据矩阵推导出来的平均特征值曲线;

绿色实线:特征值准则线(即:y=1的水平线)

判别标准:特征值大于平均特征值,且大于y=1的特征值准则线,被认为是可保留的主成分。根据判别标准,保留1个主成分即可。

faparallel函数学习

faparallel(data,nobs=,fa=”pc”/”both”,niter=100,showlegend=T/F)

data:原始数据数据框;

nobs:当data是相关系数矩阵时,给出原始数据(非原始变量)个数,data是原始数据矩阵时忽略此参数;

fa:“pc”为仅计算主成分,“fa”为因子分析,“both”为计算主成分及因子;

niter:模拟平行分析次数;

showlegend:显示图例。

principal(r, nfactors = , rotate = , scores = )

r:相关系数矩阵或原始数据矩阵;

nfactors:设定主成分数(默认为1);

rotate:指定旋转的方法,默认最大方差旋转(varimax)。

scores:设定是否需要计算主成分得分(默认不需要)。

PC1栏包含了成分载荷,指观测变量与主成分的相关系数。如果提取不止一个主成分,那么还将会有PC2、PC3等栏。成分载荷(component loadings)可用来解释主成分的含义,解释主成分与各变量的相关程度。

h2栏为成分公因子方差,即主成分对每个变量的方差解释度。

u2栏为成分唯一性,即方差无法被主成分解释的部分(1-h2)。

SS loadings包含了与主成分相关联的特征值,其含义是与特定主成分相关联的标准化后的方差值,即可以通过它来看90%的方差可以被多少个成分解释,从而选出主成分(即可使用nfactors=原始变量个数来把所有特征值查出,当然也可以直接通过eigen函数对它的相关矩阵进行查特征值)。

Proportion Var表示每个主成分对整个数据集的解释程度。

Cumulative Var表示各主成分解释程度之和。

Proportion Explained及Cumulative Proportion分别为按现有总解释方差百分比划分主成分及其累积百分比。

结果解读:第一主成分(PC1)与每个变量都高度相关,也就是说,它是一个可用来进行一般性评价的维度。ORAL变量991%的方差都可以被PC1来解释,仅仅有091%的方差不能被PC1解释。第一主成分解释了11个变量92%的方差。

结果解读:通过碎石图可以判定选择的主成分个数为2个。

结果解读:从结果Proportion Var: 058和022可以判定,第一主成分解释了身体测量指标58%的方差,而第二主成分解释了22%,两者总共解释了81%的方差。对于高度变量,两者则共解释了其88%的方差。

旋转是一系列将成分载荷阵变得更容易解释的数学方法,它们尽可能地对成分去噪。旋转方法有两种:使选择的成分保持不相关(正交旋转),和让它们变得相关(斜交旋转)。旋转方法也会依据去噪定义的不同而不同。最流行的正交旋转是方差极大旋转,它试图对载荷阵的列进行去噪,使得每个成分只是由一组有限的变量来解释(即载荷阵每列只有少数几个很大的载荷,其他都是很小的载荷)。 结果列表中列的名字都从PC变成了RC,以表示成分被旋转。

当scores = TRUE时,主成分得分存储在principal()函数返回对象的scores元素中。

如果你的目标是寻求可解释观测变量的潜在隐含变量,可使用因子分析。

EFA的目标是通过发掘隐藏在数据下的一组较少的、更为基本的无法观测的变量,来解释一

组可观测变量的相关性。这些虚拟的、无法观测的变量称作因子。(每个因子被认为可解释多个

观测变量间共有的方差,因此准确来说,它们应该称作公共因子。)

其中 是第i个可观测变量(i = 1…k), 是公共因子(j = 1…p),并且p<k。 是 变量独有的部分(无法被公共因子解释)。 可认为是每个因子对复合而成的可观测变量的贡献值。

碎石检验的前两个特征值(三角形)都在拐角处之上,并且大于基于100次模拟数据矩阵的特征值均值。对于EFA,Kaiser-Harris准则的特征值数大于0,而不是1。

结果解读:PCA结果建议提取一个或者两个成分,EFA建议提取两个因子。

fa(r, nfactors=, nobs=, rotate=, scores=, fm=)

 r是相关系数矩阵或者原始数据矩阵;

 nfactors设定提取的因子数(默认为1);

 nobs是观测数(输入相关系数矩阵时需要填写);

 rotate设定旋转的方法(默认互变异数最小法);

 scores设定是否计算因子得分(默认不计算);

 fm设定因子化方法(默认极小残差法)。

与PCA不同,提取公共因子的方法很多,包括最大似然法(ml)、主轴迭代法(pa)、加权最小二乘法(wls)、广义加权最小二乘法(gls)和最小残差法(minres)。统计学家青睐使用最大似然法,因为它有良好的统计性质。

结果解读:两个因子的Proportion Var分别为046和014,两个因子解释了六个心理学测试60%的方差。

结果解读:阅读和词汇在第一因子上载荷较大,画图、积木图案和迷宫在第二因子上载荷较大,非语言的普通智力测量在两个因子上载荷较为平均,这表明存在一个语言智力因子和一个非语言智力因子。

正交旋转和斜交旋转的不同之处。

对于正交旋转,因子分析的重点在于因子结构矩阵(变量与因子的相关系数),而对于斜交旋转,因子分析会考虑三个矩阵:因子结构矩阵、因子模式矩阵和因子关联矩阵。

因子模式矩阵即标准化的回归系数矩阵。它列出了因子预测变量的权重。因子关联矩阵即因子相关系数矩阵。

图形解读:词汇和阅读在第一个因子(PA1)上载荷较大,而积木图案、画图和迷宫在第二个因子(PA2)上载荷较大。普通智力测验在两个因子上较为平均。

与可精确计算的主成分得分不同,因子得分只是估计得到的。它的估计方法有多种,fa()函数使用的是回归方法。

R包含了其他许多对因子分析非常有用的软件包。FactoMineR包不仅提供了PCA和EFA方法,还包含潜变量模型。它有许多此处我们并没考虑的参数选项,比如数值型变量和类别型变量的使用方法。FAiR包使用遗传算法来估计因子分析模型,它增强了模型参数估计能力,能够处理不等式的约束条件,GPArotation包则提供了许多因子旋转方法。最后,还有nFactors包,它提供了用来判断因子数目的许多复杂方法。

主成分分析

1数据导入

数据结构:对10株玉米进行了生物学性状考察,考察指标有株高,穗位,茎粗,穗长,秃顶,穗粗,穗行数,行粒数。

结果解读:选择2个主成分即可保留样本大量信息。

3提取主成分

结果解读:主成分1可解释44%的方差,主成分2解释了26%的方差,合计解释了70%的方差。

4获取主成分得分

5主成分方程

PC1 = 027 株高 - 004 穗位 + 029 茎粗 - 001 穗长 - 021 秃顶 - 013 穗粗 + 016 穗行数 + 024 行粒数

PC2 = -001 株高 + 036 穗位 - 010 茎粗 + 041 穗长 - 008 秃顶 + 043 穗粗 - 015 穗行数 + 001 行粒数

图形解读:此图反映了变量与主成分的关系,三个蓝点对应的RC2值较高,点上的标号2,4,6对应变量名穗位,穗长,穗粗,说明第2主成分主要解释了这些变量,与这些变量相关性强;黑点分别对应株高,茎粗,穗行数,行粒数,说明第一主成分与这些变量相关性强,第一主成分主要解释的也是这些变量,而5号点秃顶对于两个主成分均没有显示好的相关性。

因子分析

图解:可以看到需要提取4个因子。

2提取因子

结果解读:因子1到4解释了80%的方差。

3获取因子得分

图解:可以看出,因子1和因子2的相关系数为04,行粒数,株高,茎粗,秃顶在因子1的载荷较大,穗长,穗位在因子2上的载荷较大;因子3只有穗行数相关,因子4只有穗粗相关。

参考资料:

用fgets函数读取文件中某行的数据,某列数据就必须读入每行的第几个字符,再存入到一个字符串当里。

例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

#include<stdioh>

#include<stringh>

voidmain()

{

chara[100],b[100],c[100];

inti=3,j=4,k=0;//第三行,第四列

FILEfp=fopen("datatxt","r");

while(fgets(c,100,fp)){//读入每行数据

i--;

if(i==0)strcpy(a,c);//读到第三行数据

b[k++]=c[j-1];//把每行的那列字符拷到b中

}

b[k]=0;

printf("第%d行数据:%s\n",i,a);

printf("第%d列数据:%s\n",j,b);

fclose(fp);

扩展资料

R语言的使用

readcsv/csv2:逗号分隔数据读取

csv可能是目前最常见的平面文件类型了。它代表的是comma-separatedvalues,简单来讲就是,文件里每一个单独的数据值都是用逗号进行分隔的。

数据文件被读取到R工作环境中的第一步通常为调用str函数来对该数据对象进行初步检视,下面的代码列出了该函数最简单的使用方式。

>str(object=flights)

'dataframe':6obsof6variables:

$carrier:Factorw/4levels"AA","B6","DL",:441234

$flight:int1545171411417254611696

$tailnum:Factorw/6levels"N14228","N24211",:124653

$origin:Factorw/3levels"EWR","JFK","LGA":132231

$dest:Factorw/5levels"ATL","BQN","IAH",:334215

$air_time:int227227160183116150

R语言基本数据分析

本文基于R语言进行基本数据统计分析,包括基本作图,线性拟合,逻辑回归,bootstrap采样和Anova方差分析的实现及应用。

不多说,直接上代码,代码中有注释。

1 基本作图(盒图,qq图)

#basic plot

boxplot(x)

qqplot(x,y)

2 线性拟合

#linear regression

n = 10

x1 = rnorm(n)#variable 1

x2 = rnorm(n)#variable 2

y = rnorm(n)3

mod = lm(y~x1+x2)

modelmatrix(mod) #erect the matrix of mod

plot(mod) #plot residual and fitted of the solution, Q-Q plot and cook distance

summary(mod) #get the statistic information of the model

hatvalues(mod) #very important, for abnormal sample detection

3 逻辑回归

#logistic regression

x <- c(0, 1, 2, 3, 4, 5)

y <- c(0, 9, 21, 47, 60, 63) # the number of successes

n <- 70 #the number of trails

z <- n - y #the number of failures

b <- cbind(y, z) # column bind

fitx <- glm(b~x,family = binomial) # a particular type of generalized linear model

print(fitx)

plot(x,y,xlim=c(0,5),ylim=c(0,65)) #plot the points (x,y)

beta0 <- fitx$coef[1]

beta1 <- fitx$coef[2]

fn <- function(x) nexp(beta0+beta1x)/(1+exp(beta0+beta1x))

par(new=T)

curve(fn,0,5,ylim=c(0,60)) # plot the logistic regression curve

3 Bootstrap采样

# bootstrap

# Application: 随机采样,获取最大eigenvalue占所有eigenvalue和之比,并画图显示distribution

dat = matrix(rnorm(1005),100,5)

nosamples = 200 #sample 200 times

# theta = matrix(rep(0,nosamples5),nosamples,5)

theta =rep(0,nosamples5);

for (i in 1:nosamples)

{

j = sample(1:100,100,replace = TRUE)#get 100 samples each time

datrnd = dat[j,]; #select one row each time

lambda = princomp(datrnd)$sdev^2; #get eigenvalues

# theta[i,] = lambda;

theta[i] = lambda[1]/sum(lambda); #plot the ratio of the biggest eigenvalue

}

# hist(theta[1,]) #plot the histogram of the first(biggest) eigenvalue

hist(theta); #plot the percentage distribution of the biggest eigenvalue

sd(theta)#standard deviation of theta

#上面注释掉的语句,可以全部去掉注释并将其下一条语句注释掉,完成画最大eigenvalue分布的功能

4 ANOVA方差分析

#Application:判断一个自变量是否有影响 (假设我们喂3种维他命给3头猪,想看喂维他命有没有用)

#

y = rnorm(9); #weight gain by pig(Yij, i is the treatment, j is the pig_id), 一般由用户自行输入

#y = matrix(c(1,10,1,2,10,2,1,9,1),9,1)

Treatment <- factor(c(1,2,3,1,2,3,1,2,3)) #each {1,2,3} is a group

mod = lm(y~Treatment) #linear regression

print(anova(mod))

#解释:Df(degree of freedom)

#Sum Sq: deviance (within groups, and residuals) 总偏差和

# Mean Sq: variance (within groups, and residuals) 平均方差和

# compare the contribution given by Treatment and Residual

#F value: Mean Sq(Treatment)/Mean Sq(Residuals)

#Pr(>F): p-value 根据p-value决定是否接受Hypothesis H0:多个样本总体均数相等(检验水准为005)

qqnorm(mod$residual) #plot the residual approximated by mod

#如果qqnorm of residual像一条直线,说明residual符合正态分布,也就是说Treatment带来的contribution很小,也就是说Treatment无法带来收益(多喂维他命少喂维他命没区别)

如下面两图分别是

(左)用 y = matrix(c(1,10,1,2,10,2,1,9,1),9,1)和

(右)y = rnorm(9);

的结果。可见如果给定猪吃维他命2后体重特别突出的数据结果后,qq图种residual不在是一条直线,换句话说residual不再符合正态分布,ie, 维他命对猪的体重有影响。

运用该凡事计算列数和行数步骤如下所示:

1、确定要计算的数据框,可以通过读取文件或手动创建数据框来获取数据。

2、使用ncol()函数计算数据框的列数,该函数的参数为数据框名称。

3、使用nrow()函数计算数据框的行数,该函数的参数为数据框名称。

4、输出结果,可以使用print()函数或直接在控制台中查看结果。

1、数据的获取

11从excel中读取数据

需要加载包,通常有两种包

library(readxl)

library(readxl) # 读取数据,返回值是dataframe() mydata <- read_xlsx("D:/test/testdataxlsx",sheet = 1) print(mydata$ID) class(mydata)

library(openxlsx)

library(openxlsx) mydata <- readxlsx("D:/test/testdataxlsx",sheet = 1)

12从CSV文件中获取

什么是CSV文件 ?:Comma-Separated Values,中文叫,逗号分隔值或者字符分割值,其文件 以纯文本的形式存储表格数据 。该文件是一个字符序列,可以由任意数目的记录组成,记录间以某种换行符分割。每条记录由字段组成,字段间的分隔符是其他字符或者字符串。所有的记录都有完全相同的字段序列,相当于一个结构化表的纯文本形式。

个人更加偏好csv格式的文件。

用文本文件、excel等软件都可以打开CSV文件。

读取csv中的数据

数据准备

许多实际情况中统计假设(假定观测数据抽样自正态分布或者其他性质较好的理论分布)并不一定满足,比如数据抽样于未知或混合分布、样本量过小、存在离群点、基于理论分布设计合适的统计检验过于复杂且数学上难以处理等情况,这时基于随机化和重抽样的统计方法就可派上用场。

置换检验的定义

置换检验(Permutation test),也称随机化检验或重随机化检验,是Fisher于20世纪30年代提出的一种基于大量计算(computationally intensive),利用样本数据的全(或随机)排列,进行统计推断的方法,因其对总体分布自由,应用较为广泛,特别适用于总体分布未知的小样本资料,以及某些难以用常规方法分析资料的假设检验问题。

置换检验的原理

1、提出原假设,比如XX处理后结果没有变化

2、计算统计量,如两组的均值之差,记作t0

3、将所有样本放在一起,然后随机排序进行分组,再计算其统计量t1

4、重复第3步骤,直至所有排序可能性都齐全(比如有A组有n样本,B组有m样本,则总重复次数相当于从n+m中随机抽取n个的次数),得到一系列的统计量(t1-tn)

5、最后将这些统计量按照从小到大排序,构成抽样分布,再看t0是否落在分布的置信区间内(如95%置信区间),这时候可计算一个P值(如果抽样总体1000次统计量中大于t0的有10个,则估计的P值为10/1000=001),落在置信区间外则拒绝原假设

6、如果第3步骤是将所有可能性都计算了的话,则是精确检验;如果只取了计算了部分组合,则是近似结果,这时一般用蒙特卡罗模拟(Monte Carlo simulation)的方法进行置换检验

7、置换检验和参数检验都计算了统计量,但是前者是跟置换观测数据后获得的经验分布进行比较,后者则是跟理论分布进行比较。

请牢记:置换检验都是使用伪随机数来从所有可能的排列组合中进行抽样(当做近似检验时)。因此,每次检验的结果都有所不同。

coin包提供了一个进行置换检验的一般性框架。通过该包,你可以回答如下问题。

响应值与组的分配独立吗?

两个数值变量独立吗?

两个类别型变量独立吗?

表12-2列出来的每个函数都是如下形式:

function_name(formula, data, distribution=)

其中:

 formula描述的是要检验变量间的关系。示例可参见表12-2;

 data是一个数据框;

 distribution指定经验分布在零假设条件下的形式,可能值有exact,asymptotic和

approximate。

若distribution = "exact",那么在零假设条件下,分布的计算是精确的(即依据所有可能的排列组合)。当然,也可以根据它的渐进分布(distribution = "asymptotic")或蒙特卡洛重抽样(distribution = "approxiamate(B = #)")来做近似计算,其中#指所需重复的次数。

distribution = "exact"当前仅可用于两样本问题。

传统t检验表明存在显著性差异(p < 005),而精确检验却表明差异并不显著(p > 0072)。

第7章我用自己的数据进行了t检验,对比一下传统t检验和置换检验,结果如下:

两种检验方式下结果都是显著的

Wilcoxon-Mann-Whitney U检验

coin包规定所有的类别型变量都必须以因子形式编码。

wilcoxtest()默认计算的也是精确分布。

K样本检验的置换检验

通过chisq_test()或cmh_test()函数,我们可用置换检验判断两类别型变量的独立性。 当数据可根据第三个类别型变量进行分层时,需要使用后一个函数。若变量都是有序型,可使用lbl_test()函数来检验是否存在线性趋势。

卡方独立性检验

卡方独立性检验的置换检验

你可能会有疑问,为什么需要把变量Improved从一个有序因子变成一个分类因子?(好问题!)这是因为,如果你用有序因子,coin()将会生成一个线性与线性趋势检验,而不是卡方检验。

结果解读:两种检验下p值都是小于005,说明Treatment和Improved之间相互不独立

自己数据的演示

结果解读:p值均为1,表明nitrogen和variety相互独立。

spearman_test()函数提供了两数值变量的独立性置换检验。

当处于不同组的观测已经被分配得当,或者使用了重复测量时,样本相关检验便可派上用场。

对于两配对组的置换检验,可使用wilcoxsign_test()函数;多于两组时,使用friedman_test()函数。

自己数据演示

lmPerm包可做线性模型的置换检验。比如lmp()和aovp()函数即lm()和aov()函数的修改版,能够进行置换检验,而非正态理论检验。

lmp()和aovp()函数的参数与lm()和aov()函数类似,只额外添加了perm =参数。

perm =选项的可选值有"Exact"、"Prob"或"SPR"。Exact根据所有可能的排列组合生成精确检验。Prob从所有可能的排列中不断抽样,直至估计的标准差在估计的p值01之下,判停准则由可选的Ca参数控制。SPR使用贯序概率比检验来判断何时停止抽样。注意,若观测数大于10,perm = "Exact"将自动默认转为perm = "Prob",因为精确检验只适用于小样本问题。

简单线性回归的置换检验

R语言实战的例子:

多项式回归的置换检验

R语言实战的例子:

自己数据集的例子:

R语言实战的例子:

自己数据集的例子:

当两种方法所得结果不一致时,你需要更加谨慎地审视数据,这很可能是因为违反了正态性假设或者存在离群点。

R语言实战的例子:

自己数据集的例子:

R语言实战的例子:

自己数据集的例子:

R语言实战的例子:

自己数据集的例子:

值得注意的是,当将aovp()应用到方差分析设计中时,它默认使用唯一平方和法(SAS也称为类型III平方和)。每种效应都会依据其他效应做相应调整。R中默认的参数化方差分析设计使用的是序贯平方和(SAS是类型I平方和)。每种效应依据模型中先出现的效应做相应调整。对于平衡设计,两种方法结果相同,但是对于每个单元格观测数不同的不平衡设计,两种方法结果则不同。不平衡性越大,结果分歧越大。若在aovp()函数中设定seqs = TRUE,可以生成你想要的序贯平方和。

你可能已经注意到,基于正态理论的检验与上面置换检验的结果非常接近。在这些问题中数据表现非常好,两种方法结果的一致性也验证了正态理论方法适用于上述示例。

当然,置换检验真正发挥功用的地方是处理非正态数据(如分布偏倚很大)、存在离群点、样本很小或无法做参数检验等情况。不过,如果初始样本对感兴趣的总体情况代表性很差,即使是置换检验也无法提高推断效果。

置换检验主要用于生成检验零假设的p值,它有助于回答“效应是否存在”这样的问题。不过,置换方法对于获取置信区间和估计测量精度是比较困难的。幸运的是,这正是自助法大显神通的地方。

所谓自助法,即从初始样本重复随机替换抽样,生成一个或一系列待检验统计量的经验分布。 无需假设一个特定的理论分布,便可生成统计量的置信区间,并能检验统计假设。

倘若你假设均值的样本分布不是正态分布,该怎么办呢?可使用自助法。

(1)从样本中随机选择10个观测,抽样后再放回。有些观测可能会被选择多次,有些可能一直都不会被选中。

(2)计算并记录样本均值。

(3)重复1和2一千次。

(4)将1000个样本均值从小到大排序。

(5)找出样本均值25%和975%的分位点。此时即初始位置和最末位置的第25个数,它们就限定了95%的置信区间。

boot包扩展了自助法和重抽样的相关用途。你可以对一个统计量(如中位数)或一个统计量向量(如一列回归系数)使用自助法。

一般来说,自助法有三个主要步骤。

(1)写一个能返回待研究统计量值的函数。如果只有单个统计量(如中位数),函数应该返回一个数值;如果有一列统计量(如一列回归系数),函数应该返回一个向量。

(2)为生成R中自助法所需的有效统计量重复数,使用boot()函数对上面所写的函数进行处理。

(3)使用bootci()函数获取第(2)步生成的统计量的置信区间。

主要的自助法函数是boot(),它的格式为:

bootobject <- boot(data=, statistic=, R=, )

参数见下表:

boot()函数调用统计量函数R次,每次都从整数1:nrow(data)中生成一列有放回的随机指标,这些指标被统计量函数用来选择样本。统计量将根据所选样本进行计算,结果存储在bootobject中。

你可以用bootobject t0和bootobject t来获取这些元素。

一旦生成了自助样本,可通过print()和plot()来检查结果。如果结果看起来还算合理, 使用bootci()函数获取统计量的置信区间。格式如下:

bootci(bootobject, conf=, type= )

type参数设定了获取置信区间的方法。perc方法(分位数)展示的是样本均值,bca将根据偏差对区间做简单调整。

回归的R平方值

1000次自助抽样

输出结果

结果可视化

95%的置信区间获取

回归系数向量函数

自助抽样1000次

获得车重和发动机排量95%的置信区间

置换检验和自助法并不是万能的,它们无法将烂数据转化为好数据。当初始样本对于总体情况的代表性不佳,或者样本量过小而无法准确地反映总体情况,这些方法也是爱莫能助。

参考资料:

向量是 R 语言中最基本的数据类型,在 R 中没有单独的标量(例如 1 本质上是 c(1)) 。

R 中可以用 = 或者 <- 来进行赋值 , <-的快捷键是 alt + - 。

R的下标是从1开始的,和python等不同(python四从0开始的)

当然我们也可以用逻辑进行筛选,例如

负数下标表示不选这个这些下标,例如:

c() 可以合并向量,例如

向量有个比较有趣的性质,当两个向量进行 *** 作时,如果长度不等, 长度比较短的一个会复制自己直到自己和长的一样长。

a 自动变成了 c(3,4,3,4) 然后与b相加 , 得到了下面的结果。

遇到不懂得函数,可以用help("函数")查看函数用法。

矩阵,从本质上来说就是多维的向量,我们来看一看 我们如何新建一个矩阵。

可以看到向量元素变为矩阵元素的方式是按列的,从第一列 到第二列,如果我们想按行输入元素,那么需要加入 byrow = TRUE 的参数:

与向量相似,我们可以用下标来筛选矩阵, 例如:

a[行,列]

当我们对两个矩阵相乘,我们得到的结果是 对应元素两两相乘的结果,例如:

而这不是我们想要的矩阵乘法,在 R 中我们在乘法旁边加两个 百分号来做矩阵乘法:

此外,我们可以用 t() 来求矩阵的转置 , 用 solve() 来求矩阵的逆。

数据框类似矩阵,与矩阵不同的是,数据框可以有不同的数据类型。 一般做数据分析,我们把一个类似 excel 的表格读入 R ,默认的格式 就是数据框 , 可见数据框是一个非常重要的数据结构。

一般来说我们需要分析的数据,每一行代表一个样本,每一列代表一个 变量。

下面我们用 R 内置的数据集 iris 来看一看数据框的使用。

我们用 data 函数调入了 iris 这个数据集 , 然后用 head 函数来看一看这个数据 的前几行 , 可以看到有 sepal 的长度,宽度,petal 的长度和宽度,还有一个变量 Species 来描述样本的类别。

我们可以用 summary 函数来对数据集做大致的了解。

可以直观地看到每个变量的信息,对于几个数值变量,我们可以看到最小值,中位数等等统计信息。而对于 Species 这个分类变量,我们看到的是计数信息。

筛选数据框与矩阵相似,都可以通过数字下标来获取子集,不同地是因为数据框有不同的列名,我们也可以通过列名来获取某一特定列,例如:

我们可以用 names() 函数来获取数据框的列名

并可以通过为其赋值改变列的名字。

列表是一种递归式的向量,我们可以用列表来存储不同类型的数据,比如:

列表有多种索引方式,可以用如下方式获取。

今天我们实验的对象就是一组从原始 R 进化出来的工具链 Tidyverse , 它是由 Hadley Wickham 主导开发的一系列 R 包的集合。 Tidyverse 继承了R语言进行快速统计分析的优势 , 并实现了一些新的理念 , 例如 magrittr 包中的管道 *** 作 , 让线性嵌套的函数组合变得更加清晰易懂;可视化方面中的 ggplot ,使绘图变成搭积木式的图层叠加。

这样的小发明有的改变了分析的运作方式 , 有的改变了使用者的认知方式 , 聚在一起形成了一种新的数据分析的生态链 。具体来看 , Tidyverse 有如下核心组件:

mpg 数据集是刻画不同汽车的排放状况的一个数据集, 总过有 234 个样本 , 11 个变量 。 这 11 个变量分别是:

manufacture: 制造商

model: 车型

dispel: 汽车排放量

year: 制造年度

cyl: 排气管数量

trans: 排放类型

drv: 驱动方式

cty: 每公里耗油量(城市道路)

hwy: 每公里耗油量(高速路)

fl: 油的种类

class: 车的类型

更多数据相关信息可以通过 help(mpg) 指令获取。

在属性映射中加入 color=class 参数后 , 我们可以看到每个点的汽车对应的类型被用 不同颜色表现了出来 , 对于散点图 , 还有 size(大小) , shape(形状) 等等参数 可以用于确定点的属性。

对于条形图的y轴就是数据框中原本的数值时,必须将geom_bar()函数中stat(统计转换)参数设置为’identity’,即对原始数据集不作任何统计变换,而该参数的默认值为’count’,即观测数量。

以上就是关于《R语言实战》自学笔记71-主成分和因子分析全部的内容,包括:《R语言实战》自学笔记71-主成分和因子分析、r语言 如何获取某一列的数值范围、R语言基本数据分析等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9803985.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存