如何用numpy、pandas、statsmodels实现重复测量ANOVA?遇AnovaRM错误求助
重复测量ANOVA实现步骤及错误修复(基于numpy、pandas、statsmodels)
一、核心错误修复:数据格式转换
你的AnovaRM调用失败,核心原因是数据格式不匹配:statsmodels的AnovaRM要求数据集为长格式(每个观测对应一行,包含受试者ID、时间点、抑郁评分),但你的原始数据是宽格式(一行对应一个受试者,列是不同时间点的评分)。
1. 宽格式转长格式代码示例
假设你的原始DataFrame包含受试者ID、治疗前、治疗后、6个月随访列,执行以下代码转换格式:
import pandas as pd import numpy as np import statsmodels.api as sm from statsmodels.stats.anova import AnovaRM # 模拟你的原始宽格式数据(替换成你实际的数据集读取代码,比如pd.read_csv) data = { '受试者ID': [1,2,3,4,5], '治疗前': [22,18,25,20,19], '治疗后': [15,12,18,14,16], '6个月随访': [16,14,20,15,17] } df = pd.DataFrame(data) # 转换为长格式 long_df = df.melt( id_vars='受试者ID', value_vars=['治疗前', '治疗后', '6个月随访'], var_name='时间点', value_name='抑郁评分' )
2. 正确调用AnovaRM
用转换后的长格式数据运行重复测量ANOVA:
# 拟合重复测量ANOVA模型 model = AnovaRM( data=long_df, depvar='抑郁评分', subject='受试者ID', within=['时间点'] ) result = model.fit() print(result)
二、适配你的单侧假设检验
你的假设设定为:
- H0:抑郁评分随时间维持不变或下降
- H1:抑郁评分随时间上升
默认AnovaRM输出的是双侧p值,需手动转换为单侧:
- 查看结果中的
Pr > F(双侧p值)和F值对应的效应方向 - 如果统计结果显示抑郁评分随时间上升,单侧p值 = 双侧p值 / 2
- 如果效应方向相反,单侧p值 = 1 - (双侧p值 / 2)
可通过事后检验确认时间点的趋势:
from statsmodels.stats.multicomp import pairwise_tukeyhsd # 两两比较时间点差异 tukey_result = pairwise_tukeyhsd( endog=long_df['抑郁评分'], groups=long_df['时间点'], alpha=0.05 ) print(tukey_result.summary())
三、常见错误排查
你之前的报错大概率属于以下情况:
- 传入了宽格式数据,
AnovaRM无法识别组内重复测量变量 subject参数未指定唯一标识受试者的列depvar或within的变量名与DataFrame列名拼写不一致
内容的提问来源于stack exchange,提问作者Amelia Sawyer
相关产品推荐
相关产品推荐

