使用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
相关产品推荐
相关产品推荐

