Tabelas para Publicação

Como montar tabelas de modelos Bayesianos prontas para publicação

Jose Storopoli https://scholar.google.com/citations?user=xGU7H1QAAAAJ&hl=en (UNINOVE)https://www.uninove.br
August 1, 2021

Ao invés de ser obrigado a passar horas a fio formatando tabelas em Excel softwares pagos, você pode usar pacotes gratuitos do R para formatar automaticamente suas tabelas. Em especial, eu gosto bastante do pacote gtsummary (Sjoberg et al., 2021) para preparar tabelas prontas para publicação. Inclusive eu fui um dos proponentes de incluir suporte do gtsummary para modelos Bayesianos do rstanarm e brms (veja detalhes nessa issue do GitHub)1. Geralmente uso duas funções do gtsummary no meu fluxo de trabalho:

Para os modelos Bayesianos mostrarei como o gtsummary funciona para modelos brms neste tutorial.

Temas do gtsummary

O gtsummary tem diversos temas interessantes que podem ser definidos com as funções theme_gtsummary_*(). Basta colocar no ínicio do seu markdown. Consulte a documentação dos temas do gtsummary e veja alguns exemplos:

Vou demonstrar as tabelas do gtsummary com o tema do idioma Português nesse tutoria:

Estatísticas Descritivas com o tbl_summary

A função tbl_summary() do gtsummary formata uma tabela de Estatística Descritiva de maneira bem conveniente. Geralmente uso duas opções para reportar os dados. Essas opção vão dentro do argumento statistics to tbl_summary:

Como exemplo, usarei o dataset kidiq (Gelman & Hill, 2007) da Aula 6 - Regressão Linear.

Vejam que aqui eu fiz diversas alterações que vocês podem ver na documentação da função tbl_summary() do gtsummary:

kidiq <- rstanarm::kidiq

tbl_summary(
  kidiq %>% mutate(mom_hs = as.factor(mom_hs)),
  by = mom_hs,
  type = all_continuous() ~ "continuous2",
  statistic = list(
    all_continuous() ~ c("{N_nonmiss}",
                         "{median} ({p25}, {p75})",
                         "{min}, {max}"),
    all_categorical() ~ "{n} ({p}%)"),
  missing = "no",
  digits = all_continuous() ~ 2) %>%
  add_overall() %>%
  # bold variable labels, italicize levels
  bold_labels() %>%
  italicize_levels() %>%
  # change stuff
  modify_header(label ~ "**Variable**") %>%
  modify_spanning_header(c("stat_1", "stat_2") ~ "**Ensino Médio da Mãe**") %>%
  add_n()
Variable N Total, N = 4341 Ensino Médio da Mãe
0, N = 93 1, N = 341
kid_score 434.00
N 434.00 93.00 341.00
Mediana (IQR) 90.00 (74.00, 102.00) 80.00 (58.00, 95.00) 92.00 (77.00, 103.00)
Intervalo 20.00, 144.00 20.00, 136.00 38.00, 144.00
mom_iq 434.00
N 434.00 93.00 341.00
Mediana (IQR) 97.92 (88.66, 110.27) 88.66 (81.83, 99.16) 100.24 (90.45, 113.17)
Intervalo 71.04, 138.89 74.23, 127.54 71.04, 138.89
mom_age 434.00
N 434.00 93.00 341.00
Mediana (IQR) 23.00 (21.00, 25.00) 21.00 (20.00, 24.00) 23.00 (21.00, 25.00)
Intervalo 17.00, 29.00 17.00, 28.00 17.00, 29.00

1 c("N", "Mediana (IQR)", "Intervalo")

Modelos Bayesianos com o tbl_regression

Vou usar o “Modelo 3” da Aula 6 - Regressão Linear que usa o dataset kidiq (Gelman & Hill, 2007) como exemplo:

gaussian_brms <- brm(
  kid_score ~ mom_hs + mom_iq,
  data = kidiq,
  prior = c(
           prior(normal(0, 20), class = b, coef = mom_hs),
           prior(normal(0, 0.5), class = b, coef = mom_iq),
           prior(normal(87, 51), class = Intercept),
           prior(exponential(0.05), class = sigma)
         )
)

Por padrão tbl_regression() somente mostrar os efeitos globais (fixed effects) do modelo brms. Caso queira os efeitos de grupo (random effects) você deve especificar effects = "ran_pars". Além disso, também por padrão é mostrado a média e o desvio padrão dos coeficientes do modelo. Caso queira mediana e desvio absoluto médio use robust = TRUE. Para controlar os percentis a serem reportados da posterior dos parâmetros use conf.level = X. Para concluir, a constante (intercept) não é reportada por padrão, caso queira adicione intercept = TRUE. Veja um exemplo:

tbl_regression(gaussian_brms, robust = TRUE, conf.level = 0.9, intercept = TRUE)
Características Beta 90% CI1
(Intercept) 26 17, 36
mom_hs 6.0 2.5, 9.5
mom_iq 0.56 0.46, 0.65

1 CI = Intervalo de confiança

Ambiente

R version 4.1.0 (2021-05-18)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Big Sur 10.16

Matrix products: default
BLAS:   /Library/Frameworks/R.framework/Versions/4.1/Resources/lib/libRblas.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.1/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods  
[7] base     

other attached packages:
 [1] gtsummary_1.4.1      lm.beta_1.5-1        loo_2.4.1           
 [4] DescTools_0.99.41    gapminder_0.3.0      ggExtra_0.9         
 [7] dplyr_1.0.6          rstan_2.21.2         StanHeaders_2.21.0-7
[10] MASS_7.3-54          ggforce_0.3.3        gganimate_1.0.7     
[13] plotly_4.9.3         carData_3.0-4        DiagrammeR_1.0.6.1  
[16] brms_2.15.0          rstanarm_2.21.1      Rcpp_1.0.6          
[19] skimr_2.1.3          readr_1.4.0          readxl_1.3.1        
[22] tibble_3.1.2         ggplot2_3.3.3        patchwork_1.1.1     
[25] cowplot_1.1.1       

loaded via a namespace (and not attached):
  [1] utf8_1.2.1           tidyselect_1.1.1     lme4_1.1-27         
  [4] htmlwidgets_1.5.3    grid_4.1.0           munsell_0.5.0       
  [7] codetools_0.2-18     ragg_1.1.2           distill_1.2         
 [10] DT_0.18              gifski_1.4.3-1       miniUI_0.1.1.1      
 [13] withr_2.4.2          Brobdingnag_1.2-6    colorspace_2.0-1    
 [16] highr_0.9            knitr_1.33           rstudioapi_0.13     
 [19] stats4_4.1.0         bayesplot_1.8.0      labeling_0.4.2      
 [22] repr_1.1.3           mnormt_2.0.2         polyclip_1.10-0     
 [25] farver_2.1.0         bridgesampling_1.1-2 rprojroot_2.0.2     
 [28] coda_0.19-4          vctrs_0.3.8          generics_0.1.0      
 [31] xfun_0.23            R6_2.5.0             markdown_1.1        
 [34] isoband_0.2.4        gamm4_0.2-6          projpred_2.0.2      
 [37] assertthat_0.2.1     promises_1.2.0.1     scales_1.1.1        
 [40] rootSolve_1.8.2.1    gtable_0.3.0         downlit_0.2.1       
 [43] processx_3.5.2       lmom_2.8             rlang_0.4.11        
 [46] systemfonts_1.0.2    splines_4.1.0        TMB_1.7.20          
 [49] lazyeval_0.2.2       broom_0.7.6          checkmate_2.0.0     
 [52] inline_0.3.19        yaml_2.2.1           reshape2_1.4.4      
 [55] abind_1.4-5          threejs_0.3.3        crosstalk_1.1.1     
 [58] backports_1.2.1      httpuv_1.6.1         rsconnect_0.8.18    
 [61] tools_4.1.0          bookdown_0.22        ellipsis_0.3.2      
 [64] jquerylib_0.1.4      RColorBrewer_1.1-2   proxy_0.4-25        
 [67] ggridges_0.5.3       plyr_1.8.6           base64enc_0.1-3     
 [70] visNetwork_2.0.9     progress_1.2.2       purrr_0.3.4         
 [73] ps_1.6.0             prettyunits_1.1.1    zoo_1.8-9           
 [76] haven_2.4.1          here_1.0.1           magrittr_2.0.1      
 [79] data.table_1.14.0    magick_2.7.2         colourpicker_1.1.0  
 [82] tmvnsim_1.0-2        mvtnorm_1.1-1        matrixStats_0.59.0  
 [85] hms_1.1.0            shinyjs_2.0.0        mime_0.10           
 [88] evaluate_0.14        xtable_1.8-4         shinystan_2.5.0     
 [91] broom.mixed_0.2.6    gridExtra_2.3        rstantools_2.1.1    
 [94] compiler_4.1.0       gt_0.3.0             V8_3.4.2            
 [97] crayon_1.4.1         minqa_1.2.4          htmltools_0.5.1.1   
