3  Dados Faltantes

A seguir, vamos discutir a análise de dados faltantes na base colon.csv. Trata-se de uma modificação dos dados apresentados em Laurie et al. (1989). A base contém dados de um dos primeiros ensaios bem-sucedidos de quimioterapia adjuvante para câncer de cólon. Levamisol é um composto de baixa toxicidade anteriormente usado para tratar infestações por vermes em animais; O 5-FU é um agente quimioterápico moderadamente tóxico (no que diz respeito a essas coisas). Existem dois registros por pessoa, um de reincidência e outro de óbito.

Para prosseguir, vamos importar a base de dados (que se encontra com extesnão .csv). Para tal, precisamos incluir a base de dados e o script no projeto criado, podemos executar os comandos a seguir.

#Ativando pacotes
library(readr)
library(dplyr)

#Importando o banco colon.csv
base_colon = read_csv(file = "colon.csv") #informar o nome do arquivo

#Visualizando o objeto
base_colon
# A tibble: 929 × 34
      id rx        sex   age obstruct perfor adhere nodes status differ extent
   <dbl> <chr>   <dbl> <dbl>    <dbl>  <dbl>  <dbl> <dbl>  <dbl>  <dbl>  <dbl>
 1     1 Lev+5FU     1    43       NA      0      0     5      1      2      3
 2     2 Lev+5FU     1    63        0      0      0     1      0      2      3
 3     3 Obs         0    71        0      0      1     7      1      2      2
 4     4 Lev+5FU     0    66        1      0      0     6      1      2      3
 5     5 Obs         1    69        0      0      0    22      1      2      3
 6     6 Lev+5FU     0    57        0      0      0     9      1      2      3
 7     7 Lev         1    77        0      0      0     5      1      2      3
 8     8 Obs         1    54        0      0      0     1      0      2      3
 9     9 Lev         1    46        0      0      1     2      0      2      3
10    10 Lev+5FU     0    68        0      0      0     1      0      2      3
# ℹ 919 more rows
# ℹ 23 more variables: surg <dbl>, node4 <dbl>, time <dbl>, sex.factor <chr>,
#   rx.factor <chr>, obstruct.factor <chr>, perfor.factor <chr>,
#   adhere.factor <chr>, differ.factor <chr>, extent.factor <chr>,
#   surg.factor <chr>, node4.factor <chr>, status.factor <chr>,
#   age.factor <chr>, loccomp <dbl>, loccomp.factor <chr>, time.years <dbl>,
#   mort_5yr <chr>, age.10 <dbl>, mort_5yr.num <dbl>, hospital <chr>, …

3.1 Tabulando dados faltantes

A seguir, vamos apresentar algumas formas de tabular os dados faltantes na base de dados.

#Ativando pacote
library(naniar)

#Visualizando o % de dados faltantes por variável
gg_miss_var(x = base_colon,
            show_pct = TRUE)

#Obtendo n e % de dados faltantes para cada variável
porc_faltantes = base_colon |> 
  miss_var_summary()

porc_faltantes
# A tibble: 34 × 3
   variable        n_miss pct_miss
   <chr>            <int>    <dbl>
 1 smoking_mar        227    24.4 
 2 smoking_mcar        98    10.5 
 3 differ              23     2.48
 4 differ.factor       23     2.48
 5 obstruct            21     2.26
 6 obstruct.factor     21     2.26
 7 loccomp             20     2.15
 8 loccomp.factor      20     2.15
 9 nodes               18     1.94
10 surg                17     1.83
# ℹ 24 more rows

Vamos obter algumas medidas descritivas para algumas variáveis, comparando homens e mulheres, incluindo os quantitativos de NA por variável.

#Criando uma tabela comparando os resultados entre homens e mulheres para conhecermos melhor os dados
base_colon |> 
  dplyr::group_by(sex.factor) |> 
  furniture::table1("Age, years" = age,
                    "Sex, binary" = sex.factor,
                    "Number of Nodes" = nodes,
                    "Extent of spread" = extent.factor,
                    "Perforation" = perfor.factor,
                    "Mortality, 5 years" = mort_5yr,
                    "Smoking (MCAR)" = smoking_mcar,
                    "Smoking (MAR)" = smoking_mar,
                    total = TRUE,
                    na.rm = FALSE,
                    digits = 2,
                    output = "markdown")
