メタ分析モデルをブートストラップするときの二峰分布の原因


8

@Wolfgangが作成したmetafor Rパッケージフレームワークを使用して、同僚がメタ分析混合効果モデルをブートストラップするのを支援します。

興味深いことに、心配なことに、モデルの係数の1つについて、ブートストラップ時に二峰性分布が得られます(下図の右下のパネルを参照)。

主な原因の1つは、ブートストラップ時に、モデルの半分がローカルソリューションに収束し、残りの半分が別のソリューションに収束することであると考えられます。このmetaforドキュメント-rma ()関数での収束問題)で提案されているように、収束アルゴリズムを調整しようとしました。また、rma.mv関数のヘルプドキュメントで提案されているようなbobyqa、他の収束アルゴリズムを試しましたが、同じバイモーダル応答が得られました。newuoa

ブートストラップ相関のマルチモーダル分布を解釈する方法」で提案されているように、問題のあるグループからいくつかの潜在的な外れ値を排除しようとしましたが、役に立ちませんでした。

データの因子レベルを変更してGitHubにアップロードする以外に、これを再現する方法を見つけることができませんでした(以下のリンクは、ケースのテストに必要なすべてを環境にロードする必要があります)。Linuxクラスターでブートストラップを配列ジョブとして実行します(念のため、シェルスクリプトはjob.shです。これは、各CPUで、以下で説明するモデルを実行するRスクリプトbootstrap.rを実行します)。1回の実行には2〜3分かかります。二峰性応答を検出するには、100回のブートストラップでも十分であることに注意してください。以下は1000回の反復の例です。私はRや他の方法に精通していますが、メタ分析にはそれほど詳しくありません。

二峰性の分布に問題がないかどうか(収束の問題が原因である可能性があります)を理解し、そうでない場合は、どうすればよいですか?(私がすでに試したこと以外に)

以下-ブートストラップ(赤い線)と単一の完全なモデル実行(青い線)からの係数を比較します。ヒストグラムは、各係数のブートストラップ分布を示しています。ブートストラップ用のデータのサンプリングは、2つの固定効果によって形成された各グループ/組み合わせからの置換で選択することで行われました。生のサンプルサイズは次のとおりです。

table(dt$f1, dt$f2)
#>       
#>        f2_1 f2_2 f2_3
#>   f1_1  177  174   41
#>   f1_2  359  363  107
library(data.table)
library(ggplot2)
library(metafor)
#> Loading required package: Matrix
#> Loading 'metafor' package (version 2.0-0). For an overview 
#> and introduction to the package please type: help(metafor).

load(url("https://github.com/valentinitnelav/test/raw/master/bimodal_distrib_boot/coef_boot_dt_1010.rda"))
load(url("https://github.com/valentinitnelav/test/raw/master/bimodal_distrib_boot/rmamv_model.rda"))
load(url("https://github.com/valentinitnelav/test/raw/master/bimodal_distrib_boot/data.rda"))

coef_dt <- data.frame(estim = rmamv_model[["beta"]])
coef_dt$coef_name <- rownames(coef_dt)
coef_dt <- rbind(coef_dt,
                 coef_boot_dt[, .(estim = mean(coef)), by = coef_name])
coef_dt[, gr := rep(c("estim_model", "estim_boot"), each = 6)]

ggplot(data = coef_boot_dt,
       aes(x = coef,
           group = coef_name)) +
  geom_histogram(bins = 100) +
  geom_vline(aes(xintercept = estim,
                 group = gr,
                 color = gr),
             lwd = 1,
             data = coef_dt) +
  facet_wrap(vars(coef_name), ncol = 2)

reprexパッケージ(v0.2.1)によって2019-05-02に作成されました

モデルは次のようになります。

rmamv_model <- rma.mv(y ~ f2:f1 - 1,
                  V = var_y,
                  random = list(~ 1|r1,
                                ~ 1|r2),
                  R = list(r2 = cor_mat),
                  data = dt,
                  method = "REML",
                  # Tune the convergence algorithm / optimizer
                  control = list(optimizer = "nlminb",
                                 iter.max = 1000,
                                 step.min = 0.4,
                                 step.max = 0.5))

Rセッション情報:

