简体   繁体   English

更改包元数据林图中的置信区间格式?

[英]Change confidence interval format in package metafor forest graph?

Assume the code below (as given in Viechtbauer, 2010): 假设下面的代码(如Viechtbauer,2010中给出的):

library(metafor)
data("dat.bcg", package = "metafor")
dat <- escalc(measure = "RR", ai = tpos, bi = tneg, ci = cpos, di = cneg, data = dat.bcg, append = TRUE)
res <- rma(ai = tpos, bi = tneg, ci = cpos, di = cneg, data = dat, measure = "RR")
forest(res, slab = paste(dat$author, dat$year, sep = ", "), xlim = c(-16, 6), at = log(c(0.05, 0.25, 1, 4)), atransf = exp, ilab = cbind(dat$tpos, dat$tneg, dat$cpos, dat$cneg), ilab.xpos = c(-9.5, -8, -6, -4.5), cex = 0.75)
op <- par(cex = 0.75, font = 2)
text(c(-9.5, -8, -6, -4.5), 15, c("TB+", "TB-", "TB+", "TB-"))
text(c(-8.75, -5.25), 16, c("Vaccinated", "Control"))
text(-16, 15, "Author(s) and Year", pos = 4)
text(6, 15, "Relative Risk [95% CI]", pos = 2)
par(op)

This gives a forest graph as below: 这给出了如下森林图:

森林情节

So how can I change the format of confidence intervals in the graph? 那么如何更改图表中置信区间的格式呢? Is it possible to replace brackets with parentheses and use "to" instead of ","? 是否可以用括号替换括号并使用“to”而不是“,”? How about using "-" or long hypen instead of ","? 如何使用“ - ”或长时间的宣传而不是“,”? This should change ie [0.13, 1.26] to (0.13 to 1.26) or (0.13 – 1.26) 这应该改变,即[0.13,1.26]到(0.13到1.26)或(0.13 - 1.26)

You need to do some hacking of the code for forest.rma . 你需要为forest.rma做一些代码的黑客攻击。 Several steps: 几个步骤:

After displaying the current version of the code by typing the function name: 通过键入函数名称显示当前版本的代码后:

 forest.rma   # Copy the name and the code and paste into the console 
              #  Add an assignment operator `<-`
              # leave off the bytecode and environment notations at the bottom

Or you can do this in an editor, which would probably be the preferred method since you might then want to save this code to a .Rprofile file. 或者您可以在编辑器中执行此操作,这可能是首选方法,因为您可能希望将此代码保存到.Rprofile文件中。

1) Add parameters to the argument list: 1)将参数添加到参数列表:

forest.rma <- 
function (x, annotate = TRUE, addfit = TRUE, addcred = FALSE, 
    showweights = FALSE, xlim, alim, clim, ylim, at, steps = 5, 
    level = x$level, digits = 2, refline = 0, xlab, slab, mlab, 
    ilab, ilab.xpos, ilab.pos, order, transf, atransf, targs, 
    rows, efac = 1, pch = 15, psize, col, border, lty, cex, cex.lab, 
    cex.axis, annosep = " , ", bkt=c("[", "]"), ...) 
{  #  ....not showing all the _long_ function body 
   # Scroll down to almost the bottom of the function body

2) Find and change arguments to the annotext cbind -assignment. 2)查找并更改annotext cbind参数。 There are several places where annotext might get constructed, but only one of them matches your "format target". 有几个地方可以构建annotext ,但只有其中一个匹配您的“格式目标”。 Find the one that looks like this: 找到一个看起来像这样的:

# annotext <- cbind(annotext[, 1], " [ ", annotext[, 
#                2], " , ", annotext[, 3], " ]")

Change to this: 改为:

annotext <- cbind(annotext[, 1], bkt[1], annotext[, 
                 2], annosep, annotext[, 3], bkt[2] )
# hit enter to get the modification to hold in your workspace

3) Now assign the correct environment to the function so it can play well with its siblings: 3)现在为函数分配正确的环境,以便它可以与兄弟姐妹很好地配合:

environment(forest.rma) <- environment(forest.default)
# if you forget this step you see this error:

Error in forest.rma(res, slab = paste(dat$author, dat$year, sep = ", "), : could not find function ".setlab" forest.rma中的错误(res,slab = paste(dat $ author,dat $ year,sep =“,”),:找不到函数“.setlab”

And call it with the new arguments of your choosing: 并使用您选择的新参数调用它:

png(); forest(res, slab = paste(dat$author, dat$year, sep = ", "), xlim = c(-16, 6), at = log(c(0.05, 0.25, 1, 4)), atransf = exp, ilab = cbind(dat$tpos, dat$tneg, dat$cpos, dat$cneg), ilab.xpos = c(-9.5, -8, -6, -4.5), cex = 0.75, annosep=" to ", bkt = c( "(", ")" ) )
op <- par(cex = 0.75, font = 2)
text(c(-9.5, -8, -6, -4.5), 15, c("TB+", "TB-", "TB+", "TB-"))
text(c(-8.75, -5.25), 16, c("Vaccinated", "Control"))
text(-16, 15, "Author(s) and Year", pos = 4)
text(6, 15, "Relative Risk [95% CI]", pos = 2)
dev.off()

在此输入图像描述

Here is a solution that does not require changing the code of the forest.rma() function. 这是一个不需要更改forest.rma()函数代码的解决方案。 I use annotate=FALSE so that the function does not annotate the forest plot and instead add those annotations myself. 我使用annotate=FALSE以便函数不注释森林图,而是自己添加这些注释。

library(metafor)
data("dat.bcg", package = "metafor")
dat <- escalc(measure = "RR", ai = tpos, bi = tneg, ci = cpos, di = cneg, data = dat.bcg, append = TRUE)

res <- rma(ai = tpos, bi = tneg, ci = cpos, di = cneg, data = dat, measure = "RR")

### note the use of annotate=FALSE in forest()
forest(res, slab = paste(dat$author, dat$year, sep = ", "), xlim = c(-16, 6), 
       at = log(c(0.05, 0.25, 1, 4)), atransf = exp, 
       ilab = cbind(dat$tpos, dat$tneg, dat$cpos, dat$cneg), ilab.xpos = c(-9.5, -8, -6, -4.5), 
       cex = 0.75, annotate=FALSE) 

op <- par(cex = 0.75, font = 2)
text(c(-9.5, -8, -6, -4.5), 15, c("TB+", "TB-", "TB+", "TB-"))
text(c(-8.75, -5.25), 16, c("Vaccinated", "Control"))
text(-16, 15, "Author(s) and Year", pos = 4)
text(6, 15, "Relative Risk [95% CI]", pos = 2)

### add annotations manually
tmp <- summary(dat, transf=exp)[,c("yi","ci.lb","ci.ub")] ### for the individual studies
tmp <- rbind(tmp, with(predict(res, transf=exp), c(pred, ci.lb, ci.ub))) ### add model estimate and CI bounds
sav <- apply(tmp, 2, formatC, format="f", digits=2)
annotext <- apply(sav, 1, function(x) {paste0(x[1], " (", x[2], " to ", x[3], ")")})
text(6, c(res$k:1, -1), annotext, pos=2, font=1)

par(op)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM