判断主成分的个数
Kaiser-Harris准则 (特征值大于1)Cattell碎石检验 (弯折处以上)平行分析 (随机数据矩阵) fa.parallel( x , fa )#fa show the eigen values#类似于 plot( x,show.legend=TRUE,fa="both" )提取主成分
principal( r相关系数矩阵或原始数据矩阵 , nfactors主成分数 , rotate旋转的方法 , scores计算主成分得分 )#PC1 栏包含了成分载荷; h2 栏指成分公因子方差; u2 栏指成分唯一性:即方差无法被主成分解释的比例(1–h2)#SS loadings 行包含了与主成分相关联的特征值; # Proportion Var 行表示的是每个主成分对整个数据集的解释程度主成分旋转
旋转可以对成分去噪,方法有两种:使选择的成分保持不相关(正交旋转),和让它们变得相关(斜交旋转)。最流行的正交旋转是方差极大旋转varimax:对载荷阵的列进行去噪,使得每个成分只由一组有限的变量来解释,且人为地强制两个因子不相关如果想允许两个因子相关,可以使用斜交转轴法,比如promax principal( r , nfactors=2 , rotate="varimax")#列的名字都从 PC 变成了 RC ,以表示成分被旋转#注意两个主成分 (h2) 仍不相关,对变量的解释性不变#两个主成分旋转后的累积方差解释性(Cumulative Var PC2 = Cumulative Var RC2)没有变化#变的只是各个主成分对方差的解释度(Cumulative Var 中,成分1从58%变为44%,成分2从22%变为37%) 此时应该称它们为成分而不是主成分(因为单个主成分方差最大化性质没有保留)获取主成分得分
#从原始数据中获取成分得分principal(USJudgeRatings[,-1], nfactors=1, score=TRUE)#获取相关系数矩阵的主成分得分的系数principal(Harman23.cor$cov, nfactors=2, rotate="varimax")# PCi = ∑ ( RCij * Xj )#公式中PCi 或 RCi (成分被旋转)表示 观测变量与主成分的相关系数,等式假定测量指标都已标准化发掘隐藏在数据下的虚拟的、无法观测的变量,即公共因子,每个因子被认为可解释多个观测变量间共有的方差
Xi = ∑ ( ai * Fi ) + Ui
#例:心理学测验协方差矩阵 ability.cov,先用 cov2cor() 函数将其转化为相关系数矩阵covariances <- ability.cov$cov #提取协方差矩阵correlations <- cov2cor(covariances) #将其转化为相关系数矩阵判断需提取的公共因子数
#用 fa.parallel() 函数可判断需提取的因子数psych:: fa.parallel( correlations, n.obs=112, fa="both" )#当摇摆不定时,高估因子数通常比低估因子数的结果好#PC (pca) 和 FA (efa) 准则的区别在于: 对于EFA,Kaiser-Harris准则的特征值数大于0,而不是1提取公共因子
fa( r相关系数矩阵或者原始数据矩阵, nfactors设定提取的因子数 , n.obs=, rotate=, scores=, fm设定因子化方法 )#未旋转的主轴迭代因子法:fa(correlations, nfactors=2, rotate="none", fm="pa")#用正交旋转提取因子:fa(correlations, nfactors=2, rotate="varimax", fm="pa") #结果显示因子变得更好解释了 (成分对各变量载荷分布情况)#用斜交旋转提取因子:fa(correlations, nfactors=2, rotate="promax", fm="pa")# PA1 和 PA2 栏中的值组成了因子模式矩阵。它们是标准化的回归系数(即因子预测变量的权重),而不是相关系数。正交旋转和斜交旋转的不同:
对于正交旋转,因子分析的重点在于因子结构矩阵(变量与因子的相关系数)对于斜交旋转,因子分析会考虑三个矩阵:因子结构矩阵(变量与因子的相关系数)、因子模式矩阵和因子关联矩阵。因子模式矩阵即标准化的回归系数矩阵,它列出了因子预测变量的权重;因子关联矩阵即因子相关系数矩阵。 #因子结构矩阵(或称因子载荷阵)没有被列出来,但你可以使用公式 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(correlations, nfactors=2, rotate="promax", fm="pa") )#虽然斜交方法更为复杂,但模型将更符合真实数据。
使用 factor.plot() 或 fa.diagram() 函数,你可以绘制正交或者斜交结果的图形
fa.promax <- fa(correlations, nfactors=2, rotate="promax", fm="pa")#两因子图形factor.plot( fa.promax, labels=rownames( fa.promax$loadings ) )#两因子斜交旋转结果图fa.diagram( fa.promax, simple=FALSE )#若使 simple = TRUE ,那么将仅显示每个因子下最大的载荷,以及因子间的相关系数因子得分
相比PCA,EFA并不那么关注计算因子得分。在 fa() 函数中添加 score = TRUE 选项(原始数据可得时)便可很轻松地获得因子得分。另外还可以得到得分系数(标准化的回归权重),它在返回对象的 weights 元素中。
fa.promax$weights