【r<-包|元分析】谁更能从治疗中获益?

metawho是一个非常简单的R包,实现了deft 元分析方法(见后面参考文献),相比于之前的元分析方法,deft方法先在研究内进行比较,然后再评估所有研究结论的一致性。该方法被我用于19年发表的文章(见参考文献)中,不过当时我是基于metafor包用几行代码试了一下,然后用邮件咨询文章作者,他使用的是Stata,开发了一个叫ipdmetan的包(比我厉害多了~),最后也是使用stata画的图放在文章里。因为Stata的结果和我使用几行代码的结果一致,所以我在去年7,8月左右想实现一个R版本,在Github创建了相应的仓库。因为对元分析一知半解,当时对包开发也是力不从心,后面请教作者想了解下它开发的stata包的结构也没用回信,此时就不了了之了。

但因为Github有个仓库,然后最近居然有外国朋友发邮件请教我~

Dear Shixiang,

I hope this mail finds you well.

I'm writing to you since I see you developed the metawho R package, and 
I would love to use it. I downloaded it from github, but I can't install 
it, I think there are some issues. Would you be so kind to help me 
installing it?

然后我跟他说我这个包根本就没写,已经弃疗一年了,叫他去找Stata包,然后附送了之前使用的R代码。因为他是一个R用户,所以回信跟我说有个R包就好了。于是我就简单粗糙地造了一个,就有了真正可以用的metawho package,并把我文章的数据放在里面重复了一下结果。

