主成分分析和因子分析

14.2 主成分分析

判断主成分的个数

  1. Kaiser-Harris准则 (特征值大于1)
  2. Cattell碎石检验 (弯折处以上)
  3. 平行分析 (随机数据矩阵)
  •  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 行表示的是每个主成分对整个数据集的解释程度

主成分旋转

  1. 旋转可以对成分去噪,方法有两种:使选择的成分保持不相关(正交旋转),和让它们变得相关(斜交旋转)。
  2. 最流行的正交旋转是方差极大旋转varimax:
  3. 对载荷阵的列进行去噪,使得每个成分只由一组有限的变量来解释,且人为地强制两个因子不相关
  4. 如果想允许两个因子相关,可以使用斜交转轴法,比如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 栏中的值组成了因子模式矩阵。它们是标准化的回归系数(即因子预测变量的权重),而不是相关系数。

正交旋转和斜交旋转的不同:

  1. 对于正交旋转,因子分析的重点在于因子结构矩阵(变量与因子的相关系数)
  2. 对于斜交旋转,因子分析会考虑三个矩阵:因子结构矩阵(变量与因子的相关系数)、因子模式矩阵和因子关联矩阵。
  3. 因子模式矩阵即标准化的回归系数矩阵,它列出了因子预测变量的权重
  4. 因子关联矩阵即因子相关系数矩阵。
  • #因子结构矩阵(或称因子载荷阵)没有被列出来,但你可以使用公式 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

Guess you like

Origin blog.csdn.net/weixin_42683052/article/details/109206025