Total Female Male
n = 929 n = 445 n = 484
Age, years
59.75 (11.95) 59.49 (12.28) 60.00 (11.64)
Sex, binary
Female 445 (47.9%) 445 (100%) 0 (0%)
Male 484 (52.1%) 0 (0%) 484 (100%)
NA 0 (0%) 0 (0%) 0 (0%)
Number of Nodes
3.66 (3.57) 3.73 (3.55) 3.59 (3.59)
Extent of spread
Adjacent structures 43 (4.6%) 19 (4.3%) 24 (5%)
Muscle 106 (11.4%) 47 (10.6%) 59 (12.2%)
Serosa 759 (81.7%) 366 (82.2%) 393 (81.2%)
Submucosa 21 (2.3%) 13 (2.9%) 8 (1.7%)
NA 0 (0%) 0 (0%) 0 (0%)
Perforation
No 902 (97.1%) 432 (97.1%) 470 (97.1%)
Yes 27 (2.9%) 13 (2.9%) 14 (2.9%)
NA 0 (0%) 0 (0%) 0 (0%)
Mortality, 5 years
Alive 511 (55%) 243 (54.6%) 268 (55.4%)
Died 404 (43.5%) 194 (43.6%) 210 (43.4%)
NA 14 (1.5%) 8 (1.8%) 6 (1.2%)
Smoking (MCAR)
Non-smoker 645 (69.4%) 336 (75.5%) 309 (63.8%)
Smoker 186 (20%) 64 (14.4%) 122 (25.2%)
NA 98 (10.5%) 45 (10.1%) 53 (11%)
Smoking (MAR)
Non-smoker 573 (61.7%) 236 (53%) 337 (69.6%)
Smoker 129 (13.9%) 40 (9%) 89 (18.4%)
NA 227 (24.4%) 169 (38%) 58 (12%)

Visualizando as posições dos dados faltantes na base de dados.

base_colon |> 
  dplyr::select(age, sex.factor, nodes, extent.factor, perfor.factor, obstruct.factor, 
                mort_5yr, smoking_mcar, smoking_mar,) |>
  finalfit::missing_plot()

Outras formas de avaliar padrões de dados faltantes visualmente.

base_colon |> 
  dplyr::select(age, sex.factor, nodes, extent.factor, perfor.factor, obstruct.factor, 
                mort_5yr, smoking_mcar, smoking_mar,) |>
  finalfit::missing_pattern()

    age sex.factor extent.factor perfor.factor mort_5yr nodes obstruct.factor
590   1          1             1             1        1     1               1
194   1          1             1             1        1     1               1
72    1          1             1             1        1     1               1
20    1          1             1             1        1     1               1
14    1          1             1             1        1     1               0
5     1          1             1             1        1     1               0
2     1          1             1             1        1     1               0
11    1          1             1             1        1     0               1
5     1          1             1             1        1     0               1
1     1          1             1             1        1     0               1
1     1          1             1             1        1     0               1
10    1          1             1             1        0     1               1
2     1          1             1             1        0     1               1
2     1          1             1             1        0     1               1
      0          0             0             0       14    18              21
    smoking_mcar smoking_mar    
590            1           1   0
194            1           0   1
72             0           1   1
20             0           0   2
14             1           1   1
5              1           0   2
2              0           1   2
11             1           1   1
5              1           0   2
1              0           1   2
1              0           0   3
10             1           1   1
2              1           0   2
2              0           1   2
              98         227 378
base_colon |> 
  dplyr::select(age, sex.factor, nodes, extent.factor, perfor.factor, obstruct.factor, 
                mort_5yr, smoking_mcar, smoking_mar,) |>
  finalfit::missing_pairs(position = "fill")

3.2 Teste MCAR

Use a estatística de teste de Little (1988) para avaliar se os dados estão faltando completamente aleatoriamente (MCAR). A hipótese nula neste teste é que os dados são MCAR e a estatística do teste é um valor qui-quadrado. Se p-valor for menor do que o nível de significância adotado, podemos concluir que os dados não são MCAR.

base_colon |> 
  dplyr::select(age, sex.factor, nodes, extent.factor, perfor.factor,
                mort_5yr, smoking_mcar, smoking_mar) |>
  mcar_test()
# A tibble: 1 × 4
  statistic    df      p.value missing.patterns
      <dbl> <dbl>        <dbl>            <int>
1      143.    63 0.0000000325               11

Conclusão: o teste fornece evidências que os dados faltantes nas variáveis analisadas não são MCAR.

3.3 Teste MAR

