主成分分析和因子分析

it2024-12-23  10

14.2 主成分分析

判断主成分的个数

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 (成分被旋转)表示 观测变量与主成分的相关系数,等式假定测量指标都已标准化

14.3 因子分析

发掘隐藏在数据下的虚拟的、无法观测的变量,即公共因子,每个因子被认为可解释多个观测变量间共有的方差

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
最新回复(0)