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

如何用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值,需手动转换为单侧:

  1. 查看结果中的Pr > F(双侧p值)和F值对应的效应方向
  2. 如果统计结果显示抑郁评分随时间上升,单侧p值 = 双侧p值 / 2
  3. 如果效应方向相反,单侧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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 07:10:29