R语言入门--第十三节(PCA与EFA分析)

在有一个很多变量(近百个)的大数据下,变量间的相互关系及潜在联系是令实验研究者头疼的事。而主成分分析(PCA,Principal Components Analysis)与探索性因子分析(EFA,Exploratory Factor Analysis)是用来探索和简化多变量复杂关系的常用方法。

主成分分析PCA

  • 概念:使数据降维,将大量相关变量转化为很少的不相关变量,这些无关变量称为主成分;而一个主成分是所有观测变量的线性组合而成。
  • 实验示例(较小数据为例):USJudgeRatings数据表为包含43个观测、12个变量的数据表,是对观测者的12个角度进行的评分。研究能否用较少的变量来总结后11个变量(第一个变量默认无关),去评价USJudge。步骤如下:

1、判断所需主成分的个数---绘图法

一般第一主成分PC1方差解释性最大,其次降低。通过原始数据相关系数矩阵特征值,合理确定主成分个数---

  • 首先绘制横轴为主成分数,纵轴为特征值的折线图
  • Cattell碎石检验:在碎石图变化最大处之上的主成分都可保留;
  • Kaiser-Harris准则:建议保留特征值(纵坐标)大于1的主成分;
  • 随机模拟:若基于真实数据的某个特征值大于一组随机数矩阵响应的平均特征值,则该主成分可以保留。
library(psych)
fa.parallel(USJudgeRatings[,-1],fa="pc",n.iter = 100,   
            show.legend = FALSE,main="Scree Plot witn parallel analysis")
abline(h=1)
# fa="pc"指定分析类型为主成分;
# n.iter = 100指定模拟100次
判断主成分数

结果如上图,×符号代表主成分,×符号的纵坐标即为对应特征值。三种准则(大转折以上的点、高于特征值1的点、高于虚线的点)都表明选择一个主成分即可保留数据集的大部分信息。

2、principal()函数提取主成分

pc <- principal(USJudgeRatings[,-1], nfactors=1)
# nfactors设定主成分数,默认为1;
# rotate参数指定旋转的方法,默认为最大方差选择法varimax;在两个主成分时凸显其意义。
# scores参数设定是否计算主成分得分,默认为不需要。

pc
# 查看分析结果
PCA分析结果

关于PCA分析及其结果(如上图)要点如下:

  • 因为PCA分析需要的是相关系数矩阵,所以我们提供的数据可以是原始数据,也可以直接是相关系数矩阵。针对本次示例为原始数据集,因此计算过程中原始数据会被自动转换为相关系数矩阵;
  • PC1栏为成分载荷,指观测变量与主成分的相关系数。若含有多个主成分,则会有PC2、PC3等。由PC1栏可看出,主成分与每个变量都高度相关。
  • h2栏为成分公因子方差,s所有主成分对每个变量的方差解释度;
  • u2栏为成分唯一性,即方差无法被主成分解释的比例(1-h2);
  • SS loadings 为与主成分相关联的那个特征值;
  • Proportion Var 表示每个成分对整个数据集的解释度。即第一主成分解释了11个变量92%的方差。

3、获取主成分得分

确定了可信的主成分能够代表全部变量后,就可以对每个观测的主成分指标进行打分了,这也是我们的最终目的。获取方法就是设定下principal()函数的参数score=TRUE,因为如上所述,该函数默认不计算主成分得分的。

pc <- principal(USJudgeRatings[,-1], nfactors=1,score=TRUE)
pc$scores
根据原始数据,算出主成分得分,去评加USJudge

  • 如果数据为相关系数矩阵,影响最大的是主成分计算;
    由于没有原始观测值得结果变量值,所以无法为观测评分;但是可以得出计算主成分的变量系数公式。然后基于此可以测一个观测原始变量的得分,然后计算各主成分的得分。

4、主成分旋转

  • 如果判断结果应选择两个主成分,主要值得注意的地方为主成分旋转。
    所谓旋转是将成分载荷变得更容易解释的数学方法,分为两组:正交选择(使选择的成分不相关)、斜交旋转(使选择的成分相关);rotate="varimax"方差极大正交旋转为默认参数,当有两个及以上主成分时,使得载荷列(PC1、PC2)每列只有少数几个很大的载荷,其它都是很小的载荷。
  • 以另一个实验示例,解释以上两方面:Harman23.cor数据集为包含了305个观测的8个变量两两间的相关系数矩阵,同样希望较少的变量能够替换原始的8个变量指标。
