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

因子水平组合缺失时,如何获取平均效应量估计值与置信区间

含缺失因子水平组合的metafor交互模型效应量提取方案

问题场景

使用metafor拟合包含调节变量交互项的混合效应模型时,因某一因子水平组合无对应数据,调用orchaRd的mod_results函数提取平均效应量及置信区间时出现如下报错:

Error in ref_grid(result, ...) : Something went wrong:
Non-conformable elements in reference grid.

手动补全系数和协方差矩阵后,结果与summary()输出完全一致,无法得到完整的各组合效应量估计。

用户原始代码:

library(orchaRd)
data(fish)
warm_dat <- fish
warm_dat$factor2<-as.factor(seq(c("A","B","C"),133) )

mod_fit <- metafor::rma.mv(yi = lnrr, V = lnrr_vi,
random = list(~1 | group_ID, ~1 | es_ID),
mods = ~ trait.type*factor2,
method = "REML", test = "t",
control=list(optimizer="optim", optmethod="Nelder-Mead"), data = warm_dat)

# 调用mod_results报错
results1 <- mod_results(mod_fit, group = "group_ID", mod = "trait.type", by = "Measurement_cat")
results2 <- mod_results(mod_fit, group = "group_ID", mod = "trait.type")

可行解决方案

方案1:添加虚拟数据补全因子组合

通过向数据集添加一行缺失组合的虚拟NA数据,让模型保留所有交互项参数,从而使orchaRd::mod_results正常工作:

# 构造缺失组合的虚拟行(根据实际缺失的水平调整)
missing_row <- data.frame(
  lnrr = NA,
  lnrr_vi = NA,
  group_ID = NA,
  es_ID = NA,
  trait.type = levels(warm_dat$trait.type)[which(!levels(warm_dat$trait.type) %in% unique(warm_dat$trait.type[warm_dat$factor2 == "C"]))],
  factor2 = "C",
  Measurement_cat = NA
)

# 合并数据
warm_dat_full <- rbind(warm_dat, missing_row)

# 重新拟合模型
mod_fit_full <- metafor::rma.mv(
  yi = lnrr, V = lnrr_vi,
  random = list(~1 | group_ID, ~1 | es_ID),
  mods = ~ trait.type*factor2,
  method = "REML", test = "t",
  control=list(optimizer="optim", optmethod="Nelder-Mead"), 
  data = warm_dat_full
)

# 正常调用mod_results
results <- orchaRd::mod_results(mod_fit_full, group = "group_ID", mod = "trait.type")
print(results)

方案2:使用metafor自带predict函数手动计算

直接通过predict.rma.mv结合expand.grid生成所有因子组合的效应量、置信区间和预测区间,无需依赖emmeans:

# 生成所有因子水平的完整组合
newdat <- expand.grid(
  trait.type = levels(warm_dat$trait.type),
  factor2 = levels(warm_dat$factor2),
  stringsAsFactors = TRUE
)

# 计算效应量、置信区间和预测区间
preds <- predict(mod_fit, newdata = newdat, 
                 interval = "confidence",  # 置信区间
                 predinterval = TRUE,      # 预测区间
                 addx = TRUE)

# 整理结果为数据框
result_df <- cbind(newdat, preds[, c("pred", "ci.lb", "ci.ub", "pi.lb", "pi.ub")])
print(result_df)

方案3:修正emmeans的qdrg调用

手动指定完整的因子水平,让emmeans正确构建参考网格:

# 构建包含所有水平的参考网格
grid <- emmeans::qdrg(
  formula = stats::formula(mod_fit),
  data = warm_dat,
  coef = mod_fit$b,
  vcov = stats::vcov(mod_fit),
  df = mod_fit$k - mod_fit$p,  # 使用模型正确的自由度
  levels = list(
    trait.type = levels(warm_dat$trait.type),
    factor2 = levels(warm_dat$factor2)
  ),
  allow.new.levels = TRUE
)

# 提取交互项的平均效应量
mm <- emmeans::emmeans(grid, specs = ~ trait.type * factor2)
print(mm)

# 计算预测区间(使用orchaRd函数)
mm_pi <- orchaRd::pred_interval_esmeans(mod_fit, mm, mod = "trait.type")
print(mm_pi)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 02:23:18