因子分析

探索性因子分析(EFA)是一系列用来发现一组变量的潜在结构的方法。它通过寻找一组更小的、潜在的或隐藏的结构来解释已观测到的、显式的变量间的关系。例如,Harman74.cor包含了24个心理测验间的相互关系,受试对象为145个七年级或八年级的学生。假使应用EFA来探索该数据,结果表明276个测验间的相互关系可用四个学生能力的潜在因子(语言能力、反应速度、推理能力和记忆能力)来进行解释。

 

1 探索性因子分析

 

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

 

组可观测变量的相关性。这些虚拟的、无法观测的变量称作因子。(每个因子被认为可解释多个观测变量间共有的方差,因此准确来说,它们应该称作公共因子。)

 

虽然PCA和EFA存在差异,但是它们的许多分析步骤都是相似的。为阐述EFA的分析过程,

 

我们用它来对六个心理学测验间的相关性进行分析。112个人参与了六个测验,包括非语言的普通智力测验(general)、画图测验(picture)、积木图案测验(blocks)、迷宫测验(maze)、阅读测验(reading)和词汇测验(vocab)。我们如何用一组较少的、潜在的心理学因素来解释参与者的测验得分呢?

 

数据集ability.cov提供了变量的协方差矩阵,你可用cov2cor()函数将其转化为相关系数矩阵。

 

options(digits=2)     #设置小数点后保留两位小数

 

covariances <- ability.cov$cov     #获取协方差矩阵

 

correlations <- cov2cor(covariances)      #将协方差矩阵转化为相关系数矩阵

 

correlations

 

 14--因子分析_数据

 

与使用PCA相同,下一步工作为判断需要提取几个因子。

 

1.1 判断需提取的公共因子数

 

用fa.parallel()函数可判断需提取的因子数:

 

library(psych)

 

covariances <- ability.cov$cov

 

correlations <- cov2cor(covariances)

 

fa.parallel(correlations, n.obs=112, fa="both", n.iter=100,

 

              main="Scree plots with parallel analysis")

 

#n.obs=0意味着是一个数据矩阵/数据框。否则,用多少个案例来寻找相关性。fa="both",因子图形将会同时展示主成分和公共因子分析的结果。n.iter是要进行的模拟分析的数量

 

 14--因子分析_系数矩阵_02

 

结果分析:图中同时展示了PCA和EFA的结果。PCA结果建议提取一个或者两个成分,EFA建议提取两个因子。如果使用PCA方法,你可能会选择一个成分(碎石检验和平行分析)或者两个成分(特征值大于1)。当摇摆不定时,高估因子数通常比低估因子数的结果好,因为高估因子数一般较少曲解“真实”情况。观察EFA的结果,显然需提取两个因子。碎石检验的前两个特征值(三角形)都在拐角处之上,并且大于基于100次模拟数据矩阵的特征值均值。

 

1.2 提取公共因子

 

现在你决定提取两个因子,可以使用fa()函数获得相应的结果。fa()函数的格式如下:

 

fa(r, nfactors=, n.obs=, rotate=, scores=, fm=)

 

其中:

 

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

 

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

 

q n.obs是观测数(输入相关系数矩阵时需要填写);

 

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

 

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

 

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

 

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

 

本例使用主轴迭代法(fm="pa")提取未旋转的因子。代码如下:

 

fa <- fa(correlations, nfactors=2, rotate="none", fm="pa")

 

fa

 

 

 14--因子分析_14--因子分析_03

 

 14--因子分析_系数矩阵_04

 

结果分析:可以看到,两个因子解释了六个心理学测验60%的方差。不过因子载荷阵的意义并不太好解释,此时使用因子旋转将有助于因子的解释。

 

1.3 因子旋转

 

你可以使用正交旋转或者斜交旋转来旋转上节中两个因子的结果:

 

(1)用正交旋转提取因子

 

fa.varimax <- fa(correlations, nfactors=2, rotate="varimax", fm="pa")

 

fa.varimax

 

 

 14--因子分析_因子分析_05

 

