如何使用emmeans将均值估计值与零分布进行Bootstrap比较?
用emmeans结合Bootstrap构建零分布的方法
你提到的默认检验是将emmean与0对比,这在实际场景中缺乏意义。我们可以通过Bootstrap构建目标水平的均值零分布,再将emmeans的估计值与该分布对比,得到更合理的统计检验结果。以下是具体实现方法:
方法1:基于原始数据的Bootstrap(适配聚类结构)
由于你的模型包含(1|id)随机效应,抽样时需要保留id的聚类结构,避免破坏组内相关性:
- 提取x="A"对应的观测数据(每个id对应一个A组观测):
df_A <- df[df$x == "A", ] n_A <- nrow(df_A)
- 生成Bootstrap样本的均值分布(按id有放回抽样,保证聚类结构):
set.seed(123) boot_means_A <- replicate(10^4, { # 有放回抽取id,再获取对应y值 sampled_ids <- sample(df_A$id, n_A, replace = TRUE) sampled_y <- df_A$y[match(sampled_ids, df_A$id)] mean(sampled_y) })
- 获取x="A"的emmeans估计值:
emm_A <- emmeans(mod, ~ x) |> dplyr::filter(x == "A") |> dplyr::pull(emmean)
- 计算双侧检验的p值(统计量绝对值大于等于观测值的比例):
p_val_A <- mean(abs(boot_means_A) >= abs(emm_A)) p_val_A
方法2:基于模型的Bootstrap(贴合混合模型结构)
如果要更贴合你的lmer模型逻辑,可在零假设(x对y无影响,模型为y ~ 1 + (1|id))下生成Bootstrap样本,再拟合原模型计算emmeans构建零分布:
- 拟合零模型:
null_mod <- lmer(y ~ 1 + (1|id), data = df)
- 生成Bootstrap样本并计算对应emmeans:
set.seed(123) boot_emms <- replicate(10^4, { # 从残差和随机效应中生成Bootstrap样本 boot_resid <- sample(resid(null_mod), replace = TRUE) boot_re <- sample(ranef(null_mod)$id[,1], replace = TRUE) # 生成零假设下的y值(消除x的效应) boot_y <- predict(null_mod) + boot_resid + boot_re - ranef(null_mod)$id[df$id,1] # 拟合原模型结构 boot_mod <- lmer(boot_y ~ x + (1|id), data = df) # 获取x="A"的emmean emmeans(boot_mod, ~ x) |> dplyr::filter(x == "A") |> dplyr::pull(emmean) })
- 计算p值:
p_val_A_model <- mean(abs(boot_emms) >= abs(emm_A)) p_val_A_model
注意事项
- 抽样次数
10^4可根据计算资源调整,次数越多结果越稳定。 - 若需单侧检验,直接对比方向即可,无需取绝对值。
- 方法2更适合混合模型场景,因为它保留了随机效应的结构,结果可靠性更高。
内容的提问来源于stack exchange,提问作者locus
相关产品推荐
相关产品推荐

