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

如何在R语言的不平衡嵌套rma.mv元分析模型中使用emmprep?

解决rma.mv嵌套模型秩亏缺导致emmprep报错的问题

核心原因

你的嵌套模型使用默认的**处理对比(contr.treatment)**时,会产生线性相关的参数(冗余项),导致模型自动剔除部分参数,而emmprep()不支持带有冗余项的模型。

简便解决方案:更改因子对比方式

使用**和对比(contr.sum)**替代默认的处理对比,避免嵌套模型中的秩亏缺:

library(metafor)
library(emmeans)

dat <- dat.bcg
dat$ablat <- c("a","b","c","a","b","b","a","b","c","a","b","c","a")
dat <- escalc(measure="RR", ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat,
              slab=paste0(author, ", ", year)) 

# 设置全局因子对比为和对比,避免秩亏缺
options(contrasts = c("contr.sum", "contr.poly"))

# 重新拟合嵌套模型,此时不会有冗余项被剔除
res4_clean <- rma.mv(yi, vi, mods = ~ alloc/ablat, data = dat)

# 正常运行emmprep
sav <- emmprep(res4_clean)

# 查看emmeans结果,例如按alloc和ablat分组
emmeans(sav, ~ alloc * ablat)

其他可选方法

如果不想修改全局对比设置,可以单独为目标因子设置对比:

# 单独为alloc和ablat设置和对比
dat$alloc <- factor(dat$alloc, contrasts = contr.sum)
dat$ablat <- factor(dat$ablat, contrasts = contr.sum)

# 拟合模型
res4_clean <- rma.mv(yi, vi, mods = ~ alloc/ablat, data = dat)

# 运行emmprep
sav <- emmprep(res4_clean)

原理说明

处理对比会将因子的第一个水平作为参考,嵌套模型中主效应与嵌套效应的参数会产生线性依赖,导致秩亏缺;而和对比强制每个因子的参数和为0,消除了这种线性依赖,模型不会出现冗余项,因此emmprep()可以正常工作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 00:54:56