正在加载
请稍等

菜单

Home 码农菜园 数据分析 R学习笔记-12 主成分和因子分析
Home 码农菜园 数据分析 R学习笔记-12 主成分和因子分析

R学习笔记-12 主成分和因子分析

数据分析 by   阅读量 15,371

信息过度复杂是多变量数据最大的挑战之一,若数据集有20个变量,当试图理解各个变量与其他变量的关系时,一共需要考虑190对相互关系,这显然是不实际的。

主成分分析和探索性因子分析是两种用来探索和简化多变量复杂关系的常用方法。主成分分析(PCA)是一种数据降维技巧,可以将大量相关变量转化为一组很少的不相关变量,这些无关变量称为主成分;探索性因子分析(EFA)是一系列用来发现一组变量潜在结构的方法,通过寻找一组更小的、潜在的或隐藏的结构来解释已观测到的、显式的变量间的关系。

主成分分析模型和因子分析模型

12.1 R中的主成分和因子分析

R的基础安装包提供了PCA和EFA的函数,分别为princomp()和factanal(),此处详细介绍psych包中提供的函数,它们提供了比基础函数更丰富和有用的选项。

  • principal():含各种可选的方差旋转方法的主成分分析;
  • fa():可用主轴、最小残差、加权最小平方或最大似然法估计的因子分析;
  • fa.parallel():含平行分析的碎石图;
  • factor.plot():绘制因子分析或主成分分析的结果;
  • fa.diagram():绘制因子分析或主成分的载荷矩阵;
  • scree():因子分析和主成分分析的碎石图。

下图总结了主成分/探索性因子分析的分析步骤图,接下来将逐步介绍各个环节。

主成分/因子分析的分析步骤

12.2 主成分分析

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

数据集USJudgeRating包含了律师对美国高等法院法官的评分,数据框包含43个观测,12个变量,分别是:CONT(律师与法官的接触次数)、INTG(法官正直程度)、DMNR(风度)、DILG(勤勉度)、CFMG(案例流程管理水平)、DECI(决策效率)、PREP(审理前的准备工作)、FAMI(对法律的熟稔程度)、ORAL(口头裁决的可靠程度)、WRIT(书面裁决的可靠度)、PHYS(体能)、RTEN(是否值得保留)。能否用较少的变量来总结从INTG到RTEN的11个变量评估的信息?如果可以需要多少个?应该如何对它们进行定义?

判断主成分的个数

以下是一些可用于判断PCA中需要多少个主成分的准则:

  • 根据先验经验和理论知识判断主成分数;
  • 根据要解释变量方差的积累值的阈值来判断需要的主成分数;
  • 通过检查变量间k×k的相关系数矩阵来判断保留的主成分数。

最常见的是基于特征值的方法,每个主成分都与相关系数矩阵的特征值相关联,常见的方法有Kaiser-Harris准则、Cattell碎石检验和平行分析。使用fa.parallel()函数,可以同时对三种特征值判别准则进行评价。

结果中展示了基于观测特征值的碎石检验(由线段和x符号组成)、根据100个随机数据矩阵推导出来的特征值均值(虚线),以及大于1的特征值准则(y=1的水平线)。三种准则都表明选择一个主成分即可保留数据集的大部分信息,接下来将使用principal()函数挑选出相应的主成分。

判断所需主成分个数

提取主成分

principal()函数可以根据原始数据矩阵或相关系数矩阵做主成分分析,格式为:

其中r是相关系数矩阵或原始数据矩阵,nfactors设定主成分数(默认为1),rotate指定旋转的方法(默认最大方差旋转varimax),scores设定是否需要计算主成分得分(默认不需要)。使用以下代码可以获得USJudgeRatings的第一主成分。

此时输入的是没有CONT变量的原始数据,PCA将其自动转换为相关系数矩阵,指定获取一个未旋转的主成分。

