数据蛙数据分析每周作业数据乐园数据分析那点事儿🙈

"探索性因子分析EFA是个啥?"

2021-02-01  本文已影响0人  于饼喵

在很多研究中,我们需要的变量都不能或者不容易被直接测量,比如,假如我们要研究家庭环境和学校环境对学生成绩的影响,我们要如何测量家庭环境和学校环境?

虽然我们不能直接测量家庭环境和学校环境,但是我们可以通过一些相关的可测量变量来反映这些不可测量的变量,比如我们使用家庭年收入、父母学历等等指标来反映家庭环境;用学校排名,学校本科率,学生所在班级排名等指标来衡量学校环境

但是细心的小伙伴会发现,家庭收入和父母学历本身就存在相关性;学校排名和学校本科率也有相关性,因此我们可以推断肯定存在一个共同影响家庭收入、父母学历的因子;也会存在影响学校排名和本科率的因子,那我们如何找出所有影响或者支配所有变量的公共因子呢?

别急,现在就来给家人们详细讲讲因子分析~

(”因子分析分为验证性因子分析(CFA)探索性因子分析(EFA),本文讲的是因子分析皆为EFA“)


2.1 两类检验(KMO & Bartlett)

当我们的变量不独立或不相关的时候,其实就不存在上述栗子中的问题了,那我们也不可能找到影响所有变量的公共因子

因此,在做因子分析前我们需要进行KMO检验和Bartlett检验

KMO检验用于检验变量之间的偏相关性的,其取值为[0,1],当KMO统计量越接近于1时,变量之间的偏相关性越强

一般我们要求KMO统计量在0.5以上且越接近于1越好,如果KMO在0.5以下,那就要重新考虑是否要使用因子分析了

Bartlett用于检验变量之间是否独立,其原假设是变量之间相互独立,如果检验的P值小于0.05,那么我们就可以在95%的置信水平上拒绝原假设,认为变量间不独立

只要变量不独立,那我们当然可以进行因子分析

经过KMO和Bartlett检验后,我们发现变量确实相关而且不独立,因子分析终于可以大展拳脚了,那这个因子分析到底是怎么个操作方法呢?

万丈高楼平地起,我们还是要先弄清因子分析的模型

2.2 因子分析模型

2.2.1 数学模型

既然变量不独立而且相关,那他们肯定会受到一个或者多个潜在变量的影响,我们只要把这个潜在变量找出来,再用潜在的变量表示原来的变量,那我们对原始变量的研究就可以转化为对这个潜在变量的研究。因子分析模型也是这个道理

简单来说,因子分析模型就是用公共因子特殊因子表示原来的变量

假设我们现在对n个样本观察了p个指标,即X1,X2...Xp,公共因子用F表示,特殊因子用epsilon表示,那么因子分析模型就可以用以下数学模型表示
\begin{align} \\& X = \begin{bmatrix} X_{1} \\ X_{2} \\ ... \\ X_{p}\end{bmatrix},A = \begin{bmatrix} a_{11} \ a_{12} \ ... \ a_{1m} \\ a_{21} \ a_{22} \ ... \ a_{2m} \\ ... \\ a_{p1} \ a_{p2} \ ... \ a_{pm} \end{bmatrix} \\& \\& F = \begin{bmatrix} F_{1} \\ F_{2} \\ ... \\ F_{p}\end{bmatrix},e = \begin{bmatrix} \varepsilon_{1} \\ \varepsilon_{2} \\ ... \\ \varepsilon_{p}\end{bmatrix} \\& \\& X1 = a_{11}F1 \ + ... + \ a_{1d}F_{d} + \varepsilon_{1} \\& X2 = a_{21}F1 \ + ... + \ a_{2d}F_{d} + \varepsilon_{2} \\& ... \\& X_{p} = a_{p1}F1 \ + ... + \ a_{pd}F_{d} + \varepsilon_{p} \end{align}

以上的复杂式子,我们可以用X = AF + e表示,其模型描述如下:

  • X是原始可观测变量,维度是p【注意:此时的X进行了中心化处理,E(x)=0】
  • F代表公共因子,维度是d(d<p)
  • 系数a(loadings),又称“因子载荷”,需要求解;所有的a组成载荷矩阵A,载荷矩阵A不唯一
  • 公因子F的线性组合反映X
  • ℇ代表特殊因子;特殊因子仅仅与当前变量有关;例如ℇ1仅与X1有关,特殊因子之间相互独立,且E(ℇ)=0

【模型假设】

  • 各特殊因子之间相互独立

  • 各特殊因子与公共因子相互独立 Cov(F,ℇ) = 0

  • 各公共因子均值为0,方差为1且彼此独立

整个因子分析最重要的一步,就是要求出loadings,即因子载荷,围绕因子载荷,我们还要提一下以下几个重要的性质

2.2.2 重要性质

因子载荷矩阵有以下几个重要统计性质

  1. 因子的统计意义

