使用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
相关产品推荐
相关产品推荐