在结果中,PC1栏包含了成分载荷,指观测变量与主成分的相关系数,如果一次提取多个主成分,将还会有PC2、PC3等。可以看出,PC1与每个变量都高度相关,也即它是一个可用来进行一般性评价的维度。

h2栏指成分公因子方差——主成分对每个变量的方差解释度;u2栏指成分唯一性——方差无法被主成分解释的比例(1-h2)。例如,体能(PHYS)80%的方差都可以用第一主成分来解释,20%则不能。相较之下,PHYS是用第一主成分表示性最差的变量。

SS Loadings行包含了与主成分相关联的特征值,指与特定主成分相关联的标准化方差值,如PC1的值对应10;Proportion Var行表示每个主成分对整个数据集的解释程度,在本例中,PC1解释了11个变量92%的方差。

再来一个结果不止一个主成分的例子。Harman23.cor数据集包含305个女孩的8项身体测量指标,而且数据集由变量间的相关系数组成,而不是原始数据。

与第一个例子类似,三种准则都建议选择两个主成分。以下代码从相关系数矩阵提取了前两个主成分,从结果中可以看到,第一主成分解释了身体测量指标58%的方差,而第二主成分解释了22%,两者总共解释了81%的方差。而对于高度变量,两者则总共解释了其88%的方差。

载荷矩阵解释了成分和因子的含义,第一主成分与每个身体测量指标都正相关,而第二主成分与前四个变量负相关,却和后四个变量正相关。当提取了多个成分时,对它们进行旋转可以使结果更具解释性。

主成分旋转

旋转是一系列将成分载荷矩阵变得更容易解释的数学方法,它们尽可能地对成分去噪,旋转的方法有两种:

  1. 使选择的成分保持不相关(正交旋转);
  2. 使选择的成分相关(斜交旋转)。

旋转方法也会依据去噪定义的不同而不同,以下代码使用方差极大旋转(对载荷矩阵的列进行去噪,使得每个成分只是由一组有限的变量来解释,即每列只有少数几个很大的载荷,其他都是很小的载荷)对身体测量数据进行旋转。

可以看到旋转之后,第一主成分主要由前四个变量来解释,第二主成分主要由后四个变量来解释,两个主成分仍不相关,对变量的解释性不变,两个主成分旋转后的累积方差解释型没有发生变化,仍然是81%。

获取主成分得分

我们的最终目标是用一组较少的变量替换一组较多的相关变量,因此还需要获取每个观测在主成分上的得分。

在美国法官评分例子中,我们根据原始数据中的11个评分变量提取了一个主成分,利用principal()函数可以获得每个调查对象在该成分上的得分。

当scores=TRUE时,主成分得分存储在principal()函数返回对象的scores元素中。还记得前面我们排除了CONT(律师与法官的接触次数)吗?不妨来看一下CONT和法官评分间的相关系数,结果显示,这两者之间关系甚小,这也是之前为什么只使用其他11个变量做主成分分析的原因。

如果没有原始数据,类似身体测量指标数据那样,只有各个变量之间的相关系数,将无法计算每个观测的主成分得分,但是可以计算每个主成分得分的计算系数。

主成分得分的计算系数

那么如果知道某个预测的具体各项数值,则可以使用以下公式得到各主成分得分:

PC1 = 0.28×height + 0.30×arm.span + 0.30×forearm + 0.29×lower.leg – 0.06×weight – 0.08×bitro.diameter – 0.10×chest.girth – 0.04×chest.width

PC2 = -0.05×height – 0.08×arm.span – 0.09×forearm – 0.06×lower.leg + 0.33×weight + 0.32×bitro.diameter + 0.34×chest.girth + 0.27×chest.width

两个等式都假定身体测量指标都已标准化(mean=0,sd=1)。可以看出,PC1近似为前四项指标的平均值,而PC2近似为后四项指标的平均值。

12.3 探索性因子分析

EFA的目标是通过发掘隐藏在数据下的一组较少的、更为基本的无法观测的变量,来解释一组可观测变量的相关性,这些虚拟的、无法观测的变量称作因子。每个因子被认为可解释多个观测变量间共有的方差,故也称作公共因子。

Harman74.cor包含了24个心理测验间的相互关系,测验对象为145个七年级或八年级的学生,用EFA来分析该数据,结果表明276个测验间的相互关系可用四个学生能力的潜在因子(语言能力、反应速度、推理能力和记忆能力)来进行解释。

以下使用EFA分析ability.cov数据集,其提供了六个心理学测验间的相关性,112人参与了六个测验(非语言的普通智力测验general、画图测验picture、积木图案测验blocks、迷津测验maze、阅读测验reading和词汇测验vocab)。

首先将ability.cov提供的变量协方差矩阵转化为相关系数矩阵,接下来即可使用和PCA类似的步骤进行EFA。

判断需提取的公共因子数

使用fa.parallel()函数判断需提取的因子数,fa=”both”表明同时给出主成分个数和因子个数,结果建议的因子数目为2。

判断所需因子个数

提取公共因子

已经决定了需要提取两个因子,可使用fa()函数获得相应的结果,格式如下:

其中r为相关系数矩阵或原始数据矩阵,nfactors指定提取的因子数(默认为1),n.obs为观测数(输入相关系数矩阵时需要填写),rotate指定旋转的方法(默认互变异数最小法),scores设定是否计算因子得分(默认不计算),fm设定因子化方法(默认极小残差法)。

与PCA不同,提取公共因子的方法很多,包括最大似然法(ml)、主轴迭代法(pa)、加权最小二乘法(wls)、广义加权最小二乘法(gls)和最小残差法(minres),以下代码中使用主轴迭代法提取未旋转的因子。可以看到,两个因子解释了六个心理学测验60%的方差,不过因子载荷矩阵的意义并不太好解释(存在负数),此时使用因子旋转将有助于因子的解释。

因子旋转

可以使用正交旋转或斜交旋转来进行因子旋转,接下来我们同时尝试两种方法并比较它们的异同。

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

使用正交旋转将人为地强制两个因子不相关,使用斜交旋转法则允许两个因子相关。

根据结果可以看出正交旋转和斜交旋转的不同:对于正交旋转,因子分析的重点在于因子载荷矩阵(变量和因子的相关系数);而对于斜交旋转,因子分析会考虑三个矩阵,因子载荷矩阵、因子模式矩阵和因子关联矩阵。

因子模式矩阵即PA1和PA2两列的值,它们是标准化的回归系数(而不是载荷矩阵中的相关系数);因子关联矩阵显示两个因子的相关系数为0.57,相关性很强,如果因子间的关联性很低,则可以使用正交旋转来简化问题。

因子载荷矩阵没有被列出来,但可以使用公式F=P×Phi计算,即因子载荷矩阵为因子模式矩阵乘以因子关联矩阵,使用以下代码计算:

斜交旋转的因子载荷矩阵计算结果

现在即可直观地看到变量和因子间的相关系数(即因子载荷矩阵),和正交旋转所得因子载荷矩阵相比,该矩阵的噪音比较大,因为斜交旋转允许了潜在因子相关。虽然斜交旋转更为复杂,但模型将更加符合真实数据。

可以使用factor.plot()函数绘制正交或斜交结果的图形。

factor.plot()函数绘制因子分析结果

或使用fa.diagram()函数绘制,如果simple=TRUE,那么将仅显示每个因子下的最大载荷,以及因子间的相关系数。

fa.diagram()函数绘制因子分析结果

因子得分

相比PCA,EFA并不那么关注计算因子得分。在fa()函数中添加score=TRUE选项(原始数据可得时)即可计算各观测的因子得分,另外还可以计算得分系数(标准化的回归权重),存储于返回对象的weights元素中(详细过程请参考主成分得分)。

29 2015-04

2条评论

  1. 匿名说道:

    大师!请收下我的膝盖!

  2. 匿名说道:

    写的很好

发表评论