因子a_ij是第i个变量与第就、个公共因子的相关系数,反映了第i个变量与第j个公共因子的相关重要性

说人话就是,a_ij越大,Xi与Fj的相关性越强呗~

  1. 共同度hi

h_{i}^2 = \sum_{j=1}^{m}a_{ij}^2 = a_{i1}^{2} + a_{i2}^{2} + ... + a_{ij}^{2}

对第i个变量Xi的共同度是指因子载荷矩阵第i行的因子的平方和,也可以理解成j个共同因子对第i个变量的方差的贡献度

对其两边求方差可以得到
\begin{align} \\& \quad Var(X) = a_{i1}^2Var(F_{1}) + ... + a_{im}^2Var(F_{m}) + Var(\varepsilon_{i}) \\& \quad Var(Fi) = 1 \\& \quad Cov(Fi,Fj) = 0 \\& \\& \quad then, \\& \\& \quad 1 = \sum_{j=1}^{m}a_{ij}^2 + \sigma_{i}^2 \end{align}
上式可以看出,所有的公共因子和特殊因子对变量Xi的贡献为1,因子平方和越靠近1,则特殊因子项的方差就会很小,因子分析的效果越好

  1. 公共因子方差贡献

因子载荷矩阵中第j列元素的因子平方和为Fj对所有Xi的方差贡献和,记为gj2,用于衡量Fj的相对重要性
g_{j}^{2} = \sum_{i=1}^{p}a_{ij}^2

说人话就是,因子载荷矩阵里每一行的因子的平方和代表共同度,每一列的因子的平方和代表方差贡献

那接下来就要讲讲这个因子载荷要咋求出来

2.2.3 因子载荷&因子旋转

估计因子载荷的方法很多,比如主成分分析,最大似然估计等,由于上一篇文章讲了PCA,我们这就用主成分分析法来求因子载荷

由于PCA再主成分分析一文里说的很详细,这里就不再阐述了,大体思路一致,关键在于找到相关系数矩阵对应的特征值和特征向量

主成分分析链接🔗

假设v是最终计算出来的特征值和特征向量,λ是特征值,那么因子载荷a可以由以下公式计算

整个计算方法基本和PCA一致,求出特征值,找出累计方差贡献大于70%的前几个λ,然后再计算出对应的特征向量v,然后再计算出因子载荷

得到因子载荷后,我们需要衡量因子是被哪几个指标支配【即不同的F是受哪些X影响】,一般因子载荷a>0.5则认为该指标是支配指标

比如,以下表格的数据可以看出F1受到x1,x2支配;而F2受到x3,x4支配

F1 F2
x1 0.7052 0.1024
x2 0.6905 0.2049
x3 0.3515 0.7906
x4 0.2516 0.8854

做完因子旋转后,因子载荷的平方值会向0和1两个方向分化,原本值大的因子载荷会更大,原本值小的因子载荷会更小,这样我们就可以把他们区分开

【栗子🌰】

说了辣么多,来个栗子吧,不然看的云里雾里的

假设变量的相关系数矩阵是R如下,求其因子,首先第一步我们求特征值λ
\begin{align} \\& R = \begin{bmatrix} \quad 1 \quad \frac{-1}{3} \quad 2/3 \\ \frac{-1}{3} \quad 1 \quad 0 \\ \frac{2}{3} \quad 0 \quad 1 \end{bmatrix} \end{align}
根据特征值和特征向量公式我们求的λ
\begin{align} \\& |R - \lambda E|X = 0 \quad then \quad \\& R-\lambda E = \begin{bmatrix} \quad 1-\lambda \quad \frac{-1}{3} \quad 2/3 \\ \frac{-1}{3} \quad 1 -\lambda \quad 0 \\ \frac{2}{3} \quad 0 \quad 1-\lambda \end{bmatrix} \\& |R-\lambda X| = (1-\lambda)^3 +0 + 0 -(1-\lambda)\frac{4}{9} - \frac{1}{9}(1-\lambda) -0 = 0 \\& \\& then, \\& \lambda_{1} = 1;\quad \lambda_{2} = 1- \frac{\sqrt{5}}{3} = 0.2546; \quad \lambda_{3} = 1 + \frac{\sqrt{5}}{3}=1.7454; \end{align}

计算出特征值后我们要计算累计方差贡献,计算如下

λ proportion cummulative
1.7454 58.18% 58.18%
1 33.33% 91.53%
0.2546 8.48% 100%

因为λ1和λ2大于1,而且累计方差占比大于70%,因此我们只选取2个因子,接下来就要计算其特征向量