结果分析:结果显示因子变得更好解释了。阅读reading和词汇vocab在第一因子上载荷较大,画图picture、积木图案blocks和迷宫maze在第二因子上载荷较大,非语言的普通智力测量在两个因子上载荷较为平均,这表明存在一个语言智力因子和一个非语言智力因子。h2栏指成分公因子方差,即主成分对每个变量的方差解释度。u2栏指成分唯一性,即方差无法被主成分解释的比例(1–h2)

 

(2)用斜交旋转提取因子

 

使用正交旋转将人为地强制两个因子不相关。如果想允许两个因子相关该怎么办呢?此时可以使用斜交转轴法,比如promax。

 

 fa.promax <- fa(correlations, nfactors=2, rotate="promax", fm="pa")

 

错误:Loading required namespace: GPArotationFailed with error:  ‘there is no package called ‘GPArotation’’Error in kaiser(loadings, rotate = "Promax", ...) :

 

 14--因子分析_系数矩阵_06

 

解决方法:

 

install.packages("GPArotation")

 

library(GPArotation)

 

fa.promax <- fa(correlations, nfactors=2, rotate="promax", fm="pa")

 

fa.promax

14--因子分析_数据_07

 

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

 

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

 

在结果中,PA1和PA2栏中的值组成了因子模式矩阵。它们是标准化的回归系数,而不是相关系数。注意,矩阵的列仍用来对因子进行命名(虽然此处存在一些争论)。你同样可

 

以得到一个语言因子和一个非语言因子。

 

因子关联矩阵显示两个因子的相关系数为0.57,相关性很大。如果因子间的关联性很低,你可能需要重新使用正交旋转来简化问题。

 

因子结构矩阵(或称因子载荷阵)没有被列出来,但你可以使用公式F = P*Phi很轻松地得

 

到它,其中F是因子载荷阵,P为因子模式矩阵,Phi为因子关联矩阵。下面的函数即可进行该乘法运算:

 

fsm <- function(oblique) {

 

  if (class(oblique)[2]=="fa" & is.null(oblique$Phi)) {

 

    warning("Object doesn't look like oblique EFA")

 

  } else {

 

    P <- unclass(oblique$loading)

 

    F <- P %*% oblique$Phi

 

    colnames(F) <- c("PA1", "PA2")

 

    return(F)

 

  }

 

}

 

对上面的例子使用该函数,可得:

 

fsm(fa.promax)

 

 14--因子分析_因子分析_08

 

结果分析:现在你可以看到变量与因子间的相关系数。将它们与正交旋转所得因子载荷阵相比,你会发现该载荷阵列的噪音比较大,这是因为之前你允许潜在因子相关。虽然斜交方法更为复杂,但模型将更符合真实数据。

 

使用factor.plot()或fa.diagram()函数,你可以绘制正交或者斜交结果的图形。来看以下代码:

 

factor.plot(fa.promax, labels=rownames(fa.promax$loadings))

 

 14--因子分析_数据_09

 

结果分析:数据集ability.cov中心理学测验的两因子图形。词汇和阅读在第一个因子(PA1)上载荷较大,而积木图案、画图和迷宫在第二个因子(PA2)上载荷较大。普通智力测验在两个因子上较为平均。

 

生成关联图形,可视化效果会更加明显,代码如下:

 

fa.diagram(fa.promax, simple=FALSE)

 

#若使simple = TRUE,那么将仅显示每个因子下最大的载荷,以及因子间的相关系数。

14--因子分析_因子分析_10

 

 

结果分析:这张图片能清楚的看到它们之间的相关系数,这类图形在有多个因子时十分实用。

 

1.4 因子得分

 

相比PCA,EFA并不那么关注计算因子得分。在fa()函数中添加score = TRUE选项(原始数据可得时)便可很轻松地获得因子得分。另外还可以得到得分系数(标准化的回归权重),它在返回对象的weights元素中。

 

对于ability.cov数据集,通过二因子斜交旋转法便可获得用来计算因子得分的权重:

 

fa.promax$weights

 

 14--因子分析_系数矩阵_11

 

总结:主成分分析(PCA)和探索性因子分析(EFA)两种方法。PCA在数据降维方面非常有用,它能用一组较少的不相关变量来替代大量相关变量,进而简化分析过程。EFA包含很多方法,可用来发现一组可观测变量背后潜在的或无法观测的结构(因子)。

 


作者:zhang-X​,转载请注明原文链接