森林小区点大小

时间:2016-09-05 16:45:09

标签: r plot

在它所说的metafor库的文档中,如果未指定可选参数psize,则绘制点大小与估计的精度成比例。据我所知,精确度是方差的倒数。

  1. metafor库如何从置信区间计算点大小?

  2. 如何只放大磅值? cex也会影响文字大小。

  3. 例如

    library(metafor)
    model_data <- read.table(dec = ",", text="
                                              OR        lower       upper
                             age              0,9678479 0,9326182   1,002493
                             sex              1,0679667 0,4987457   2,280504
                             ApacheeII        0,9288701 0,8728417   0,984529",
                             header=T)
    
    forest(x=model_data$OR, 
           ci.lb=model_data$lower, 
           ci.ub=model_data$upper, 
           annotate=TRUE, 
           cex=1.2, 
           at=seq(0,6,1),
           refline=1, 
           digits=c(3,1), 
           xlim=c(-1,2),
           xlab="OR",
           slab=rownames(model_data))
    

2 个答案:

答案 0 :(得分:0)

至于1:

forest.default()中的相关代码行是:

vi <- ((ci.ub - ci.lb) / (2*qnorm(alpha/2, lower.tail=FALSE)))^2

因此,该函数假设您正在向函数提供对称Wald-tye置信区间(CI)的边界,然后根据该函数反向计算方差。这适用于对数比例和对数比例上的相应CI边界,但您显然直接将原始比例的OR和CI边界应用于函数。然后这没有多大意义。通常,优先比率的CI实际上首先在对数尺度上计算(然后取幂)。这些数据似乎也是如此:

round(with(model_data, log(upper) - log(OR)), 2)
round(with(model_data, log(OR) - log(lower)), 2)

这表明在对数刻度上,CI边界是对称的(围绕log(OR))。因此,这些CI边界很可能是对数尺度上的Wald类型CI。所以,这样做会更有意义:

dat <- log(model_data)

forest(x=dat$OR, ci.lb=dat$lower, ci.ub=dat$upper,
       annotate=TRUE, cex=1.2, at=seq(-2,2,1), digits=c(3,1),
       xlim=c(-5,7), xlab="OR", slab=rownames(dat), atransf=exp)

因此,提供日志(OR)和相应的CI边界到函数,然后使用atransf参数进行反向转换。实质上,这会将x轴放在对数刻度上。

至于2:

您必须自己计算磅值,然后通过psize参数将它们提供给函数。

答案 1 :(得分:0)

感谢您的帮助!

通过你的提示和函数的源代码,我终于设法给出了点大小的一个因素:

library(metafor)
model_data <- read.table(dec = ",", text="
                                          OR        lower       upper
                         age              0,9678479 0,9326182   1,002493
                         sex              1,0679667 0,4987457   2,280504
                         ApacheeII        0,9288701 0,8728417   0,984529",
                         header=T)

dat <- log(model_data)
ci.lb = dat$lower
ci.ub = dat$upper

#taken from forest.default source code
level = 95
alpha <- ifelse(level > 1, (100 - level)/100, 1 - level)
vi <- ((ci.ub - ci.lb)/(2 * qnorm(alpha/2, lower.tail = FALSE)))^2
wi <- 1/sqrt(vi)
psize <- wi/sum(wi, na.rm = TRUE)
psize <- (psize - min(psize, na.rm = TRUE))/(max(psize, 
                                                 na.rm = TRUE) - min(psize, na.rm = TRUE))
psize <- (psize * 1) + 0.5

forest(x=dat$OR, 
       ci.lb = ci.lb,
       ci.ub = ci.ub,
       cex = 1.5,
       annotate=FALSE, 
       at=seq(-1,1,1),
       xlim=c(-1.1,1.1),
       xlab="OR",
       slab=rownames(dat),
       psize=psize*.7,
       atransf=exp
)