红衣佳人白衣友,朝与同歌暮同酒。世人谓我恋长安,其实只恋长安某。——殊同 《我亦好歌亦好酒》
一、主成分分析(PCA)是一种数据降维技巧,它能将大量相关变量转化为一组很少的不相关变量,这些无关变量称为主成分。主成分是观测变量的线性组合形成线性组合的权重(就是各个变量的系数)通过最大化各主成分所解释的方差来获得,同时还要保证各主成分间不相关。R基础安装包中的主成分分析函数:princomp()
人们希望在进行定量分析的过程中,涉及的变量较少,得到的信息量较多。主成分分析正是适应这一要求产生的,是解决这类题的理想工具。 就是说有一堆乱七八糟的玩意儿,你整不明白,那就用它被,一会给你整几类不相关的堆堆儿~~你一瞅利利索索的~
ps:你让它自己玩,自己找,没人看着,当然是无监督了。
二、探索性因子分析(EFA)是一系列用来发现一组变量的潜在结构的方法,通过寻找一组更小的、潜在的或隐藏的结构来解释已观测到的、显式的变量间的关系。因子被当做是观测变量的结构基础或“原因”,而不是它们的线性组合。因子间可能会有相关性。因子分析需要5~10倍于变量数的样本数。R基础安装包中的EFA函数:factanal()。
做社会实践问卷调查可以用它,说不定拿个先进个人。记得感谢我,老铁~~写报告的时候致谢我~~
这个算法一系列用来发现一组变量的潜在结构的方法,通过寻找一组更小 的、潜在的或隐藏的结构来解释已观测到的、变量间的关系。
狐朋狗友一大堆,谁最能说明你们是狐朋狗友~~哎~这人吊儿郎当的合适,这人染头发五颜六色的合适,这人面相合适,这三人就能说明你们的群体了,这是叫EFA的人找出来的,他说你们胡朋友够~别找我。这锅我不背~~
三、psych包中的PCA和EFA:
principal() 含多种可选的方差旋转方法的主成分分析
fa() 可用主轴、最小残差、加权最小平方或最大似然法估计的因子分析
fa.parallel() 含平行分析的碎石图
factor.plot() 绘制因子分析或主成分分析的结果
fa.diagram() 绘制因子分析或主成分的载荷矩阵
scree() 因子分析和主成分分析的碎石图
步骤:
数据预处理:确保数据中没有缺失值(PCA和EFA都根据观测变量间的相关性来推导结果)
选择因子模型:PCA还是EFA。如果是EFA,还需要选择一种估计因子模型的方法(比如最大似然估计)
判断要选择的主成分/因子数目;
选择主成分/因子;
旋转主成分/因子
解释结果;
计算主成分或因子得分
四、主成分分析
PCA的目标是用一组较少的不相关变量代替大量相关变量,同时尽可能保留初始变量的信息。主成分是观测变量的线性组合。第一主成分对初始变量集的方差解释性最大,第二主成分排第二,且与第一主成分正交(不相关)等等;
使用数据集USJudgeRating。
判断主成分个数:
准则:
根据先验经验和理论知识判断主成分个数;
根据要解释变量方差的积累值的阈值来判断需要的主成分个数(比如我要解释响应变量方差的95%,那我就增加主成分个数直至达到这一阈值);
通过检查变量间k x k的相关系数矩阵来判断保留的主成分个数(相关性强的变量合并成一个主成分)
方法:
最常见的是基于特征值的方法。每个主成分都与相关系数矩阵的特征值相关联,第一主成分与最大的特征值相关联,第二主成分与第二大的特征值相关联,等等。Kaiser-Harris准则建议保留特征值大于1的主成分。特征值小于1的成分对方差的解释度甚至小于单个变量。
Cattell碎石检验则绘制了特征值与主成分的图形,图形变化最大处之上的主成分都可保留;
进行模拟,依据与初始矩阵相同大小的随机数据矩阵来判断要提取的特征值。若基于真实数据的某个特征值大于一组随机数据矩阵相应的平均特征值,那么该主成分可以保留,该方法称为平行分析。
代码:
利用fa.parallel()函数可以同时对三种特征值判断准则进行评价:fa='pc',pc的意思是主成分?n.iter=100肯定是说随机数据矩阵模拟了100次。
注意fa='pc'处pc是小写,书上写成了大写,是不对的。上述代码执行后得到的图如下所示:
图中展示了基于观测特征值的碎石检验(蓝色)、根据100个随机数据矩阵推导出来的特征值均值(红色)。书上还有y=1水平线,我这里没有啊?自己写个abline(h=1)加上吧。
从图中可以看出:碎石检验图形最大变化处上面只有一个成分;特征值大于随机模拟数据的也只有一个主成分;特征值大于1的也只有一个主成分。所以这一组数据使用一个主成分即可保留数据集的大部分信息。
提取主成分:
principal()函数可以根据原始数据或相关系数矩阵做主成分分析,格式为:principal(r, nfacotrs=, rotate=, scores=)。其中,r是相关系数矩阵或原始数据矩阵;nfactors设定主成分数,默认是1;rotate指定旋转的方法,默认是最大方差旋转;scores设定是否需要计算主成分得分,默认不计算。
例1:下列代码获得第一主成分:
PC1栏包含了成分载荷,指观测变量与主成分的相关系数,如果有多个主成分,还会有PC2,PC3等。成分载荷(component loadings)可用来解释主成分的含义;
h2栏指成分公因子方差,主成分对每个变量的方差解释度;
u2栏指成分唯一性,就是方差不能被主成分解释的比例。显然u2=1-h2;
比书上多了一列com,可能是指变量参与了哪个主成分的线性组合吧?
SS loadings包含了与主成分相关联的特征值,指的是与特定主成分相关联的标准化后的方差值(这个需要再深入理解一下)
Proportion var行表示的是每个主成分对整个数据集的解释程度。上图中的结果表明第一主成分解释了11个变量92%的方差。
例2:这个例子使用的是相关系数矩阵,而非原始数据集。n.obs选项设定样本大小,书上写了302应该是搞错了,数据集是305个女孩的身体指标。不过得到的图几乎没什么区别:
结果如下所示,表明应该提取两个主成分:
提取主成分代码:
主成分旋转:旋转是一系列将成分载荷阵变得更容易解释的数学方法,它们尽可能地对成分去噪。旋转方法有两种:使选择的成分保持不相关(正交旋转)和让它们变得相关(斜交旋转)。最流行的正交旋转是方差极大旋转,它试图对载荷阵的列进行去噪,使得每个成分只是由一组有限的变量来解释(即载荷阵每列只有少数几个很大的载荷,其他都是很小的载荷)。代码如下:
载荷阵中列名从PC变成了RC,表示成分被旋转。从RC1,RC2两列可以看出,第一主成分主要由前四个变量来解释(长度变量),第二主成分主要由后四个变量来解释(容量变量)。注意对变量的解释性不变(h2和u2栏),且各成分的方差解释度趋同(差别变小)。
获取主成分得分:利用principal()函数,可以获得每个调查对象在该主成分上的得分。代码如下:
没啥的,就是把score选项的值变成了TRUE。值得注意的是,主成分得分存储在principal()函数返回对象的scores元素中。
这时就可以获得律师与法官接触频数与法官评分间的相关系数了:
为什么score和scores都能得到一样的结果...
如果主成分分析是基于相关系数矩阵而非原始数据时,无法获取每个观测的主成分得分,只能得到计算主成分得分的系数:
那么针对一个特定的观测,她的主成分得分就是:
PC1 = 0.28*height + 0.30*arm.span + 0.30*forearm...
PC2 = -0.05*height - 0.08*arm.span - 0.09*forearm...
注意:两个等式都假定身体测量指标已经标准化(mean=0,sd=1)。实际中,常把第一主成分看作前四个变量标准化得分的均值,第二主成分看作后四个变量标准化得分的均值。
五、探索性因子分析:EFA的目标是通过发掘隐藏在数据下的一组较少的、更为基本的无法观测的变量,来解释一组可观测变量的相关性。这些虚拟的、无法观测的变量称作因子(每个因子被认为可解释多个观测变量间共有的方差,所以其实应该被称作公公因子),模型的形式为:Xi = a1F1 + a2F2 + ... + apFp + Ui,其中Xi是第i个可观测变量,Fj是公共因子(因子数应该小于变量数,否则做EFA就没意义了),Ui是Xi变量独有的部分,无法被公共因子解释,ai可认为是每个因子对复合而成的可观测变量的贡献值。看来我对EFA的理解是对的:把可观测变量拆分成几个因子的线性组合,而多个变量的因子组成可以有重合。本部分使用ability.cov数据集,该数据集提供了变量的协方差矩阵,可用cov2vor()函数将其转化为相关系数矩阵:
EFA步骤如下:
判断需提取的公共因子数:
fa='both'时,因子图形将会同时展示主成分和公共因子分析的结果。图如下所示:
图中关于PCA的结果,碎石检验和平行分析表明可以使用一个主成分,而根据特征值大于1判断,可以使用两个主成分,此时高估因子书通常比低估因子书的结果好;
EFA结果表明需要两个因子。注意对于EFA来说,Kaiser-Harris准则的特征值数大于0,而不是1。
提取公共因子:
使用fa()函数,fa(r, nfactors=, n.obs=, rotate=, scores=, fm=),其中:
r是相关系数矩阵或者原始数据矩阵;
nfacotrs是设定提取的因子数(默认1);
n.obs是观测数(r为相关系数矩阵时需要填写);
rotate设定旋转方法(默认互变异数最小法);
scores设定是否计算因子得分(默认不计算);
fm设定因子化方法(默认极小残差法)
提取公共因子的方法包括:
最大似然法(ml,统计学家喜欢用);
主轴迭代法(pa,最大似然法不收敛时,考虑用这个);
加权最小二乘法(wls);
广义加权最小二乘法(gls);
最小残差法(minres)。
代码:
本例使用了主轴迭代法(fm='pa')提取未旋转的因子。可以看到,两个因子解释了6个心理学测验60%的方差(cumulative var)。为了更好地解释载荷阵的意义,需要使用因子旋转。
因子旋转:
正交旋转:
此时可以看到,阅读和词汇在PA1中载荷较大,画图、积木图案和迷宫在PA2上载荷较大,general在两个因子上载荷较为平均,表明存在一个语言智力因子和一个非语言智力因子。
使用正交旋转将人为地强制两个因子不相关。斜交转轴法允许两个因子相关:
斜交旋转:
需要安装包GPArotation。等有网了装上。
正交旋转与斜交旋转的差异:
对于正交旋转,因子分析的重点在于因子结构矩阵(变量与因子的相关系数);而对于斜交旋转,因子分析会考虑三个矩阵:因子结构矩阵、因子模式矩阵和因子关联矩阵;
因子模式矩阵及标准化的回归系数矩阵,列出了因子预测变量的权重;因子关联矩阵即因子相关系数矩阵;上图中,PA1和PA2栏中的值组成了因子模式矩阵,他们是标准化的回归系数,而不是相关系数;
因子关联矩阵显示两个因子的相关系数为0.57,相关性很大。如果因子间关联性较低,可能需要使用正交旋转来简化问题;
因子结构矩阵(或称因子载荷阵)没有列出,可以使用公式F=P*Phi得到,其中F是因子载荷阵,P是因子模式矩阵,Phi为因子关联矩阵。因子结构矩阵中是变量与因子间的相关系数。与正交旋转得到的因子载荷阵相比,该载荷阵列噪音比较大,这是因为之前允许潜在因子相关。斜交方法得到的模型更符合真实数据。
绘图:使用factor.plot()或fa.diagram()函数可以绘制正交或者斜交结果的图形:
factor.plot(fa.promax, labels=rownames(fa.promax$loadings))
fa.diagram(fa.promax, simple=FALSE)。如果simple=TRUE,那么将仅显示每个因子下最大的载荷,以及因子间的相关系数。
因子得分:EFA并不那么关注计算因子得分。在fa()函数中添加score=TRUE选项即可获得因子得分。还可以得到得分系数,在返回对象的weights元素中:
因子得分是估计得到的,fa()函数使用的估计方法是回归方法
其他与EFA相关的包:
FactoMineR包提供了PCA和EFA方法,还包含潜变量模型;
FAiR包使用遗传算法来估计因子分析模型,增强了模型参数估计能力,能够处理不等式的约束条件;
GPArotation包提供了许多因子旋转方法;
nFactors包,提供了用来判断因子数目的复杂方法。
其他潜变量模型:除了EFA以外,还有其他的
检验先验知识的模型、处理混合数据类型(数值型和类别型)的模型、仅基于类别型多因素表的模型:
可以从一些先验知识开始,比如变量背后有几个因子、变量在引资上的载荷是怎样的、因子间的相关性如何,然后通过收集数据检验这些先验知识,这种方法称作验证性因子分析(CFA);CFA是结构方程模型(SEM)中的一种方法。SEM不仅可以假定潜在因子的数目以及组成,还能假定因子间的影响方式;可以将SEM看作是验证性因子分析(对变量)和回归分析(对因子)的组合,它的结果输出包含统计检验和拟合度指标。R中可以做CFA和SEM的包:sem, openMx, lavaan
ltm包可以用来拟合测验和问卷中各项目的潜变量模型,用于SAT和GRE等大规模标准化测试;
潜类别模型(潜在的因子被认为是类别型而非连续型)可通过FlexMix,lcmm,randomLCA和poLC包进行拟合;lcda包可以做潜类别判别分析,lsa可做潜在语义分析——一种自然语言处理中的方法;
ca包中的函数可做简单和多重对应分析,在二维和多维列联表中探索类别型变量的结构;
MDS可用来发现解释相似性和可测对象间距离的潜在维度,基础安装中的cmdscale()函数可做经典的MDS,MASS包中的isoMDS()函数可做非线性MDS,vagan包包含了可做两种MDS的函数。
你们玩儿吧~我要跑了~~
小编:胡言乱语的coco