Python中实现重复测量MANCOVA:求代码示例与工具包推荐
重复测量MANCOVA的Python实现方案
工具包推荐
- Pingouin:面向心理学与统计分析的轻量工具包,封装了重复测量MANCOVA的直接调用接口,语法简洁易上手,适合快速实现分析需求。
- Statsmodels:虽无直接的重复测量MANCOVA函数,但可通过构建线性混合模型(LMM)结合多变量检验实现,灵活性更强,适合需要自定义分析逻辑的场景。
代码示例
1. 使用Pingouin快速实现
首先安装依赖:
pip install pingouin
假设数据为长格式(每个被试的每一次测量对应一行),包含被试ID、组间因子、协变量、重复测量内因子及多个因变量,代码示例如下:
import pandas as pd import pingouin as pg # 构造示例长格式数据 data = pd.DataFrame({ 'subject_id': [1,1,1,2,2,2,3,3,3,4,4,4], 'group': ['A','A','A','A','A','A','B','B','B','B','B','B'], 'covariate': [10,10,10,12,12,12,9,9,9,11,11,11], 'time_point': ['pre','mid','post','pre','mid','post','pre','mid','post','pre','mid','post'], 'dv1': [20,25,30,18,22,26,22,27,32,19,24,28], 'dv2': [15,18,22,13,16,20,16,19,23,14,17,21] }) # 执行重复测量MANCOVA rm_mancova_result = pg.rm_mancova( data=data, dv=['dv1', 'dv2'], within='time_point', between='group', covar='covariate', subject='subject_id' ) # 输出分析结果 print(rm_mancova_result)
2. 使用Statsmodels手动实现
Statsmodels需通过虚拟变量转换+线性混合模型来处理重复测量结构,示例如下:
import pandas as pd import statsmodels.api as sm from statsmodels.multivariate.manova import MANOVA from statsmodels.regression.mixed_linear_model import MixedLM # 构造示例数据(同Pingouin示例) data = pd.DataFrame({ 'subject_id': [1,1,1,2,2,2,3,3,3,4,4,4], 'group': ['A','A','A','A','A','A','B','B','B','B','B','B'], 'covariate': [10,10,10,12,12,12,9,9,9,11,11,11], 'time_point': ['pre','mid','post','pre','mid','post','pre','mid','post','pre','mid','post'], 'dv1': [20,25,30,18,22,26,22,27,32,19,24,28], 'dv2': [15,18,22,13,16,20,16,19,23,14,17,21] }) # 步骤1:多变量线性模型基础分析(暂不考虑重复测量相关性) # 将组因子转换为虚拟变量,添加交互项 data['group'] = pd.Categorical(data['group']) data = pd.get_dummies(data, columns=['group'], drop_first=True) # 构建自变量矩阵 X = sm.add_constant(data[['group_B', 'covariate', 'time_point', 'group_B:time_point']]) # 因变量矩阵 Y = data[['dv1', 'dv2']] # 执行MANOVA manova_model = MANOVA(Y, X) print("MANOVA基础结果:\n", manova_model.mv_test()) # 步骤2:添加重复测量的随机效应(线性混合模型) # 针对每个因变量拟合LMM model_dv1 = MixedLM.from_formula( 'dv1 ~ group_B + covariate + time_point + group_B:time_point', groups=data['subject_id'], data=data ) result_dv1 = model_dv1.fit() print("\nDV1的混合模型结果:\n", result_dv1.summary()) model_dv2 = MixedLM.from_formula( 'dv2 ~ group_B + covariate + time_point + group_B:time_point', groups=data['subject_id'], data=data ) result_dv2 = model_dv2.fit() print("\nDV2的混合模型结果:\n", result_dv2.summary()) # 若需完整多变量检验,可基于两个因变量的结果手动计算Hotelling-Lawley迹等统计量
关键注意事项
- 数据格式:重复测量分析必须使用长格式数据,避免宽格式导致的分析误差。
- 前提假设:需验证协变量与因变量的线性关系、数据正态性、方差齐性等MANCOVA核心假设。
- Pingouin的
rm_mancova会自动处理球形性检验,结果中会输出相关统计量供参考。
内容的提问来源于stack exchange,提问作者user19980629
相关产品推荐
相关产品推荐

