如何解决statsmodels.AnovaRM实际数据平衡却报“数据不平衡”错误
报错原因
statsmodels.AnovaRM对重复测量方差分析的平衡判定规则为:每个被试必须存在所有组内因子的全水平组合,且所有交叉组合的观测数完全相等,仅单个因子各水平总样本量一致不满足平衡要求。
你当前的问题大概率是两个原因之一:
- 列名不匹配:你代码中
within参数写的是Factor2,但你提供的样例数据中对应列名为Factor 2(中间包含空格),因子读取异常会触发不平衡报错。 - 交叉组合缺失:Factor1有3个水平、Factor2有3个水平,总共有9种交叉组合,你提供的样例数据仅包含
(0,a)/(1,b)/(2,c)3种组合,剩余组合完全缺失,不符合平衡要求。
排查方法
运行以下两行代码确认问题:
- 核对因子交叉组合的样本量:
print(anova_df.groupby(['Factor1', 'Factor2']).size())
平衡数据下输出的所有值必须相等。
2. 核对单个被试的水平覆盖情况:
print(anova_df.groupby('Subject')[['Factor1', 'Factor2']].nunique())
平衡数据下每个被试的Factor1唯一值为3、Factor2唯一值为3,且每个被试的交叉组合数为9。
修复方案
- 如果是列名不匹配:将代码中
Factor2改为和DataFrame列名完全一致的Factor 2即可。 - 如果是交叉组合缺失:
- 优先删除存在组合缺失的被试,仅保留所有组合数据完整的被试,再重新运行方差分析。
- 若无法删除缺失被试,可手动补全缺失组合的观测值,因变量填入该组合的均值后再分析,该方法会影响统计效力,需谨慎使用。
- 若数据确实无法做到完全平衡,改用
statsmodels.MixedLM拟合混合线性模型即可,该方法不需要严格的平衡数据。
内容的提问来源于stack exchange,提问作者Waschbrettwade
相关产品推荐
相关产品推荐

