@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)