Nguyên nhân của phân phối lưỡng kim khi bootstrapping mô hình phân tích tổng hợp


8

Tôi giúp một đồng nghiệp khởi động mô hình hiệu ứng hỗn hợp phân tích tổng hợp bằng cách sử dụng khung gói metafor R được ủy quyền bởi @Wolfgang.

Thật thú vị và đáng lo ngại, đối với một trong các hệ số của mô hình, tôi nhận được phân phối lưỡng kim khi bootstrapping (xem bảng dưới cùng bên phải của hình bên dưới).

Tôi đoán một trong những nguyên nhân chính có thể là do khi bootstrapping, nói rằng một nửa các mô hình hội tụ trong một giải pháp cục bộ và nửa còn lại trong một giải pháp khác. Tôi đã cố gắng điều chỉnh thuật toán hội tụ như được đề xuất trong tài liệu metafor này - Các vấn đề hội tụ với hàm rma () . Ngoài ra, tôi đã thử các thuật toán hội tụ khác như bobyqanewuoanhư được đề xuất trong tài liệu trợ giúp của hàm rma.mv , nhưng nhận được phản hồi lưỡng kim tương tự.

Tôi cũng đã cố gắng loại bỏ một số ngoại lệ tiềm năng khỏi nhóm có vấn đề như được đề xuất trong Cách giải thích phân phối đa phương thức của mối tương quan khởi động , nhưng không có kết quả.

Tôi không thể tìm cách tái tạo điều này hơn là thay đổi mức yếu tố của dữ liệu và tải nó lên GitHub (các liên kết bên dưới sẽ tải trong môi trường của bạn tất cả những gì cần thiết để kiểm tra trường hợp). Tôi chạy bootstrapping trên cụm Linux dưới dạng một công việc mảng (chỉ trong trường hợp, tập lệnh shell là job.sh , thực thi trên mỗi CPU, tập lệnh R bootstrap.r chạy mô hình được mô tả bên dưới). Một lần chạy mất 2-3 phút. Lưu ý rằng bootstrapping 100 lần cũng đủ để phát hiện phản ứng lưỡng kim. Dưới đây là một ví dụ cho 1000 lần lặp. Tôi quen thuộc với R và các phương pháp khác nhưng không nhiều với phân tích tổng hợp.

Tôi sẽ đánh giá cao sự giúp đỡ với sự hiểu biết nếu phân phối lưỡng kim có ổn không (mặc dù có thể là do vấn đề hội tụ) và nếu không, thì người ta có thể làm gì về nó? (bên cạnh những gì tôi đã thử)

Dưới đây - so sánh các hệ số từ bootstrapping (đường màu đỏ) và từ một lần chạy mô hình đầy đủ duy nhất (đường màu xanh). Các biểu đồ mô tả các phân phối bootstrapping cho mỗi hệ số. Lấy mẫu dữ liệu cho bootstrapping được thực hiện khi chọn thay thế từ mỗi nhóm / kết hợp được hình thành bởi hai hiệu ứng cố định. Cỡ mẫu thô của chúng là:

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)

Được tạo vào ngày 2019-05-02 bởi gói reprex (v0.2.1)

Mô hình đi như thế này:

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

Thông tin phiên 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)

Câu trả lời:


6

Cảm ơn đã cung cấp dữ liệu và mã. Tôi lắp lại mô hình mà bạn đang làm việc và thành phần phương sai thứ hai ( cor_matđược chỉ định) trôi dạt đến một giá trị thực sự lớn, thật lạ. Tuy nhiên, cấu hình thành phần phương sai này (với profile(rmamv_model, sigma2=2)) cho thấy không có vấn đề gì, vì vậy tôi không nghĩ đây là vấn đề hội tụ. Thay vào đó, tôi nghĩ rằng vấn đề phát sinh do mô hình không bao gồm hiệu ứng ngẫu nhiên ở mức ước tính (mà về cơ bản mọi mô hình phân tích tổng hợp nên bao gồm). Vì vậy, tôi sẽ đề nghị để phù hợp:

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

Kết quả nhìn hợp lý hơn nhiều. Tôi nghi ngờ điều này cũng có thể giải quyết vấn đề với phân phối bootstrap lưỡng kim của hệ số cuối cùng đó.


1
Cảm ơn @Wolfgang! Nó đã khắc phục vấn đề! Các hệ số bây giờ hợp lý hơn nhiều (chúng phù hợp với kỳ vọng / lý thuyết) và nó cũng giải quyết được vấn đề phân phối lưỡng kim. Vì bạn rất quen thuộc với các vấn đề như vậy và nếu bạn có sẵn chúng, sẽ rất tuyệt nếu bạn cũng có thể cung cấp một số tài liệu tham khảo được đánh giá ngang hàng để sao lưu ý tưởng kết hợp hiệu ứng ngẫu nhiên ở cấp độ quan sát. Tôi tìm thấy Harrison, 2014 , nhưng dường như đặc biệt cho dữ liệu đếm. Cảm ơn rất nhiều lần nữa!
Valentin

Tôi không biết một tài liệu tham khảo có nghĩa đen nói như vậy, nhưng bạn có thể muốn xem qua: metafor-project.org/doku.php/ tựa
Wolfgang

1

Không có quyền truy cập vào một ví dụ có thể lặp lại là vô cùng khó khăn để đưa ra câu trả lời chắc chắn cho hành vi bootstrapping này. Giả sử rằng thực sự không có ngoại lệ, tôi nghi ngờ rằng chúng ta quan sát thấy một trường hợp nhẹ của hiện tượng Stein đặc biệt là một phương pháp hiệu ứng hỗn hợp cho thấy chúng ta có một số cụm trong dữ liệu của mình.

Như đã nói ở trên, tôi sẽ đề nghị tiếp tục và xem xét một số bước chạy từ các giá trị f2f2_3:f1f1_2tương tác "bất thường" , nơi có các giá trị rất khác nhau và điều tra phân phối biên của hai mẫu phụ ngẫu nhiên này. Ví dụ, trong một số trường hợp, f2f2_3:f1f1_2dưới trong khi mô hình ước tính đề xuất một giá trị gần với . Là phân phối biên tương tự? Có một trường hợp có đủ chồng chéo? Có thể bootstrap "đơn giản" là không phù hợp và chúng ta cần phân tầng mẫu trong tay đối với một số yếu tố.12.4


Cảm ơn cho đầu vào của bạn, dữ liệu đã có sẵn và sẵn sàng để tải tại các liên kết được cung cấp. Mã và dữ liệu vẫn có thể được sao chép.
Valentin ngày
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.