用探索性因素分析解释 R 和 SPSS 之间的差异

机器算法验证 r spss 因子分析
2022-01-28 09:39:04

我是计算机科学专业的研究生。我一直在为一个研究项目做一些探索性因素分析。我的同事(领导该项目)使用 SPSS,而我更喜欢使用 R。这无关紧要,直到我们发现两个统计软件包之间存在重大差异。

我们使用主轴分解作为提取方法(请注意,我很清楚 PCA 和因子分析之间的区别,并且我们没有使用 PCA,至少不是故意的)。根据我的阅读,这应该对应于 R 中的“主轴”方法,以及 SPSS 中的“主轴分解”或“未加权最小二乘法”,根据 R 文档我们正在使用倾斜旋转方法(特别是promax),因为我们期望相关因素,并且正在解释模式矩阵

在 R 和 SPSS 中运行这两个程序,有很大的不同。模式矩阵给出不同的载荷。尽管这为变量关系提供了或多或少相同的因素,但相应的载荷之间存在高达 0.15 的差异,这似乎超出了提取方法和 promax 旋转的不同实现所预期的值。然而,这还不是最惊人的区别。

因子解释的累积方差在 SPSS 结果中约为 40%,在 R 结果中为 31%。这是一个巨大的差异,并导致我的同事想要使用 SPSS 而不是 R。我对此没有任何问题,但如此大的差异让我认为我们可能会错误地解释某些东西,这是一个问题。

当我们运行未加权最小二乘分解时,SPSS 报告了不同类型的解释方差。初始特征值的解释方差比例为 40%,而平方载荷提取和 (SSL) 的解释方差比例为 33%。这使我认为初始特征值不是要查看的适当数字(我怀疑这是在旋转之前解释的方差,尽管它太大超出了我的范围)。更令人困惑的是,SPSS 还显示 Rotation SSL,但不计算解释方差的百分比(SPSS 告诉我,具有相关因素意味着我无法添加 SSL 来找到总方差,这对我所看到的数学是有意义的)。R 报告的 SSL 与其中任何一个都不匹配,R 告诉我它描述了总方差的 31%。R 的 SSL 与 Rotation SSL 最接近。来自原始相关矩阵的 R 的特征值与 SPSS 的初始特征值匹配。

另外,请注意我已经尝试过使用不同的方法,并且 SPSS 的 ULS 和 PAF 似乎与 R 的 PA 方法最接近。

我的具体问题:

  1. 我应该期望 R 和 SPSS 与因子分析实现有多大差异?
  2. 我应该解释 SPSS 中的哪一个平方载荷之和、初始特征值、提取或旋转?
  3. 还有其他我可能忽略的问题吗?

我对 SPSS 和 R 的调用如下:

SPSS:

FACTOR
/VARIABLES <variables>
/MISSING PAIRWISE
/ANALYSIS <variables>
/PRINT INITIAL KMO AIC EXTRACTION ROTATION
/FORMAT BLANK(.35)
/CRITERIA FACTORS(6) ITERATE(25)
/EXTRACTION ULS
/CRITERIA ITERATE(25)
/ROTATION PROMAX(4).

回复:

library(psych)
fa.results <- fa(data, nfactors=6, rotate="promax",
scores=TRUE, fm="pa", oblique.scores=FALSE, max.iter=25)
4个回答

首先,我第二个ttnphns建议在轮换之前先看一下解决方案。在 SPSS 中实施的因子分析是一个包含多个步骤的复杂过程,比较每个步骤的结果应该有助于您查明问题。

具体来说,您可以运行

FACTOR
/VARIABLES <variables>
/MISSING PAIRWISE
/ANALYSIS <variables>
/PRINT CORRELATION
/CRITERIA FACTORS(6) ITERATE(25)
/EXTRACTION ULS
/CRITERIA ITERATE(25)
/ROTATION NOROTATE.

查看 SPSS 用于进行因子分析的相关矩阵。然后,在 R 中,通过运行自己准备相关矩阵

r <- cor(data)

在这个阶段,处理缺失值的方式上的任何差异都应该是显而易见的。一旦您检查了相关矩阵是否相同,您可以将其提供给fa函数并再次运行您的分析:

fa.results <- fa(r, nfactors=6, rotate="promax",
scores=TRUE, fm="pa", oblique.scores=FALSE, max.iter=25)

如果在 SPSS 和 R 中仍然得到不同的结果,则问题与缺失值无关。

接下来,您可以比较因子分析/提取方法本身的结果。

