R中重复测量三因素ANOVA(不等样本量)报错解决咨询
重复测量三因素ANOVA修正方案及替代方案
错误根源
你误将sex、exercises这两个组间因素放到了anova_test()的within参数中——只有time是重复测量的组内因素。每个受试者(id)的性别和锻炼类型是固定的,不存在重复观测,这种参数指定错误导致模型无法识别有效分析样本,进而触发0 (non-NA) cases报错。
修正后的rstatix代码
明确因素类型后调整代码:
library(tidyverse) library(ggpubr) library(rstatix) library(readxl) setwd("你的文件路径") weightloss <- read_xlsx("test.xlsx") # 转长格式+转换因子类型 weightloss <- weightloss %>% gather(key = "time", value = "score", t1, t2, t3) %>% convert_as_factor(id, sex, exercises, time) # 正确指定组间/组内因素 res.aov <- anova_test( data = weightloss, dv = score, wid = id, between = c(sex, exercises), # 组间变量:性别、锻炼类型 within = time # 组内重复测量变量:时间点 ) # 输出ANOVA结果 get_anova_table(res.aov)
样本量不等时的更优方案:混合效应模型
由于各组样本量不均衡,重复测量ANOVA的方差齐性等假设易不满足,推荐用线性混合模型(LMM)分析,结果更稳健。使用lme4+lmerTest包实现:
# 安装依赖包(首次运行需执行) install.packages(c("lme4", "lmerTest")) library(lme4) library(lmerTest) # 构建混合模型:id作为随机效应,纳入所有交互项 model <- lmer(score ~ sex * exercises * time + (1 + time | id), data = weightloss) # 输出各因素及交互项的显著性检验 anova(model)
关键说明
(1 + time | id):为每个受试者设置随机截距和随时间变化的随机斜率,更贴合重复测量数据的个体差异- 若模型收敛失败,可简化随机效应结构为
(1 | id),仅保留随机截距
额外检查点
如果修正后仍报错,先检查score列是否存在大量缺失值,可通过weightloss <- weightloss %>% filter(!is.na(score))过滤无效样本。
内容的提问来源于stack exchange,提问作者Xenobis
相关产品推荐
相关产品推荐

