You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

手动计算双因素ANOVA平方和与statsmodels结果不符的问题排查

双因素ANOVA手动计算与statsmodels结果差异问题

我有一个包含1个连续变量和2个分类变量的数据集,手动从零计算双因素ANOVA的平方和与均方后,用Python的statsmodels包验证时,发现结果存在无法解释的差异。

手动计算平方和的代码

import pandas as pd

p, q = len(pd.unique(df.category1)), len(pd.unique(df.category2))
n1, n2 = df.groupby('category1').size(), df.groupby('category2').size()

y_groupmean1, y_groupmean2 = df.groupby('category1')['feature'].mean(), df.groupby('category2')['feature'].mean()
y_totalmean = df['feature'].mean()
y_group12 = df.groupby(['category1','category2'])['feature']

ss_b1, ss_b2 = sum(n1*(y_groupmean1 - y_totalmean)**2), sum(n2*(y_groupmean2 - y_totalmean)**2)
ss_e = sum([sum((df['feature'][(df['category1']==f'G{i}') & (df['category2']==f'H{j}')] - y_group12.get_group((f'G{i}',f'H{j}')).mean())**2) for i in range(p) for j in range(q)])

ss_t = sum((df['feature']-y_totalmean)**2)

ss_i = ss_t-ss_b1-ss_b2-ss_e

手动计算得到的ANOVA表中,各平方和有对应结果。

statsmodels验证代码

import statsmodels.api as sm
from statsmodels.formula.api import ols

model = ols('feature ~ C(category1) + C(category2) + C(category1):C(category2)', data=df).fit()
sm.stats.anova_lm(model, type=2)

差异现象

对比两者结果:

  • 第一个分类变量的平方和、残差平方和完全一致
  • 第二个分类变量的平方和存在明显差异,进而导致交互项平方和不同

我计算两个因素平方和的公式逻辑基本一致,却找不到差异原因。甚至参考其他双因素ANOVA的Python代码时,也发现statsmodels返回的残差和交互项结果有差异,对此十分困惑,希望得到解答。

内容的提问来源于stack exchange,提问作者Hye Jin Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 21:35:14