使用ezANOVA开展重复测量ANOVA时wid参数配置与被试编号列设置问题
实操解答
你必须手动创建唯一的被试编号列,不存在其他替代方案。不管是用ezANOVA还是lme做被试内设计的分析,没有清晰的被试标识,函数根本无法拆分同一个被试多次测量带来的关联,所有计算结果都是错的。
现有代码的典型错误
- 把被试内自变量写到了
ezANOVA的between参数下:between仅用于填充组间设计的自变量,你的两个IV都是被试内测量,应该放到within参数中。 - 调用
ezANOVA时所有参数都直接传数据框的列名即可,不需要加df$前缀,否则会触发识别异常。 - 你写的
lme随机项逻辑完全错误:模型没有正确对应被试内的嵌套测量结构,也漏了两个IV的交互项。
被试ID列的创建方法
首先确认你的数据格式:如果是长格式重复测量数据(每一行对应该被试在某一个IV水平组合下的一次DV测量),按每个被试的测量次数直接切分行生成ID即可。
比如两个IV都是1-7分,单被试总共有7*7=49行测量,生成ID的代码为:
# 计算单被试测量行数,按行切割生成连续被试编号 n_trials_per_sub <- length(unique(df$scoreIV1)) * length(unique(df$scoreIV2)) df$subject_id <- rep(1:(nrow(df)/n_trials_per_sub), each = n_trials_per_sub) # 后续分析前把ID转成因子类型 df$subject_id <- as.factor(df$subject_id)
如果你的数据是宽格式(同一个被试的所有测量都存在同一行,每个列对应一个条件下的DV得分),可以先把数据转成长格式再生成ID,直接用原表的行号当唯一被试值即可。
修正后的可运行代码
修正版ezANOVA代码
library(ez) # 把两个被试内IV也转成因子类型(做传统分类ANOVA需要) df$scoreIV1 <- as.factor(df$scoreIV1) df$scoreIV2 <- as.factor(df$scoreIV2) ezANOVA(data = df, wid = subject_id, # 直接填生成的ID列名 dv = scoredv, within = .(scoreIV1, scoreIV2), # 被试内因素放在这里 type = 3) # 采用III型平方和,适配不平衡数据场景
修正版lme模型代码
library(nlme) model <- lme(scoredv ~ scoreIV1 + scoreIV2 + scoreIV1:scoreIV2, random = ~1 | subject_id/scoreIV1/scoreIV2, # 被试嵌套两层重复测量因素 data = df) summary(model)
注意事项
- 生成ID后必须校验对应关系:检查前几行的ID分组是否和原始数据的被试归属匹配,避免把不同被试的观测错分到同一编号下。
- 如果你的IV是1-7分的连续变量,不需要把它当分类因子处理:此时随机项只要保留被试的随机截距即可,即
random = ~1|subject_id,不要把连续IV写到随机效应项中。
内容的提问来源于stack exchange,提问作者Peter Silie
相关产品推荐
相关产品推荐

