lme4自助法置信区间计算:如何使用未纳入模型的样本数据
方案1:在模型公式中加入偏移项保留目标变量
在拟合模型时,将未纳入模型的temperature乘以0后作为偏移项加入公式,该操作不会改变模型的任何拟合结果,且会让temperature保留在模型框架中,自助重拟合过程中可直接调用。
library(lme4) set.seed(1) # 加入offset(0*temperature),不影响拟合结果,同时保留temperature变量 mod <- lmer(angle ~ recipe + (1|replicate) + offset(0*temperature), data = cake) calc_stats <- function(model) { recipeA <- fixef(model)[[1]] sd_components <- as.data.frame(VarCorr(model))[['sdcor']] sd_between = sd_components[1] sd_within = sd_components[2] # 直接从当前bootstrap样本的model@frame中取temperature算均值 mean_temp <- mean(model@frame$temperature) ratio <- sd_within / mean_temp c( recipeA = recipeA, sd_between = sd_between, sd_within = sd_within, sd_within_per_temp = ratio ) } confint(mod, method="boot", FUN = calc_stats, nsim = 100)
方案2:手动实现自助抽样流程
如果不想修改原模型公式,可以手动完成抽样、拟合、计算统计量的全流程,完全自主控制所需变量:
library(lme4) set.seed(1) # 原模型不需要修改 mod <- lmer(angle ~ recipe + (1|replicate), data = cake) nsim <- 100 res <- replicate(nsim, { # 有放回抽样获得bootstrap样本 boot_idx <- sample(nrow(cake), nrow(cake), replace = TRUE) boot_dat <- cake[boot_idx, ] # 重拟合模型 boot_mod <- update(mod, data = boot_dat) # 计算所需统计量 sd_within <- as.data.frame(VarCorr(boot_mod))[['sdcor']][2] mean_temp <- mean(boot_dat$temperature) sd_within / mean_temp }) # 计算95%置信区间 quantile(res, c(0.025, 0.975))
内容的提问来源于stack exchange,提问作者JohannesNE
相关产品推荐
相关产品推荐