base_colon |> 
  finalfit::missing_compare(explanatory = c("age", "sex.factor", "nodes", "extent.factor", "perfor.factor", 
                                            "smoking_mcar", "smoking_mar"),
                            dependent = "mort_5yr")
 Missing data analysis: mort_5yr                     Not missing     Missing
                             age           Mean (SD) 59.8 (11.9) 53.9 (12.7)
                      sex.factor              Female  437 (98.2)     8 (1.8)
                                                Male  478 (98.8)     6 (1.2)
                           nodes           Mean (SD)   3.7 (3.6)   2.9 (2.8)
                   extent.factor Adjacent structures   42 (97.7)     1 (2.3)
                                              Muscle  103 (97.2)     3 (2.8)
                                              Serosa  750 (98.8)     9 (1.2)
                                           Submucosa   20 (95.2)     1 (4.8)
                   perfor.factor                  No  888 (98.4)    14 (1.6)
                                                 Yes  27 (100.0)            
                    smoking_mcar          Non-smoker  636 (98.6)     9 (1.4)
                                              Smoker  183 (98.4)     3 (1.6)
                     smoking_mar          Non-smoker  565 (98.6)     8 (1.4)
                                              Smoker  125 (96.9)     4 (3.1)
     p
 0.066
 0.669
      
 0.441
 0.325
      
      
      
 1.000
      
 1.000
      
 0.330
      

Conclusão: Não há evidências de que a omissão na mortalidade de esteja associada a qualquer uma das variáveis: idade, sexo, extensão da disseminação, perfuração e tabagismo (ambas variáveis),

base_colon |> 
  finalfit::missing_compare(explanatory = c("age", "sex.factor", "nodes", "extent.factor", "perfor.factor", 
                                            "mort_5yr", "smoking_mar"),
                            dependent = "smoking_mcar")
 Missing data analysis: smoking_mcar                     Not missing
                                 age           Mean (SD) 59.7 (12.0)
                          sex.factor              Female  400 (89.9)
                                                    Male  431 (89.0)
                               nodes           Mean (SD)   3.7 (3.6)
                       extent.factor Adjacent structures   38 (88.4)
                                                  Muscle   92 (86.8)
                                                  Serosa  682 (89.9)
                                               Submucosa   19 (90.5)
                       perfor.factor                  No  806 (89.4)
                                                     Yes   25 (92.6)
                            mort_5yr               Alive  456 (89.2)
                                                    Died  363 (89.9)
                         smoking_mar          Non-smoker  510 (89.0)
                                                  Smoker  115 (89.1)
     Missing     p
 60.1 (11.8) 0.768
   45 (10.1) 0.758
   53 (11.0)      
   3.6 (3.7) 0.920
    5 (11.6) 0.801
   14 (13.2)      
   77 (10.1)      
     2 (9.5)      
   96 (10.6) 0.825
     2 (7.4)      
   55 (10.8) 0.847
   41 (10.1)      
   63 (11.0) 1.000
   14 (10.9)      

Conclusão: Não há evidências de que a omissão na variável tabagismo (versão MCAR) esteja associada a qualquer uma das variáveis: idade, sexo, extensão da disseminação e perfuração.

base_colon |> 
  finalfit::missing_compare(explanatory = c("age", "sex.factor", "nodes", "extent.factor", "perfor.factor", 
                                            "mort_5yr", "smoking_mcar"),
                            dependent = "smoking_mar")
 Missing data analysis: smoking_mar                     Not missing     Missing
                                age           Mean (SD) 59.8 (11.8) 59.7 (12.4)
                         sex.factor              Female  276 (62.0)  169 (38.0)
                                                   Male  426 (88.0)   58 (12.0)
                              nodes           Mean (SD)   3.5 (3.2)   4.2 (4.6)
                      extent.factor Adjacent structures   33 (76.7)   10 (23.3)
                                                 Muscle   76 (71.7)   30 (28.3)
                                                 Serosa  577 (76.0)  182 (24.0)
                                              Submucosa   16 (76.2)    5 (23.8)
                      perfor.factor                  No  684 (75.8)  218 (24.2)
                                                    Yes   18 (66.7)    9 (33.3)
                           mort_5yr               Alive  390 (76.3)  121 (23.7)
                                                   Died  300 (74.3)  104 (25.7)
                       smoking_mcar          Non-smoker  490 (76.0)  155 (24.0)
                                                 Smoker  135 (72.6)   51 (27.4)
      p
  0.897
 <0.001
       
  0.007
  0.806
       
       
       
  0.387
       
  0.521
       
  0.397
       

Conclusão: Há evidências de que a omissão na variável tabagismo (versão MAR) está associada ao sexo.