Causas de distribuições bimodais ao inicializar um modelo de metanálise

8

Ajudo um colega a inicializar um modelo de efeitos mistos de meta-análise usando a estrutura do pacote metafor R da autoria de @Wolfgang.

Interessante e preocupante, para um dos coeficientes do modelo, recebo uma distribuição bimodal durante a inicialização (consulte o painel inferior direito da figura abaixo).

Eu acho que uma das principais causas pode ser o fato de que, durante a inicialização, digamos que metade dos modelos converge em uma solução local e a outra metade em outra. Tentei ajustar o algoritmo de convergência, conforme sugerido nesta documentação da metafor - Problemas de convergência com a função rma () . Além disso, eu tentei outros algoritmos de convergência como bobyqae newuoacomo sugerido na documentação ajuda de rma.mv função, mas tem a mesma resposta bimodal.

Também tentei eliminar alguns dos possíveis discrepantes do grupo problemático, conforme sugerido em Como interpretar a distribuição multimodal da correlação de inicialização , mas sem sucesso.

Não consegui encontrar uma maneira de reproduzir isso, alterando os níveis de fator dos dados e enviando-os no GitHub (os links abaixo devem carregar no seu ambiente tudo o que é necessário para testar o caso). Eu executo a inicialização em um cluster Linux como um trabalho de matriz (por precaução, o shell script é job.sh , que executa em cada CPU o script R bootstrap.r que executa o modelo descrito abaixo). Uma única execução leva de 2 a 3 minutos. Observe que a inicialização 100 vezes também é suficiente para detectar a resposta bimodal. Abaixo está um exemplo para 1000 iterações. Eu estou familiarizado com R e outros métodos, mas não tanto com meta-análise.

Gostaria de receber ajuda para entender se a distribuição bimodal está correta (embora possa ser devido a problemas de convergência) e, se não, então o que se pode fazer a respeito? (além do que eu já tentei)

Abaixo - comparando coeficientes de bootstrapping (linhas vermelhas) e de uma única execução de modelo completo (linhas azuis). Os histogramas representam as distribuições de inicialização para cada coeficiente. A amostragem dos dados para bootstrapping foi feita como seleção com substituição de cada grupo / combinação formada pelos dois efeitos fixos. Seus tamanhos de amostra bruta são:

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)

Criado em 2019-05-02 pelo pacote reprex (v0.2.1)

O modelo é assim:

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

Informações da sessão 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)
Valentin
fonte

Respostas:

6

Obrigado por fornecer os dados e o código. Reapliquei o modelo com o qual você está trabalhando e o segundo componente de variação (para o qual cor_maté especificado) cai para um valor realmente grande, o que é estranho. No entanto, a criação de perfil desse componente de variação (com profile(rmamv_model, sigma2=2)) indica que não há problemas, então não acho que seja um problema de convergência. Em vez disso, acho que o problema surge porque o modelo não inclui um efeito aleatório no nível de estimativa (que basicamente todo modelo meta-analítico deve incluir). Então, eu sugiro que encaixe:

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

Os resultados parecem muito mais razoáveis. Suspeito que isso também possa resolver o problema com a distribuição bimodal de bootstrap desse último coeficiente.

Wolfgang
fonte
1
Obrigado @Wolfgang! Foi corrigido o problema! Os coeficientes parecem agora muito mais razoáveis ​​(eles se ajustam às expectativas / teoria) e também resolveram a questão da distribuição bimodal. Como você está super familiarizado com esses problemas e se os tem em mãos, seria maravilhoso se você também puder fornecer algumas referências revisadas por pares que reforçam a idéia de incorporar um efeito aleatório no nível de observação. Encontrei Harrison, 2014 , mas parece particular para os dados de contagem. Muito obrigado novamente!
Valentin
Eu não conheço uma referência que literalmente diz isso, mas você pode dar uma olhada em: metafor-project.org/doku.php/…
Wolfgang
1

Sem ter acesso a um exemplo reproduzível, é extremamente difícil dar uma resposta definitiva a esse comportamento de inicialização. Supondo que de fato não haja discrepâncias, suspeito que observemos um caso moderado do fenômeno de Stein, especialmente porque uma metodologia de efeito misto sugere alguns agrupamentos em nossos dados.

Dito isso, eu sugeriria ir em frente e examinar algumas das execuções dos valores "incomuns" da f2f2_3:f1f1_2interação, onde existem valores muito diferentes, e investigar a distribuição marginal dessas duas subamostras aleatórias. Por exemplo, em alguns casos, f2f2_3:f1f1_2está bem abaixo de enquanto o modelo estimado sugere valores próximos a . A distribuição marginal é semelhante? Existe um caso de sobreposição insuficiente? Talvez o bootstrap "simples" seja inapropriado e precisamos estratificar a amostra disponível em relação a alguns dos fatores.12.4

usεr11852
fonte
Obrigado pela sua contribuição, os dados estavam disponíveis e prontos para serem carregados nos links fornecidos. O código e os dados ainda devem ser reproduzíveis.
Valentin