You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用emmeans将均值估计值与零分布进行Bootstrap比较?

用emmeans结合Bootstrap构建零分布的方法

你提到的默认检验是将emmean与0对比,这在实际场景中缺乏意义。我们可以通过Bootstrap构建目标水平的均值零分布,再将emmeans的估计值与该分布对比,得到更合理的统计检验结果。以下是具体实现方法:

方法1:基于原始数据的Bootstrap(适配聚类结构)

由于你的模型包含(1|id)随机效应,抽样时需要保留id的聚类结构,避免破坏组内相关性:

  1. 提取x="A"对应的观测数据(每个id对应一个A组观测):
df_A <- df[df$x == "A", ]
n_A <- nrow(df_A)
  1. 生成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)
})
  1. 获取x="A"的emmeans估计值:
emm_A <- emmeans(mod, ~ x) |> dplyr::filter(x == "A") |> dplyr::pull(emmean)
  1. 计算双侧检验的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构建零分布:

  1. 拟合零模型:
null_mod <- lmer(y ~ 1 + (1|id), data = df)
  1. 生成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)
})
  1. 计算p值:
p_val_A_model <- mean(abs(boot_emms) >= abs(emm_A))
p_val_A_model

注意事项

  • 抽样次数10^4可根据计算资源调整,次数越多结果越稳定。
  • 若需单侧检验,直接对比方向即可,无需取绝对值。
  • 方法2更适合混合模型场景,因为它保留了随机效应的结构,结果可靠性更高。

内容的提问来源于stack exchange,提问作者locus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 02:19:48