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