您的位置  > 互联网

(每日一题)探索性因子分析:EFA

探索性因子分析 (EFA) 及其在 R 中的实现

与(PCA)类似,探索性因子分析(EFA)也是常用于探索和简化多变量复杂关系的常用方法。 它们之间既有联系,也有区别。 两者相比,如果期望用较小的一组不相关特征(主成分)来替代大量相关变量,通常会使用PCA; EFA 更多地用于发现一组可观察变量背后的潜在或不可观察的结构。 (因素)。

主成分分析和全民教育

在 中,通过降低多元数据的维数,将大量相关变量转化为一组少量不相关变量。 这些不相关的变量称为主成分(PC),它们是所有观测变量的线性组合。 形成线性组合的权重是通过最大化每个主成分解释的方差而获得的,同时确保主成分不相关(彼此正交)。 例如,PCA用于将30个环境变量(它们之间可能存在大量相关性或冗余)转换为几个不相关的主成分,并尽可能多地保留原始数据集中的信息。

与PCA相比,EFA是一系列用于发现一组变量的潜在结构的方法。 它通过寻找一组较小的、潜在的或隐藏的结构来解释变量之间观察到的和显性的关系。 。 EFA 的目标是通过发现数据下隐藏的一组更小、更基本的不可观察变量来解释一组可观察变量的相关性。 这些虚拟的、不可观测的变量称为因子(,F),因子被视为观测变量的结构基础或原因,而不是代表它们的线性组合。 例如,EFA用于探索30个环境变量的相互关系,这些变量可以用三个潜在因素(地理位置、气候环境和生物因素)来表示。

每个因素都被认为可以解释多个观察变量之间的共同方差,因此它们通常被称为公共因素。 误差(e)代表观测变量的方差,不能用因子来解释。 因素和误差都不能直接测量,而是从变量之间的相互关系中得出。

图例:主成分分析和因子分析模型图,显示可观测变量(X1 至 X5)、主成分(PC1、PC2)、因子(F1、F2)和误差(e1 至 e5)。

R 包 psych 的 EFA

接下来我们以R语言执行EFA的方法为例,以psych包的方法为例。

数据集

模拟生成了包含 200 个对象(行)和 6 个变量(列)的数据集 (X),然后使用 EFA 探索变量之间的关系。

注:在用于因子分析的真实数据中,不可能对如此少的变量进行因子分析。 这里的模拟数据集只是为了方便操作。

#模拟数据
library(mvtnorm)

N <- 200
P <- 6
Q <- 2
Lambda <- matrix(c(0.7, -0.4, 0.8, 0, -0.2, 0.9, -0.3, 0.4, 0.3, 0.7, -0.8, 0.1), nrow = P, ncol = Q, byrow = TRUE)

set.seed(123)
Kf <- diag(Q)
mu <- c(5, 15)
FF <- rmvnorm(N, mean = mu, sigma = Kf)
E <- rmvnorm(N, mean = rep(0, P), sigma = diag(P))
X <- FF %*% t(Lambda) + E

您也可以先计算六个变量之间的相关性。

#计算变量间的相关矩阵,以 pearson 相关系数为例
corMat <- cor(X, method = 'pearson')
head(corMat)

#相关图
library(corrplot)
corrplot(corMat, method = 'number', number.cex = 0.8, diag = FALSE, tl.cex = 0.8)
corrplot(corMat, add = TRUE, type = 'upper', method = 'pie', diag = FALSE, tl.pos = 'n', cl.pos = 'n')

确定要提取的公因子的数量

EFA 需要指定要提取的公因子的数量,可以在执行 EFA 之前对其进行评估。

library(psych)

#确定最佳因子数量,详情 ?fa.parallel
#输入变量间的相关矩阵,并手动输入原始变量集的对象数量(n.obs)
fa.parallel(corMat, n.obs = N, fa = 'both', n.iter = 100)

#或者直接使用原始变量集
fa.parallel(X, fa = 'both', n.iter = 100)

说明提取两个因子是合适的。

碎石测试的前两个特征值(蓝线三角形)都在角上方,并且大于基于 100 次随机模拟的数据矩阵(红色虚线)的平均特征值。

另外,根据特征值个数大于0的-,也建议选择两个因子。 (注意,它不是基于->1的准则。->1是针对PCA的。如果您希望评估PCA中适合选择多少个主成分,则可以使用此准则)

提取公因子和因子旋转

执行全民教育。 上述评估表明,选择两个因素是合适的,将其作为本步骤中的参数输入。

#EFA 分析,详情 ?fa
#输入变量间的相关矩阵,nfactors 指定提取的因子数量,并手动输入原始变量集的对象数量(n.obs)
#rotate 设定旋转的方法,fm 设定因子化方法
fa_varimax <- fa(r = corMat, nfactors = 2, n.obs = N, rotate = 'varimax', fm = 'pa')

#或者也可直接使用原始变量集
fa_varimax <- fa(r = X, nfactors = 2, rotate = 'varimax', fm = 'pa')

fa_varimax

EFA中提取因子的方法有很多种,如最大似然法(ml)、主轴迭代法(pa)、加权最小二乘法(wls)、广义加权最小二乘法(gls)、最小残差法()、等等。这里选择主轴迭代法。

因子旋转是一系列数学方法,使因子载荷矩阵更具可解释性。 他们尽可能地去噪这些因素。 旋转有两种方法:保持所选因素不相关(正交旋转),并使它们相关(倾斜旋转)。 最流行的正交旋转是最大方差旋转(其中参数 = ''),它尝试对加载数组的列进行去噪,以便每个因子仅由一组有限的变量来解释(即加载数组的每一列)只有少数非常大的负载,其余的都是非常小的负载)。

因子模式矩阵(列出因子预测变量权重的标准化回归系数矩阵)显示前两个因子解释了数据集中 39% 的方差。

对于该模拟数据集,变量 1 和 2 在第一个因子上具有较大的载荷,变量 3 在第二个因子上具有较大的载荷。

使用正交旋转会人为地迫使两个因素不相关。 如果允许因素之间存在相关性,则可以使用参数 = ''。

#上述展示了正交旋转,以下是斜交旋转
fa_promax <- fa(r = corMat, nfactors = 2, n.obs = N, rotate = 'promax', fm = 'pa')
fa_promax

因子模式矩阵显示前两个因子解释了数据集 39% 的方差。

因子相关矩阵显示两个因子之间呈负相关。 当因子之间存在较大相关性时,因子载荷矩阵会有更明显的噪声(相对于正交旋转,因为底层因子是允许相关的)。 倾斜法虽然较为复杂,但更符合真实数据。 。 如果因素之间的相关性很低,建议改用正交旋转法来简化问题。

#斜交旋转中,因子结构矩阵(载荷阵)使用 F=P*Phi 获得
#F 为因子载荷阵,P 为因子模式矩阵,Phi 为因子关联矩阵
fsm <- function(oblique) {
P <- unclass(oblique$loading)
F <- P %*% oblique$Phi
colnames(F) <- c('PA1', 'PA2')
F
}

fsm(fa_promax)

根据因子结构矩阵,变量1和2对第一个因子的载荷较大,变量3对第二个因子的载荷较大。 由于该模拟数据的两个因素之间的相关性很小,因此倾斜旋转的载荷矩阵与正交旋转的载荷矩阵类似。

绘制正交或倾斜结果。

#可视化
par(mfrow = c(2, 2))
factor.plot(fa_varimax, title = '正交旋转')
fa.diagram(fa_varimax, simple = TRUE, main = '正交旋转')
factor.plot(fa_promax, title = '斜交旋转')
fa.diagram(fa_promax, simple = FALSE, main = '斜交旋转')

这可以用来评估哪些变量对哪些因素有较大的载荷,从而确定哪些因素主要代表哪些变量之间的相互关系。

如果存在已知因素无法表示的变量(例如该模拟数据集中的变量4),则表明存在潜在因素。 如果需要,可以在计算过程中增加提取因子的数量。

因子得分

虽然因子得分在EFA中并不是很受关注,但如果期望获得它们,则需要使用原始变量矩阵(而不是变量之间的相关矩阵)来计算。

与精确计算的主成分分数不同,因子分数只是估计的。 估算方法有很多种。 fa()默认使用回归方法计算(计算时添加参数score='')。

#因子得分,以斜交旋转结果为例
fa_promax <- fa(r = X, nfactors = 2, rotate = 'promax', fm = 'pa', score = 'regression')
head(fa_promax$scores)

#得分系数(标准化的回归权重)
head(fa_promax$weight)

EFA 中常用的其他 R 包

该软件包不仅提供PCA和EFA方法,还包含潜变量模型,并分别提供数值变量和分类变量的计算方法。 FAiR 包使用遗传算法估计因子分析模型。 它增强了模型参数估计能力并可以处理不等式约束。 该包提供了多种因子轮换方法。 该软件包提供了许多复杂的方法来确定因素的数量。

参考

I.R语言练习(第二版)(王小宁、刘协新、黄俊文等译)。 人民邮电出版社,2016。

#

链接