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

使用metafor包forest函数传入CI边界时mlab参数报错求助

解决metafor森林图mlab参数报错及合并效应位置问题

问题背景

使用metafor包绘制疫苗有效性(VE)的RevMan风格森林图时,直接传入原始VE值和CI边界,添加mlab参数会报错“mlab is not a graphical parameter”;尝试用addpoly添加合并效应时,多边形会显示在效应量栏下方,不符合RevMan格式要求。

错误原因

mlab参数仅在传入rma模型对象调用forest()时生效——直接传入单个研究的效应值(如forest(dat$ve, ...))的调用方式,不支持该参数,也不会自动生成合并效应的多边形。


方法1:基于rma模型对象绘制(推荐)

直接使用拟合后的rma模型对象绘制森林图,自动包含合并效应,mlab参数可正常使用,格式更贴合RevMan风格。

修改后代码

library(metafor)

# 构建数据集
dat <- data.frame(author = c("Amore-Coffea", "Deliciozza", "Kahve-Paradiso"),
                  year   = c(2000, 2004, 2002),
                  ve     = c(0.9, 0.85, 0.92),
                  ci_ll  = c(0.7, 0.7, 0.9),
                  ci_ul  = c(0.98, 0.9, 0.95))

# 转换为log(RR)(VE=1-RR,因此RR=1-VE)
dat <- escalc(measure = "RR",              
              yi = log(1 - dat$ve),
              sei = (log(1 - dat$ci_ul) - log(1 - dat$ci_ll)) / (2 * 1.96),
              data = dat)

# 拟合随机效应模型
res <- rma(yi, vi, data=dat, method="DL")

# 基于模型绘制森林图,mlab参数生效
forest(res, 
       slab = paste(dat$author, dat$year, sep = ", "),
       transf = function(x) 100*(1 - exp(x)),  # 转换回VE百分比
       at = c(0, 25, 50, 75, 100),
       xlim = c(-200, 110), 
       xlab="Vaccine Effectiveness (%)", 
       efac=c(0,4), 
       textpos=c(-200,-25), 
       lty=c(1,1,0), 
       refline=NA,
       cex=0.78, 
       header=c("Study", "IV, Random, 95% CI"), 
       mlab="Random Effects Model")  # 标注合并效应文本

关键说明

  • 调整transf函数:将模型中的log(RR)转换回VE百分比(100*(1-exp(x))),保证坐标轴显示的是VE值。
  • 直接传入res(rma模型对象),forest()会自动生成合并效应的多边形,mlab文本会对应标注在合并效应旁。

方法2:手动用addpoly添加合并效应(适配原始绘图逻辑)

若坚持直接传入单个研究的VE值绘制,可通过指定行位置,让addpoly将合并效应放在正确位置。

修改后代码

library(metafor)

# 构建数据集
dat <- data.frame(author = c("Amore-Coffea", "Deliciozza", "Kahve-Paradiso"),
                  year   = c(2000, 2004, 2002),
                  ve     = c(0.9, 0.85, 0.92),
                  ci_ll  = c(0.7, 0.7, 0.9),
                  ci_ul  = c(0.98, 0.9, 0.95))

# 转换为log(RR)
dat <- escalc(measure = "RR",              
              yi = log(1 - dat$ve),
              sei = (log(1 - dat$ci_ul) - log(1 - dat$ci_ll)) / (2 * 1.96),
              data = dat)

# 拟合随机效应模型
res <- rma(yi, vi, data=dat, method="DL")

# 绘制单个研究的森林图,预留合并效应的行位置
sav <- forest(dat$ve, ci.lb=dat$ci_ll, ci.ub=dat$ci_ul, 
              slab = paste(dat$author, dat$year, sep = ", "),
              transf = function(x) x * 100,
              at = c(0, 25, 50, 75, 100),
              xlim = c(-200, 110), 
              xlab="", 
              efac=c(0,4), 
              textpos=c(-200,-25), 
              lty=c(1,1,0), 
              refline=NA,
              cex=0.78, 
              header=c("Study", "IV, Random, 95% CI"),
              rows = c(3:1))  # 指定研究的行位置,预留第0行给合并效应

# 手动添加合并效应多边形到指定行
addpoly(res, 
        transf = function(x) 100*(1 - exp(x)),
        row=0,  # 放在研究下方的第0行
        cex=0.78,
        mlab="Random Effects Model")  # 标注合并效应文本

关键说明

  • 通过rows = c(3:1)指定3个研究的行位置,预留第0行用于放置合并效应。
  • addpoly的row=0参数确保合并效应多边形显示在研究列表的下方,而非效应量栏区域。

内容的提问来源于stack exchange,提问作者Chia-Yuan Chang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 01:17:03