Python与Stata实现探索性因子分析结果差异原因及采信方案
探索性因子分析Python与Stata结果差异原因及采信建议
差异核心原因
- 因子提取方法默认值不一致
FactorAnalyzer库默认采用最小残差法(minres)提取因子,Stata的factor命令默认采用主成分分析法提取因子,二者的因子载荷、特征值计算逻辑存在本质区别,是导致可提取因子数判定结果差异的核心原因。 - 输入变量范围未对齐
提供的Python代码未明确限定输入变量为k2x1-k2x29,若筛选后df包含g1或其他非题项变量,会直接导致输入的相关矩阵与Stata侧不一致。 - 旋转规则未对齐
Stata代码在提取因子后执行了varimax方差最大旋转,而提供的Python代码未设置旋转参数,FactorAnalyzer默认不做因子旋转,旋转后的因子方差贡献、特征值排序与未旋转结果存在明显差异。 - 缺失值处理逻辑差异
Stata默认采用列表wise删除(只要单个变量存在缺失就删除整条样本),FactorAnalyzer的缺失值处理默认规则与Stata存在区别,若数据集存在缺失值,两侧实际参与计算的样本量、样本组成会有差异。
对齐参数的代码修正方案
修正后Python代码
# 限定样本、变量范围,提前统一删除含缺失值的样本 df = df[df.g1 == 3][[f"k2x{i}" for i in range(1, 30)]].dropna(axis=0, how="any") # 统一提取方法为主成分法、旋转规则为方差最大旋转 fa = FactorAnalyzer(n_factors=6, method="principal", rotation="varimax") fa.fit(df) # 输出未旋转的原始特征值,与Stata默认输出的特征值口径对齐 print("未旋转特征值:", fa.get_eigenvalues()[0]) fa_loading_df = pd.DataFrame(fa.loadings_, columns=["Factor 1", "Factor 2", "Factor 3", "Factor 4", "Factor 5", "Factor 6"])
修正后Stata代码
* 限定提取方法为主成分法,与Python侧参数对齐 factor k2x1-k2x29 if g1==3, factor(6) pcf rotate, varimax norm blanks(.40)
结果采信建议
完成上述参数对齐后,若两侧结果一致,可根据研究领域规范选择输出:
- 社科类研究优先采信Stata输出结果,Stata的因子分析模块经过长期学术验证,默认输出规范符合大部分社科期刊的要求;
- 工程类、数据驱动类研究可根据研究目标选择,若需优先保证因子对原始数据的解释率,可参考Python侧结果,但需在研究报告中明确说明因子提取方法、旋转规则、缺失值处理逻辑。
原始结果对比

内容的提问来源于stack exchange,提问作者sagittarius2112
相关产品推荐
相关产品推荐

