如何在R(lme4)中对线性混合模型的Type III固定效应做Bootstrap?
线性混合模型Type III ANOVA的Bootstrap实现
我正在为包含3个二分类固定因子(含所有双向交互项)和1个随机因子的线性混合模型做Bootstrap分析。目前能独立完成以下操作:
- 拟合线性混合模型
- 对模型进行Bootstrap抽样
- 获取模型的Type III固定效应(通过ANOVA方法)
但无法将后两者结合,也就是没法得到Bootstrap后的Type III固定效应结果。线性混合模型本身只能给出与参考类别对比的固定效应估计,Type III效应必须通过对模型执行ANOVA才能获取。我知道怎么给线性混合模型或常规ANOVA做Bootstrap,但不知道如何针对线性混合模型的ANOVA结果做Bootstrap——这正是得到Bootstrap后Type III固定效应的核心。
我用到的R包包括lme4、lmerTest和lmeresampler,相关代码如下:
# 拟合线性混合模型 lmm <- lmer(unlist(DV) ~ unlist(IV1) + unlist(IV2) + unlist(IV3) + unlist(IV1):unlist(IV2) + unlist(IV1):unlist(IV3) + unlist(IV2):unlist(IV3) + (1 | unlist(randomfactor)), data = table) # 对线性混合模型做Bootstrap lmm.boot <- bootstrap(lmm, type = "residual", B = 5000, resample = c(TRUE, TRUE)) # 获取线性混合模型的Type III固定效应 anova.lmm <- anova(lmm)
该模型的ANOVA输出结果如下:
Type III Analysis of Variance Table with Satterthwaite's method Sum Sq Mean Sq NumDF DenDF F value Pr(>F) unlist(sex) 44.03 44.03 1 109.041 0.1831 0.6696 unlist(f0groupfemale) 611.01 611.01 1 16.435 2.5406 0.1300 unlist(f0groupmale) 10.37 10.37 1 16.431 0.0431 0.8381 unlist(sex):unlist(f0groupfemale) 149.70 149.70 1 108.462 0.6225 0.4319 unlist(sex):unlist(f0groupmale) 89.36 89.36 1 109.708 0.3716 0.5434 unlist(f0groupfemale):unlist(f0groupmale) 66.19 66.19 1 16.419 0.2752 0.6069
我的问题是:有没有办法对上述Type III ANOVA结果执行Bootstrap?我知道ANOVA.boot可以用于常规ANOVA的Bootstrap,但没法适配线性混合模型的ANOVA结果。
解决方案
要实现线性混合模型Type III ANOVA的Bootstrap,核心思路是在Bootstrap抽样的每一轮中,对重抽样后的数据集拟合模型,然后提取Type III ANOVA的统计量(比如F值、p值或效应量),最后基于这些重复统计量计算置信区间或进行检验。
可以通过lmeresampler包的bootstrap()函数结合自定义统计量函数来实现,具体步骤如下:
- 定义一个自定义函数,输入为拟合的lmer模型,输出为Type III ANOVA的关键统计量(比如F值):
# 自定义函数:提取Type III ANOVA的F值 get_type3_f <- function(model) { anova_result <- anova(model, type = "III") return(anova_result$`F value`) }
- 在调用
bootstrap()时,指定这个自定义函数作为statistic参数,这样每一轮Bootstrap都会返回对应模型的Type III ANOVA F值:
# 执行Bootstrap并提取Type III ANOVA统计量 lmm_type3_boot <- bootstrap(lmm, type = "residual", B = 5000, resample = c(TRUE, TRUE), statistic = get_type3_f)
- 查看Bootstrap结果,并计算统计量的置信区间:
# 查看Bootstrap后的统计量分布 summary(lmm_type3_boot) # 计算95%置信区间(以F值为例) confint(lmm_type3_boot, level = 0.95)
如果需要提取更多统计量(比如p值、均方等),可以修改自定义函数,让它返回一个包含多个统计量的向量:
get_type3_stats <- function(model) { anova_result <- anova(model, type = "III") return(c(F_value = anova_result$`F value`, Pr_F = anova_result$`Pr(>F)`)) } # 重新执行Bootstrap lmm_type3_boot_full <- bootstrap(lmm, type = "residual", B = 5000, resample = c(TRUE, TRUE), statistic = get_type3_stats)
注意事项
- 确保你的
lmerTest包版本支持anova(lmer_model, type = "III"),如果遇到报错,可以尝试用car包的Anova()函数(注意大写A)来计算Type III ANOVA:library(car) get_type3_f <- function(model) { anova_result <- Anova(model, type = "III") return(anova_result$`F value`) } - 残差Bootstrap的假设是模型残差独立同分布,若你的数据不符合该假设,可能需要考虑其他Bootstrap类型(比如参数Bootstrap、个案Bootstrap等)。
内容的提问来源于stack exchange,提问作者Laura Dawson
相关产品推荐
相关产品推荐

