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

使用statsmodels进行双因素ANOVA时遇值错误与运行时警告

解决statsmodels双因素ANOVA的NaN/inf及除零警告问题

一、先搞定数据问题(错误根源)

你遇到的两个错误核心都是数据异常,先从这两步排查:

1. 清理缺失值/无穷值

直接跑代码检查数据里的异常项:

import pandas as pd
import numpy as np

# 假设你的数据存在df变量里
print("缺失值统计:")
print(df.isnull().sum())
print("\n无穷值统计:")
print(df.isin([np.inf, -np.inf]).sum())
  • 如果有缺失值:选适合你的方式处理
    df = df.dropna()  # 删除含缺失值的行
    # 或者用均值填充
    df = df.fillna(df.mean(numeric_only=True))
    
  • 如果有无穷值:先转成NaN再处理
    df = df.replace([np.inf, -np.inf], np.nan)
    

2. 把宽格式转成长格式

statsmodels的ANOVA只认长格式数据(每行对应一个观测值,包含两个因素和一个因变量),而你的数据是宽格式(每列对应一个组合组),必须转换:

# 转长格式,var_name存组名,value_name存观测值
df_long = pd.melt(df, var_name='group', value_name='value')
# 拆分组名得到两个因素(比如组名是A1/B1/A2/B2,拆成factor1=A/B,factor2=1/2)
df_long[['factor1', 'factor2']] = df_long['group'].str.extract('([AB])([12])')

转完后数据会是三列:factor1、factor2、value,这是后续分析的基础。

二、解决除零警告

这个警告是因为某个组的样本量为0,或者组内所有值完全相同(方差为0),跑代码查每组的情况:

group_stats = df_long.groupby(['factor1', 'factor2'])['value'].agg(['count', 'var'])
print(group_stats)
  • 如果count为0:说明该组无数据,要么补数据,要么删掉该组的记录
  • 如果var为0:组内值完全一致,方差为0,要么补充不同样本,要么删除该组

三、正确执行双因素ANOVA

数据清理完成后,根据你的实验设计选对应方法:

独立样本设计(被试不重复)

用ols模型+anova_lm:

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

# 模型包含两个因素及交互项
model = ols('value ~ C(factor1) + C(factor2) + C(factor1):C(factor2)', data=df_long).fit()
anova_table = sm.stats.anova_lm(model, typ=2)
print(anova_table)

重复测量设计(同一被试测多个组)

用AnovaRM(需数据包含subject_id列标识被试):

from statsmodels.stats.anova import AnovaRM

anova_rm = AnovaRM(df_long, depvar='value', subject='subject_id', within=['factor1', 'factor2'])
result = anova_rm.fit()
print(result)

四、匹配预期结果

执行完上述步骤后,输出的ANOVA表会包含因素A、因素B、交互项的平方和、自由度、均方、F值、P值,和你预期的结果格式一致。


内容的提问来源于stack exchange,提问作者SirTee12

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 08:07:43