devtools::session_info()
#> - Session info ----------------------------------------------------------
#>  setting  value                       
#>  version  R version 3.5.2 (2018-12-20)
#>  os       Windows 7 x64 SP 1          
#>  system   x86_64, mingw32             
#>  ui       RTerm                       
#>  language (EN)                        
#>  collate  English_United States.1252  
#>  ctype    English_United States.1252               
#>  date     2019-05-02                  
#> 
#> - Packages --------------------------------------------------------------
#>  package     * version date       lib source        
#>  assertthat    0.2.1   2019-03-21 [1] CRAN (R 3.5.2)
#>  backports     1.1.3   2018-12-14 [1] CRAN (R 3.5.2)
#>  callr         3.2.0   2019-03-15 [1] CRAN (R 3.5.3)
#>  cli           1.1.0   2019-03-19 [1] CRAN (R 3.5.3)
#>  colorspace    1.4-1   2019-03-18 [1] CRAN (R 3.5.3)
#>  crayon        1.3.4   2017-09-16 [1] CRAN (R 3.5.1)
#>  curl          3.3     2019-01-10 [1] CRAN (R 3.5.2)
#>  data.table  * 1.12.0  2019-01-13 [1] CRAN (R 3.5.2)
#>  desc          1.2.0   2018-05-01 [1] CRAN (R 3.5.1)
#>  devtools      2.0.1   2018-10-26 [1] CRAN (R 3.5.1)
#>  digest        0.6.18  2018-10-10 [1] CRAN (R 3.5.1)
#>  dplyr         0.8.0.1 2019-02-15 [1] CRAN (R 3.5.2)
#>  evaluate      0.13    2019-02-12 [1] CRAN (R 3.5.2)
#>  fs            1.2.7   2019-03-19 [1] CRAN (R 3.5.3)
#>  ggplot2     * 3.1.0   2018-10-25 [1] CRAN (R 3.5.1)
#>  glue          1.3.1   2019-03-12 [1] CRAN (R 3.5.2)
#>  gtable        0.2.0   2016-02-26 [1] CRAN (R 3.5.1)
#>  highr         0.8     2019-03-20 [1] CRAN (R 3.5.3)
#>  htmltools     0.3.6   2017-04-28 [1] CRAN (R 3.5.1)
#>  httr          1.4.0   2018-12-11 [1] CRAN (R 3.5.2)
#>  knitr         1.22    2019-03-08 [1] CRAN (R 3.5.2)
#>  labeling      0.3     2014-08-23 [1] CRAN (R 3.5.0)
#>  lattice       0.20-38 2018-11-04 [2] CRAN (R 3.5.2)
#>  lazyeval      0.2.2   2019-03-15 [1] CRAN (R 3.5.3)
#>  magrittr      1.5     2014-11-22 [1] CRAN (R 3.5.1)
#>  Matrix      * 1.2-15  2018-11-01 [2] CRAN (R 3.5.2)
#>  memoise       1.1.0   2017-04-21 [1] CRAN (R 3.5.1)
#>  metafor     * 2.0-0   2017-06-22 [1] CRAN (R 3.5.2)
#>  mime          0.6     2018-10-05 [1] CRAN (R 3.5.1)
#>  munsell       0.5.0   2018-06-12 [1] CRAN (R 3.5.1)
#>  nlme          3.1-137 2018-04-07 [2] CRAN (R 3.5.2)
#>  pillar        1.3.1   2018-12-15 [1] CRAN (R 3.5.2)
#>  pkgbuild      1.0.3   2019-03-20 [1] CRAN (R 3.5.3)
#>  pkgconfig     2.0.2   2018-08-16 [1] CRAN (R 3.5.1)
#>  pkgload       1.0.2   2018-10-29 [1] CRAN (R 3.5.1)
#>  plyr          1.8.4   2016-06-08 [1] CRAN (R 3.5.1)
#>  prettyunits   1.0.2   2015-07-13 [1] CRAN (R 3.5.1)
#>  processx      3.3.0   2019-03-10 [1] CRAN (R 3.5.3)
#>  ps            1.3.0   2018-12-21 [1] CRAN (R 3.5.2)
#>  purrr         0.3.2   2019-03-15 [1] CRAN (R 3.5.3)
#>  R6            2.4.0   2019-02-14 [1] CRAN (R 3.5.2)
#>  Rcpp          1.0.1   2019-03-17 [1] CRAN (R 3.5.3)
#>  remotes       2.0.2   2018-10-30 [1] CRAN (R 3.5.1)
#>  rlang         0.3.4   2019-04-07 [1] CRAN (R 3.5.3)
#>  rmarkdown     1.12    2019-03-14 [1] CRAN (R 3.5.3)
#>  rprojroot     1.3-2   2018-01-03 [1] CRAN (R 3.5.1)
#>  scales        1.0.0   2018-08-09 [1] CRAN (R 3.5.1)
#>  sessioninfo   1.1.1   2018-11-05 [1] CRAN (R 3.5.1)
#>  stringi       1.4.3   2019-03-12 [1] CRAN (R 3.5.2)
#>  stringr       1.4.0   2019-02-10 [1] CRAN (R 3.5.1)
#>  tibble        2.1.1   2019-03-16 [1] CRAN (R 3.5.3)
#>  tidyselect    0.2.5   2018-10-11 [1] CRAN (R 3.5.1)
#>  usethis       1.4.0   2018-08-14 [1] CRAN (R 3.5.1)
#>  withr         2.1.2   2018-03-15 [1] CRAN (R 3.5.1)
#>  xfun          0.5     2019-02-20 [1] CRAN (R 3.5.2)
#>  xml2          1.2.0   2018-01-24 [1] CRAN (R 3.5.1)
#>  yaml          2.2.0   2018-07-25 [1] CRAN (R 3.5.1)

