metafor包addpoly()函数annosym参数无效报错解决方案咨询
问题原因
annosym 是仅属于 forest() 函数的专属参数,addpoly() 本身没有这个参数定义,你传入的参数会被当做无效的图形参数处理,因此触发警告,也无法生效。
可行解决方法
方法1:临时修改metafor全局默认标注格式
直接修改metafor包内部存储的默认annosym参数,后续所有绘图相关的调用都会自动沿用这个配置,不需要单独给每个函数传参:
# 先保存原来的默认配置,用完可以改回去避免影响后续绘图 old_annosym <- metafor:::.mfpar$annosym # 改成你需要的格式 metafor:::.mfpar$annosym <- c(' (','; ',')') # 跑原来的绘图代码,addpoly不需要再传annosym参数 res <- rma(ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg, measure = 'OR', method='DL', slab=paste(author, year)) forest(res, ylim=c(-2,16)) dat.bcg.rand <- dat.bcg[dat.bcg$alloc=='random',] res.rand <- rma.uni(ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg.rand, measure = 'OR', method='DL', slab=paste(author, year)) addpoly(res.rand, mlab='Random alloc.',atransf=exp) # 绘图完成后可以改回默认配置 metafor:::.mfpar$annosym <- old_annosym
方法2:手动拼接标注文本(自定义程度更高)
如果你不想修改全局配置,可以关闭addpoly的默认标注,自己计算效应值和置信区间后手动拼接格式,用text()函数添加到对应位置:
# 先绘制主森林图 res <- rma(ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg, measure = 'OR', method='DL', slab=paste(author, year)) forest(res, annosym=c(' (','; ',')'), ylim=c(-2,16)) # 拟合亚组模型 dat.bcg.rand <- dat.bcg[dat.bcg$alloc=='random',] res.rand <- rma.uni(ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg.rand, measure = 'OR', method='DL', slab=paste(author, year)) # 添加亚组多边形,不显示默认的效应值标注 addpoly(res.rand, mlab='Random alloc.', atransf=exp, showweights=FALSE, efac=NA) # 手动计算转换后的效应值和置信区间 or <- exp(res.rand$beta) ci_lb <- exp(res.rand$ci.lb) ci_ub <- exp(res.rand$ci.ub) # 拼接成你要的格式,保留两位小数可自行调整精度 anno_text <- paste0(sprintf("%.2f", or), " (", sprintf("%.2f", ci_lb), "; ", sprintf("%.2f", ci_ub), ")") # 加到对应位置,y坐标根据你forest的ylim调整,这里亚组默认在最下方y=-1的位置(可根据实际调整) text(x = max(ci_ub)*1.1, y = -1, labels = anno_text, pos=4)
内容的提问来源于stack exchange,提问作者Łukasz Deryło
相关产品推荐
相关产品推荐