#1、判断主成分数
library(psych)
fa.parallel(Harman23.cor$cov, n.obs=302, fa="pc", n.iter=100,
            show.legend=FALSE, main="Scree plot with parallel analysis")
abline(h=1)
  • 当数据为相关系数矩阵时,需要额外加入n.obs= 参数,交代样本量。
  • 绘图结果如下图,三方面都建议选择两个主成分。


    image.png
#2、提取主成分
library(psych)
PC <- principal(Harman23.cor$cov, nfactors=2, rotate="none")
PC
PC0 <- principal(Harman23.cor$cov, nfactors=2, rotate="varimax")  
#rotate="varimax"为默认参数,所以可以不用说明

PC与PC0结果的不同很好地解释了 rotate主成分旋转的参数意义

  • PC结果 第一主成分的相关系数基本上都大于第二主成分。


    PC无旋转结果
  • PC0结果 第一主成分的相关系数与第二主成分各有高相关的变量


    PC0最大方差选择
#3、计算主成分系数公式
PC0$weights
round(PC0$weights, 2)
#得到上述的系数,可以测一个观测原始变量的得分,然后计算两主成分的得分
系数公式

在上例中,实际计算时可将第一主成分看作前四个变量标准化得分的均值;第二主成分看作后四个的均值。


探索性因子分析EFA

  • 概念:通过发掘隐藏在数据下的一组较少的、更为基本的无法观测的变量,来解释一组可观测变量的相关性。这些虚拟的、无法观测的变量称作因子(每个因子被认为可解释多个观测变量间的共有方差,因此也称作公共因子。)
    通俗理解参考文章
  • 实验示例:112个观测参与6个变量的评价,试图去寻找较少的、潜在的心理学因素(可解释)来解释测验得分;ability.cov 提供该数据的协方差矩阵。

0、数据预处理

options(digits=2)
library(psych)
ability.cov$cov  #为协方差矩阵
covariances <- ability.cov$cov
correlations <- cov2cor(covariances)
#转化为相关系数矩阵
correlations

1、判断需要提取的公共因子数

fa.parallel(correlations, n.obs=112, fa="both", n.iter=100,
            main="Scree plots with parallel analysis")
abline(h=0)
  • fa="" 参数可以为pcfaboth, 分别对应主成分分析、公共因子分析、二者都分析。上述代码为全分析。
  • pc主成分分析:碎石检验大转折之上、虚线模拟表明一个主成分即可;Kaiser-Harris特征值准则(>1)表明两个主成分即可;当出现上述情况时,高估因子数通常比低估因子数的结果好。
  • fa公共因子分析:三种结果都支持提取两个因子(此时的特征值标准为0)。


    pc与fa图

2、提取公共因子

fa <- fa(correlations, nfactors=2, rotate="none", fm="pa")
  • correlations为相关系数矩阵;
  • nfactors设置因子数;
  • rotate设置旋转方法,默认为互变异数最小法;此处设置未旋转,所以下图中的因子载荷阵的意义。
  • fm设置因子化方法,与PCA不同,EFA提取公共因子的方法很多。统计学家推荐最大似然法ml,此处作者使用了主轴迭代法pa
    未旋转因子分析

3、因子旋转

(1)正交旋转

  • 人为使得两因子不相关;与上面相比因子变得更好解释了,参考上面PCA的例子
fa.varimax <- fa(correlations, nfactors=2, rotate="varimax", fm="pa")
fa.varimax
正交旋转

(2)斜交旋转

fa.Promax <- fa(correlations, nfactors=2, rotate="Promax", fm="pa")
fa.Promax
  • 下图最下方为因子关联矩阵,即因子相关系数矩阵,为0.57,相关性很大。如果相关性低,则需要考虑正交旋转来简化问题。


    斜交旋转

虽然斜交较正交更为复杂,但模型会更符合数据。后续factor.plot()fa.diagram()可以就正交/斜交结果进行绘图分析(p310);相比PCA,EFA不那么关注因子得分,获得法同上PCA法。

总而言之,PCA法用一组较少的不相关变量替代大量相关变量;EFA法用来发现一组可观测变量背后潜在的或无法观测的结构。
参考教材《R语言实战(第2版)》

你可能感兴趣的:(R语言入门--第十三节(PCA与EFA分析))