回答:


6

データとコードを提供してくれてありがとう。作業しているモデルを再適合させたところ、(cor_mat指定されている)2番目の分散コンポーネントが非常に大きな値にドリフトしましたが、これは奇妙です。ただし、この分散コンポーネントのプロファイリング(を使用profile(rmamv_model, sigma2=2))は問題がないことを示しているため、これは収束の問題ではないと思います。代わりに、モデルには推定レベルの変量効果(基本的にすべてのメタ分析モデルに含める必要があります)が含まれていないため、問題が発生すると思います。だから、私はフィットすることをお勧めします:

dt$id <- 1:nrow(dt)

res <- rma.mv(y ~ f2:f1 - 1,
              V = var_y,
              random = list(~ 1|r1,
                            ~ 1|r2, 
                            ~ 1|id),
              R = list(r2 = cor_mat),
              data = dt,
              method = "REML")

結果ははるかに合理的に見えます。これにより、最後の係数の二峰性のブートストラップ分布の問題も解決されると思います。


1
ありがとう@Wolfgang!問題を修正しました!これで係数ははるかに妥当になり(期待値/理論に適合)、二峰性分布の問題も解決されました。あなたはそのような問題に非常に精通しているので、手元にあれば、観察レベルのランダム効果を組み込むという考えを裏付けるいくつかの査読済みの参考資料も提供できればすばらしいでしょう。私はHarrison、2014年を見つけましたが、カウントデータに特別なようです。本当にありがとうございました!
Valentin

:私は、文字通り、そう言うの参照を知りませんが、あなたは見てとることをお勧めしますmetafor-project.org/doku.php/...を
ヴォルフガング・

1

再現可能な例にアクセスできなければ、このブートストラップ動作に明確な答えを出すことは非常に困難です。実際には異常値がないと仮定すると、特に混合効果の方法論がデータにいくつかのクラスタリングを示唆しているため、スタイン現象の軽度のケースが観察されると思います。

上記を踏まえて、私は先に進んで、f2f2_3:f1f1_2非常に異なる値がある相互作用の「異常な」値からいくつかの実行を見て、これら2つのランダムなサブサンプルの周辺分布を調査することをお勧めします。たとえば、いくつかのケースでf2f2_3:f1f1_2は、はをかなりていますが、推定モデルは近い値を示唆しています 。周辺分布は似ていますか?重複が足りない場合はありますか?多分「単純な」ブートストラップは不適切であり、いくつかの要因に関して手元のサンプルを層別化する必要があります。12.4


入力いただきありがとうございます。データは利用可能であり、提供されたリンクでロードする準備ができています。コードとデータはまだ再現可能でなければなりません。
バレンティン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.