将λ代回原矩阵计算
\begin{align} \\& For \quad \lambda = 1.7454; \\& \\& \begin{bmatrix} \frac{-\sqrt{5}}{3} \quad \frac{-1}{3} \quad \frac{2}{3} \\ \frac{-1}{3} \quad \frac{-\sqrt{5}}{3} \quad 0 \\ \frac{2}{3} \quad 0 \quad \frac{-\sqrt{5}}{3} \end{bmatrix} * \begin{bmatrix} x1 \\ x2 \\ x3 \end{bmatrix} = 0 \\& \\& \begin{bmatrix}\ 0 \quad \quad \quad 0 \quad \quad \quad 0 \\ -1 \quad -\sqrt{5} \quad \quad 0 \\ 0 \quad -2\sqrt{5} \quad -\sqrt{5}\end{bmatrix} * X = 0 \\& \\& -x_{1} - \sqrt{5}x_{2} = 0 \\&-2\sqrt{5}x_{2} - \sqrt{5}x_{3} = 0 \\& \\& x_{1}=\sqrt{5},\ then \ x_{2} = -1,\ x3 = 2 \\& \\& v = \begin{bmatrix} \sqrt{5} \\ -1 \\ 2\end{bmatrix} \quad standarized \quad \begin{bmatrix} 0.7071 \\ -0.3162 \\ 0.6325 \end{bmatrix} \\& \end{align}
上述例子求出了其中一个特征向量,其他特征向量计算方法也类似,求出后计算对应的因子
\begin{align} \\&\lambda_{1} = 1.7454; \quad \lambda_{2} = 1; \quad v_{1} = \begin{bmatrix} 0.7071 \\ 0.3162 \\ -0.6325 \\\end{bmatrix}; \quad v_{2} = \begin{bmatrix} 0 \\ 0.8165 \\ 0.4082 \\\end{bmatrix} \\& A = \begin{bmatrix} \sqrt{\lambda_{1}}v1,\sqrt{\lambda_{2}}v2 \end{bmatrix} = \begin{bmatrix} 0.9342 \quad \quad 0 \\ -0.4178 \quad 0.8165 \\ 0.8355 \quad 0.4082 \\\end{bmatrix} \end{align}
由此可得x与公共因子与特殊因子的模型数学表示如下:
\begin{align} \\& x1 = 0.9342*F_{1} + 0*F_{2} + \varepsilon_{1} \\& x2 = -0.4178*F_{1} + 0。8165*F_{2} + \varepsilon_{2} \\& x3 = 0.8355*F_{1} + 0。4082*F_{2} + \varepsilon_{3} \end{align}
其中F1对x的贡献度为1.7454,F2对x的贡献度为1

相信看完案例,大家应该能明白因子载荷矩阵是怎么计算出来的 了~

2.2.4 因子得分

因子得分其实就是指模型中因子F的取值,前面也说到,因子F是不能直接观察的理论变量,因此其取值只能借助于X来测量,一般F都要由X来线性表示
F_{j} = u_{j1}X_{j1} + u_{j2}X_{j2} + u_{jp}X_{jp} \quad j = 1,2,...,m
无意中看到有一篇文章写的是对因子得分的质疑,感觉他说的挺有道理的,而且因子得分好像用的也不多【可能只有我用的不多h】,因此这部分也不打算细讲

大概知道因子得分就是通过一种数学运算,将潜在因子F的值用X算出来了

【总结一下】

其实因子分析也就以下几步

  1. 进行统计检验,看数据是否适合做因子分析
  2. 标准化,以及计算相关系数矩阵
  3. 求解特征值和特征向量
  4. 计算方差贡献率与累计方差贡献率
  5. 确定与计算因子【包括因子旋转】

这咋一看,感觉和PCA那么像呢,因为我们使用的是主成分分析法求解的因子载荷,所有确实和PCA有点像,但实际上,EFA与PCA也是有很大区别的

2.2.5 EFA与PCA区别

2.3 EFA的python实现

EFA在spss、R、SAS、python等软件都能实现,由于现在喜欢用python的胖友比较多,那就来写下python下如何实现EFA吧~

【注意⚠️】这里没有进行相关统计检验

import pandas as pd
import sklearn.datasets
from factor_analyzer import FactorAnalyzer
import matplotlib.pyplot as plt

df = pd.read("your path")
n = 6 # 选一个尽量大的值
fa = FactorAnalyzer(n_factors=n,rotation="varimax") # 最大方差旋转
fa.fit(df)                                                                       # df不能有NAN df.dropna()
pd.Dataframe.from_records(fa.loadings_)             # 得到因子载荷loadings
ev,v = fa.get_eigenvalues()                                     # 得到特征值和特征向量

# 确定最优的n值
# draw scree plot 
xvals = range(1,df.shape[1]+1)
plt.scatter(xvals,ev)
plt.plot(xvals, ev)
plt.title("scree plot")
plt.xlabel("factor")
plt.ylabel("eigenvalues")
plt.grid
plt.show()

# 确定最优的n后,使用最优的n再进行因子分析

码字不易,喜欢的话给个赞和关注吧~😋

相关参考

[1] 对主成分分析中综合得分方法的质疑

[2] EFA的python实现

[3] Abdi, Hervé. "Factor rotations in factor analyses." Encyclopedia for Research Methods for the Social Sciences. Sage: Thousand Oaks, CA (2003): 792-795.

上一篇下一篇

猜你喜欢

热点阅读