Dados Faltantes

Como que Stan, rstanarm e brms lidam com dados faltantes

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

Dados faltantes são um problema comum em qualquer análise de dados. Tanto Stan, quanto suas interfaces brms e rstanarm usam observações completas nas suas inferências. Então, toda observação que contiver qualquer dado faltante será removida por completa. Isto quer dizer que qualquer linha do seu dataset que tiver dados faltantes nas colunas que são usadas como variáveis do modelo será removida. Temos duas abordagens básicas para lidar com dados faltantes1:

  1. remover os dados faltantes
  2. imputar valores nos dados faltantes

Remover dados faltantes

A remoção de dados faltantes se divide em duas principais abordagens usando a função na.omit() do pacote base stats:

  1. remoção de observações com dados faltantes: aqui removemos as linhas com dados faltantes df <- na.omit(df)
  2. remoção de variáveis com dados faltantes: aqui removemos as colunas com dados faltantes df <- t(na.omit(t(df)))

Imputar valores nos dados faltantes

Dentre as diversas maneiras de imputar valores ao dados faltantes, as mais comuns são três:

  1. imputar a média
  2. imputar a mediana
  3. imputar o último valor ocorrido (muito usada em séries temporais)

Mas ainda há maneiras mais avançadas e que desempenham melhor em certas condições (não cobriremos essas técnicas nesse curso):

  1. k-nearest neighbors imputation
  2. random forest imputation

Há um pacote de R chamado DescTools(Andri et mult. al., 2021): uma coleção de funções focadas especialmente na parte descritiva de análise de um dataset.

Para mostrar as abordagens, geramos um dataset de uma série temporal de uma semana com dados faltantes. O dataset df contém duas colunas: dia com o dia da semana; e valor representando uma mensuração observada naquele dia. Aproveito para incluir dois dados faltantes na coluna valor de maneira aleatória:

library(DescTools)
set.seed(123)
df <- tibble(
  dia = c("seg", "ter", "qua", "qui", "sex", "sab", "dom"),
  valor = runif(7))
indices_aleatorios <- sample(1:nrow(df), 2)
df[indices_aleatorios[1], 2] <- NA
df[indices_aleatorios[2], 2] <- NA
df
# A tibble: 7 x 2
  dia    valor
  <chr>  <dbl>
1 seg    0.288
2 ter    0.788
3 qua   NA    
4 qui    0.883
5 sex    0.940
6 sab   NA    
7 dom    0.528

Imputar a média

Para imputar a média nos dados faltantes usamos a função Impute() com o argumento FUN = mean():

df$media <- Impute(df$valor, FUN = mean(df$valor, na.rm = TRUE))

Imputar a mediana

Para imputar a mediana nos dados faltantes usamos a função Impute() com o argumento FUN = median():

df$mediana <- Impute(df$valor, FUN = median(df$valor, na.rm = TRUE))

Imputar o último valor ocorrido

Para imputar a média nos dados faltantes usamos a função LOC() (um acrônimo para Last Observation Carried Forward):

df$ultimo <- LOCF(df$valor)

Comparação dos resultados

Veja a comparação dos resultados.

df
# A tibble: 7 x 5
  dia    valor media mediana ultimo
  <chr>  <dbl> <dbl>   <dbl>  <dbl>
1 seg    0.288 0.288   0.288  0.288
2 ter    0.788 0.788   0.788  0.788
3 qua   NA     0.685   0.788  0.788
4 qui    0.883 0.883   0.883  0.883
5 sex    0.940 0.940   0.940  0.940
6 sab   NA     0.685   0.788  0.940
7 dom    0.528 0.528   0.528  0.528

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] DescTools_0.99.41    gapminder_0.3.0      ggExtra_0.9         
 [4] dplyr_1.0.6          rstan_2.21.2         StanHeaders_2.21.0-7
 [7] MASS_7.3-54          ggforce_0.3.3        gganimate_1.0.7     
[10] plotly_4.9.3         carData_3.0-4        DiagrammeR_1.0.6.1  
[13] brms_2.15.0          rstanarm_2.21.1      Rcpp_1.0.6          
[16] skimr_2.1.3          readr_1.4.0          readxl_1.3.1        
[19] tibble_3.1.2         ggplot2_3.3.3        patchwork_1.1.1     
[22] cowplot_1.1.1       