[100] mgcv_1.8-35          later_1.2.0          tidyr_1.1.3         
[103] expm_0.999-6         Exact_2.1            RcppParallel_5.1.4  
[106] lubridate_1.7.10     DBI_1.1.1            tweenr_1.0.2        
[109] broom.helpers_1.3.0  boot_1.3-28          Matrix_1.3-3        
[112] cli_2.5.0            parallel_4.1.0       igraph_1.2.6        
[115] forcats_0.5.1        pkgconfig_2.0.3      xml2_1.3.2          
[118] dygraphs_1.1.1.6     bslib_0.2.5.1        stringr_1.4.0       
[121] callr_3.7.0          digest_0.6.27        rmarkdown_2.8       
[124] cellranger_1.1.0     gld_2.6.2            curl_4.3.1          
[127] commonmark_1.7       shiny_1.6.0          gtools_3.8.2        
[130] nloptr_1.2.2.2       lifecycle_1.0.0      nlme_3.1-152        
[133] jsonlite_1.7.2       viridisLite_0.4.0    fansi_0.5.0         
[136] labelled_2.8.0       pillar_1.6.1         lattice_0.20-44     
[139] fastmap_1.1.0        httr_1.4.2           pkgbuild_1.2.0      
[142] survival_3.2-11      glue_1.4.2           xts_0.12.1          
[145] png_0.1-7            shinythemes_1.2.0    class_7.3-19        
[148] stringi_1.6.2        sass_0.4.0           textshaping_0.3.4   
[151] e1071_1.7-7         
Gelman, A., & Hill, J. (2007). Data analysis using regression and multilevel/hierarchical models. Cambridge university press.
Sjoberg, D. D., Curry, M., Hannum, M., Larmarange, J., Whiting, K., & Zabor, E. C. (2021). Gtsummary: Presentation-ready data summary and analytic result tables.

  1. se atentem que atualmente (Abril de 2021) suporte para modelos do rstanarm e brms só funcionam na versão de desenvolvimento do GitHub que pode ser instalada com remotes::install_github("ddsjoberg/gtsummary")↩︎

References

Corrections

If you see mistakes or want to suggest changes, please create an issue on the source repository.

Reuse

Text and figures are licensed under Creative Commons Attribution CC BY-SA 4.0. Source code is available at https://github.com/storopoli/Estatistica-Bayesiana, unless otherwise noted. The figures that have been reused from other sources don't fall under this license and can be recognized by a note in their caption: "Figure from ...".

Citation

For attribution, please cite this work as

Storopoli (2021, Aug. 1). Estatística Bayesiana com R e Stan: Tabelas para Publicação. Retrieved from https://storopoli.io/Estatistica-Bayesiana/aux-Tabelas_para_Publicacao.html

BibTeX citation

@misc{storopoli2021tabelaspubR,
  author = {Storopoli, Jose},
  title = {Estatística Bayesiana com R e Stan: Tabelas para Publicação},
  url = {https://storopoli.io/Estatistica-Bayesiana/aux-Tabelas_para_Publicacao.html},
  year = {2021}
}