The goal of metawho is to provide simple R implementation of
“Meta-analytical method to Identify Who Benefits Most from Treatments”
(called ‘deft’ approach, see reference #2).

metawho is powered by R package metafor and does not support
dataset contains individuals for now. Please use stata package
ipdmetan if you are more familar with stata code.

Installation

You can install the development version of metawho from GitHub with:

remotes::install_github("ShixiangWang/metawho")

Example

This is a basic example which shows you how to solve a common problem.

If you have HR and confidence intervals, please run deft_prepare()
firstly.

library(metawho)
#> Loading required package: metafor
#> Loading required package: Matrix
#> Loading 'metafor' package (version 2.0-0). For an overview 
#> and introduction to the package please type: help(metafor).

### specify hazard ratios (hr)
hr    <- c(0.30, 0.11, 1.25, 0.63, 0.90, 0.28)
### specify lower bound for hr confidence intervals
ci.lb <- c(0.09, 0.02, 0.82, 0.42, 0.41, 0.12)
### specify upper bound for hr confidence intervals
ci.ub <- c(1.00, 0.56, 1.90, 0.95, 1.99, 0.67)
### trials
trial <- c("Rizvi 2015", "Rizvi 2015",
          "Rizvi 2018", "Rizvi 2018",
          "Hellmann 2018", "Hellmann 2018")
### subgroups
subgroup = rep(c("Male", "Female"), 3)

entry <- paste(trial, subgroup, sep = "-")
### combine as data.frame

wang2019 =
   data.frame(
        entry = entry,
        trial = trial,
        subgroup = subgroup,
        hr = hr,
        ci.lb = ci.lb,
        ci.ub = ci.ub,
        stringsAsFactors = FALSE
       )

deft_prepare(wang2019)
#>                  entry         trial subgroup   hr ci.lb ci.ub   conf_q
#> 1      Rizvi 2015-Male    Rizvi 2015     Male 0.30  0.09  1.00 1.959964
#> 2    Rizvi 2015-Female    Rizvi 2015   Female 0.11  0.02  0.56 1.959964
#> 3      Rizvi 2018-Male    Rizvi 2018     Male 1.25  0.82  1.90 1.959964
#> 4    Rizvi 2018-Female    Rizvi 2018   Female 0.63  0.42  0.95 1.959964
#> 5   Hellmann 2018-Male Hellmann 2018     Male 0.90  0.41  1.99 1.959964
#> 6 Hellmann 2018-Female Hellmann 2018   Female 0.28  0.12  0.67 1.959964
#>           yi       sei
#> 1 -1.2039728 0.6142831
#> 2 -2.2072749 0.8500678
#> 3  0.2231436 0.2143674
#> 4 -0.4620355 0.2082200
#> 5 -0.1053605 0.4030005
#> 6 -1.2729657 0.4387290

Here we load example data.

library(metawho)
data("wang2019")

wang2019
#>                  entry         trial subgroup         yi       sei
#> 1      Rizvi 2015-Male    Rizvi 2015     Male -1.2039728 0.6142718
#> 2    Rizvi 2015-Female    Rizvi 2015   Female -2.2072749 0.8500522
#> 3      Rizvi 2018-Male    Rizvi 2018     Male  0.2231436 0.2143635
#> 4    Rizvi 2018-Female    Rizvi 2018   Female -0.4620355 0.2082161
#> 5   Hellmann 2018-Male Hellmann 2018     Male -0.1053605 0.4029931
#> 6 Hellmann 2018-Female Hellmann 2018   Female -1.2729657 0.4387209

Use deft_do() function to obtain model results.

# The 'Male' is the reference
(res = deft_do(wang2019, group_level = c("Male", "Female")))
#> $all
#> $all$data
#>                  entry         trial subgroup         yi       sei
#> 1      Rizvi 2015-Male    Rizvi 2015     Male -1.2039728 0.6142718
#> 2    Rizvi 2015-Female    Rizvi 2015   Female -2.2072749 0.8500522
#> 3      Rizvi 2018-Male    Rizvi 2018     Male  0.2231436 0.2143635
#> 4    Rizvi 2018-Female    Rizvi 2018   Female -0.4620355 0.2082161
#> 5   Hellmann 2018-Male Hellmann 2018     Male -0.1053605 0.4029931
#> 6 Hellmann 2018-Female Hellmann 2018   Female -1.2729657 0.4387209
#> 
#> $all$model
#> 
#> Fixed-Effects Model (k = 6)
#> 
#> Test for Heterogeneity: 
#> Q(df = 5) = 18.8872, p-val = 0.0020
#> 
#> Model Results:
#> 
#> estimate      se     zval    pval    ci.lb    ci.ub   
#>  -0.3207  0.1289  -2.4883  0.0128  -0.5732  -0.0681  *
#> 
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 
#> 
#> 
#> 
#> $subgroup
#> $subgroup$data
#>           trial        hr      ci.lb     ci.ub   conf_q        yi
#> 1 Hellmann 2018 0.3111111 0.09679207 0.9999798 1.959964 -1.167605
#> 2    Rizvi 2015 0.3666667 0.04694148 2.8640863 1.959964 -1.003302
#> 3    Rizvi 2018 0.5040000 0.28058020 0.9053240 1.959964 -0.685179
#>         sei
#> 1 0.5957176
#> 2 1.0487700
#> 3 0.2988405
#> 
#> $subgroup$model
#> 
#> Fixed-Effects Model (k = 3)
#> 
#> Test for Heterogeneity: 
#> Q(df = 2) = 0.5657, p-val = 0.7536
#> 
#> Model Results:
#> 
#> estimate      se     zval    pval    ci.lb    ci.ub    
#>  -0.7956  0.2589  -3.0738  0.0021  -1.3030  -0.2883  **
#> 
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 
#> 
#> 
#> 
#> attr(,"class")
#> [1] "deft"

Plot the model results with forest() function from metafor
package.

forest(res$subgroup$model, showweights = TRUE)

[图片上传失败...(image-d84a14-1557933576931)]

Modify plot, more see ?forest.rma.

forest(res$subgroup$model, showweights = TRUE, atransf = exp, 
       slab = res$subgroup$data$trial,
       xlab = "Hazard ratio")
op = par(no.readonly = TRUE)
par(cex = 0.75, font = 2)
text(-11, 4.5, "Trial(s)", pos = 4)
text(9, 4.5, "Hazard Ratio [95% CI]", pos = 2)

[图片上传失败...(image-5713b9-1557933576931)]

par(op)

This reproduce Figure 5 of reference #1. Of note, currently metawho
only support HR values. More usage about model fit, prediction and
plotting please refer to metafor package.

References

  • Wang, Shixiang, et al. “The predictive power of tumor mutational
    burden in lung cancer immunotherapy response is influenced by
    patients’ sex.” International journal of cancer (2019).
  • Fisher, David J., et al. “Meta-analytical methods to identify who
    benefits most from treatments: daft, deluded, or deft approach?.”
    bmj 356 (2017): j573.

你可能感兴趣的:(【r<-包|元分析】谁更能从治疗中获益?)