loaded via a namespace (and not attached):
  [1] backports_1.2.1      systemfonts_1.0.2    plyr_1.8.6          
  [4] igraph_1.2.6         lazyeval_0.2.2       repr_1.1.3          
  [7] splines_4.1.0        crosstalk_1.1.1      rstantools_2.1.1    
 [10] inline_0.3.19        digest_0.6.27        htmltools_0.5.1.1   
 [13] magick_2.7.2         rsconnect_0.8.18     fansi_0.5.0         
 [16] magrittr_2.0.1       RcppParallel_5.1.4   matrixStats_0.59.0  
 [19] xts_0.12.1           prettyunits_1.1.1    colorspace_2.0-1    
 [22] textshaping_0.3.4    xfun_0.23            callr_3.7.0         
 [25] crayon_1.4.1         jsonlite_1.7.2       Exact_2.1           
 [28] lme4_1.1-27          survival_3.2-11      zoo_1.8-9           
 [31] glue_1.4.2           polyclip_1.10-0      gtable_0.3.0        
 [34] V8_3.4.2             pkgbuild_1.2.0       abind_1.4-5         
 [37] scales_1.1.1         mvtnorm_1.1-1        DBI_1.1.1           
 [40] miniUI_0.1.1.1       isoband_0.2.4        progress_1.2.2      
 [43] viridisLite_0.4.0    xtable_1.8-4         tmvnsim_1.0-2       
 [46] proxy_0.4-25         stats4_4.1.0         DT_0.18             
 [49] httr_1.4.2           htmlwidgets_1.5.3    threejs_0.3.3       
 [52] RColorBrewer_1.1-2   ellipsis_0.3.2       pkgconfig_2.0.3     
 [55] loo_2.4.1            farver_2.1.0         sass_0.4.0          
 [58] here_1.0.1           utf8_1.2.1           tidyselect_1.1.1    
 [61] labeling_0.4.2       rlang_0.4.11         reshape2_1.4.4      
 [64] later_1.2.0          visNetwork_2.0.9     munsell_0.5.0       
 [67] cellranger_1.1.0     tools_4.1.0          cli_2.5.0           
 [70] generics_0.1.0       gifski_1.4.3-1       ggridges_0.5.3      
 [73] evaluate_0.14        stringr_1.4.0        fastmap_1.1.0       
 [76] yaml_2.2.1           ragg_1.1.2           processx_3.5.2      
 [79] knitr_1.33           purrr_0.3.4          rootSolve_1.8.2.1   
 [82] nlme_3.1-152         mime_0.10            projpred_2.0.2      
 [85] xml2_1.3.2           compiler_4.1.0       bayesplot_1.8.0     
 [88] shinythemes_1.2.0    rstudioapi_0.13      curl_4.3.1          
 [91] gamm4_0.2-6          png_0.1-7            e1071_1.7-7         
 [94] tweenr_1.0.2         bslib_0.2.5.1        stringi_1.6.2       
 [97] highr_0.9            ps_1.6.0             Brobdingnag_1.2-6   
[100] lattice_0.20-44      Matrix_1.3-3         nloptr_1.2.2.2      
[103] markdown_1.1         shinyjs_2.0.0        vctrs_0.3.8         
[106] pillar_1.6.1         lifecycle_1.0.0      jquerylib_0.1.4     
[109] bridgesampling_1.1-2 data.table_1.14.0    lmom_2.8            
[112] httpuv_1.6.1         R6_2.5.0             bookdown_0.22       
[115] promises_1.2.0.1     gridExtra_2.3        gld_2.6.2           
[118] codetools_0.2-18     distill_1.2          boot_1.3-28         
[121] colourpicker_1.1.0   gtools_3.8.2         assertthat_0.2.1    
[124] rprojroot_2.0.2      withr_2.4.2          mnormt_2.0.2        
[127] shinystan_2.5.0      expm_0.999-6         mgcv_1.8-35         
[130] parallel_4.1.0       hms_1.1.0            grid_4.1.0          
[133] class_7.3-19         tidyr_1.1.3          coda_0.19-4         
[136] minqa_1.2.4          rmarkdown_2.8        downlit_0.2.1       
[139] shiny_1.6.0          lubridate_1.7.10     base64enc_0.1-3     
[142] dygraphs_1.1.1.6    
Andri et mult. al., S. (2021). DescTools: Tools for descriptive statistics. Retrieved from https://cran.r-project.org/package=DescTools

  1. há uma terceira que é modelar os dados faltantes, veja a vinheta do brms para mais detalhes↩︎

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: Dados Faltantes. Retrieved from https://storopoli.github.io/Estatistica-Bayesiana/aux-Dados_Faltantes.html

BibTeX citation

@misc{storopoli2021dadosfaltantesR,
  author = {Storopoli, Jose},
  title = {Estatística Bayesiana com R e Stan: Dados Faltantes},
  url = {https://storopoli.github.io/Estatistica-Bayesiana/aux-Dados_Faltantes.html},
  year = {2021}
}