FACTOR
/VARIABLES <variables>
/MISSING PAIRWISE
/ANALYSIS <variables>
/PRINT EXTRACTION
/FORMAT BLANK(.35)
/CRITERIA FACTORS(6) ITERATE(25)
/EXTRACTION ULS
/CRITERIA ITERATE(25)
/ROTATION NOROTATE.

fa.results <- fa(r, nfactors=6, rotate="none", 
scores=TRUE, fm="pa", oblique.scores=FALSE, max.iter=25)

再次,比较因子矩阵/社区/平方载荷之和。在这里,您可以期待一些微小的差异,但肯定不会像您描述的那样大。所有这些都会让您更清楚地了解正在发生的事情。

现在,直接回答你的三个问题:

  1. 根据我的经验,有时在花一些时间弄清楚不同的术语并摆弄参数之后,可以获得非常相似的结果。我曾多次在 SPSS 和 R 中运行因子分析(通常在 R 中工作,然后在 SPSS 中复制分析以与同事分享),并且始终获得基本相同的结果。因此,我通常不会期望有很大的差异,这导致我怀疑问题可能特定于您的数据集。但是,我确实很快尝试了您在我周围的数据集上提供的命令(这是李克特量表),实际上差异比我习惯的要大,但没有您描述的那么大。(如果我有更多时间玩这个,我可能会更新我的答案。)
  2. 大多数时候,人们将旋转后的平方载荷之和解释为每个因素的“解释的方差比例”,但这在倾斜旋转后没有意义(这就是为什么它根本没有在psych和 SPSS 报告中报告在这种情况下的特征值——在输出中甚至有一个关于它的小脚注)。在提取任何因子之前计算初始特征值。显然,它们并没有告诉你任何关于由你的因素解释的方差比例,也不是真正的“平方和”(它们通常用于决定要保留的因素的数量)。然而,SPSS“平方载荷的提取总和”应与psych提供的“SS 载荷”相匹配。
  3. 在这个阶段这是一个疯狂的猜测,但您是否检查过因子提取过程是否在 25 次迭代中收敛?如果旋转未能收敛,SPSS 不会输出任何模式/结构矩阵,您不会错过它,但如果提取未能收敛,则会显示最后一个因子矩阵,并且 SPSS 会愉快地继续旋转。但是,您会看到一个注释“a. 尝试提取 6 个因子。需要超过 25 次迭代。(收敛=XXX)。提取已终止。” 如果收敛值很小(例如 0.005,默认停止条件为“小于 0.0001”),它仍然不能解释您报告的差异,但如果它真的很大,那么您的数据就会出现一些病态。

最近我发现,当在每个程序中对数据进行缺失列表处理时,SPSS 和 R(带有 Psych 包)之间的大多数因子分析差异都会消失,相关矩阵在每个程序中显示完全相同,并且没有使用倾斜旋转。

剩余的一个差异是出现在碎石图中的一系列值,这些值指示提取后的特征值。在 R 的“scree(cor(mydata))”中,这些“因素”与 SPSS 的“平方载荷的提取总和”下的方差解释表中列出的因素不匹配。请注意,R scree 图的“组件”确实与 SPSS 的 scree 图相匹配,这也与其方差解释表的“初始特征值”相匹配。

我还发现每个因素解释的“比例变量”在 R 中有时报告为(给定因素的比例)/(所有因素解释的数量),而在其他时候是(比例对于给定的因素)(分析中的项目数)。因此,如果您得到前者,它虽然不匹配,但至少与 SPSS 在“平方载荷的提取总和......方差的百分比”下报告的内容成比例并可以推导出来。

然而,在每个程序中引入 oblimin 轮换会在项目加载或因子方差方面产生相当大的差异,这解释了我无法解决的问题。

R 中的默认旋转方法是 oblimin,因此这可能会导致差异。作为在 SPSS 和 R 中运行 PAF/oblimin 的测试,您会发现几乎相同的结果。

这个答案是对上述答案的补充。正如 Gala 在他的回答中所建议的那样,应该首先确定 R (例如心理中的 fa )和 SPSS 提供的解决方案在旋转之前是否不同。如果它们相同,请查看每个程序中的旋转设置。(对于 SPSS,您可以在 FACTOR 的参考手册条目中找到所有设置)。

要寻找的一个重要设置是Kaiser normalization默认情况下,SPSS 在旋转过程中会进行 Kaiser 归一化,而某些R 函数(如“fa”)则不会。您可以通过指定 /CRITERIA = NOKAISER/KAISER 在 SPSS 中控制该设置,以验证它是否消除了每个程序的结果之间的任何差异。