虽然EFA和PCA有本质上的区别,但在分析流程上有相似之处。下面我们用ability.cov这个心理测量数据举例,其变量是对人的六种能力,例如阅读和拼写能力进行了测验,其数据是一个协方差矩阵而非原始数据。R语言中stats包中的factanal函数可以完成这项工作,但这里我们使用更为灵活的psych包。
一、选择因子个数
一般选择因子个数可以根据相关系数矩阵的特征值,特征值大于0则可选择做为因子。我们仍使用平行分析法(parallel analysis)。该方法首先生成若干组与原始数据结构相同的随机矩阵,求出其特征值并进行平均,然后和真实数据的特征值进行比对,根据交叉点的位置来选择因子个数。根据下图我们可以观察到特征值与红线的关系,有两个因子都位于红线上方,显然应该选择两个因子。
library(psych)
covariances = ability.cov$cov
correlations = cov2cor(covariances)
fa.parallel(correlations, n.obs=112, fa="fa", n.iter=100,show.legend=FALSE)
psych包中是使用fa函数来提取因子,将nfactors参数设定因子数为2,rotate参数设定了最大化方差的因子旋转方法,最后的fm表示分析方法,由于极大似然方法有时不能收敛,所以此处设为迭代主轴方法。从下面的结果中可以观察到两个因子解释了60%的总方差。Reading和vocabulary这两个变量于第一项因子有关,而picture、blocks和maze变量与第二项因子有关,general变量于两个因子都有关系。
fa = fa(correlations,nfactors=2,rotate="varimax",fm="pa" )
PA1 PA2 h2 u2
general 0.49 0.57 0.57 0.432
picture 0.16 0.59 0.38 0.623
blocks 0.18 0.89 0.83 0.166
maze 0.13 0.43 0.20 0.798
reading 0.93 0.20 0.91 0.089
vocab 0.80 0.23 0.69 0.313
PA1 PA2
SS loadings 1.83 1.75
Proportion Var 0.30 0.29
Cumulative Var 0.30 0.60
如果采用基本函数factanal进行因子分析,那么函数形式应该是factanal(covmat=correlations,factors=2,rottion='varimax'),这会得到相同的结果。此外,我们还可以用图形来表示因子和变量之间的关系factor.plot(fa,labels=rownames(fa$loadings))
三、因子得分
得到公共因子后,我们可以象主成分分析那样反过来考察每个样本的因子得分。如果输入的是原始数据,则可以在fa函数中设置score=T参数来获得因子得分。如果象上面例子那样输入的是相关矩阵,则需要根据因子得分系数来回归估计。
fa$weights
PA1 PA2 general 0.017702900 0.21504415 picture -0.007986044 0.09687725 blocks -0.198309764 0.79392660 maze 0.019155930 0.03027495 reading 0.841777373 -0.22404221 vocab 0.190592536 -0.02040749
参考资料:R in Action
没有评论:
发表评论