1. Instalar y cargar paquetes

pacman::p_load(
  readxl,          # Importar archivos de Excel
  dlookr,          # Diagnóstico y exploración de datos
  DataExplorer,    # Exploración de datos
  ggplot2,         # Visualización
  gtsummary,       # Resúmenes estadísticos
  skimr,           # Resumen de datos
  visdat,          # Visualización de valores NA
  corrplot,        # Matriz de correlación
  plotly,          # Gráficos interactivos
  missRanger,      # Imputación de valores faltantes
  flextable,       # Tablas para informes
  tidyverse,       # Colección de paquetes para ciencia de datos
  egg,             #aalinea y combina gráficos de ggplot 
  dplyr,       # pre-procesamiento de datos
   naniar,      # datos faltantes
   finalfit,    # resumenes
  GGally,      # graficos
 mice,       # imputaciones simple y multiple
 janitor, 
 gtsummary
               ) 

2. Set Working Directory

setwd("~/MAESTRIA EPIDEMIOLOGIA ICESI/aseguramiento_datos/semana5-6")

3. Cargar Base de Datos

library(readxl)
datacleanNfinal <- read_excel("datacleanNfinal.xlsx")
View(datacleanNfinal)

4. Verificar que las variables estén adecuadamente codificadas con el tipo de datos

datacleanNfinal %>% dplyr::glimpse()
## Rows: 2,500
## Columns: 23
## $ patient_id         <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, …
## $ age                <dbl> 71, 63, 73, 85, 62, 62, 86, 75, 59, 72, 59, 59, 68,…
## $ sex                <chr> "Male", "Male", "Female", "Female", "Female", "Fema…
## $ bmi                <dbl> 23.8, 30.8, 27.8, 20.0, 30.1, 25.1, 32.4, 28.0, 30.…
## $ systolic_bp        <dbl> 124, 117, 105, 119, 102, 172, 130, 129, 142, 149, 1…
## $ diastolic_bp       <dbl> 66, 83, 65, 93, 78, 92, 75, 83, 82, 80, 76, 84, 71,…
## $ chol_total         <dbl> 120, 188, 226, 229, 203, 236, 302, 268, 179, 142, 1…
## $ ldl                <dbl> 85, 131, 129, 99, 120, 166, 91, 61, 134, 117, 99, 1…
## $ hdl                <dbl> 15, 34, 37, 52, 53, 60, NA, 30, NA, NA, 31, NA, 41,…
## $ triglycerides      <dbl> 70, 125, 192, 170, 124, 150, 108, 148, 357, 258, 15…
## $ ejection_fraction  <dbl> 49.9, 67.5, 74.0, 66.7, 60.6, 62.6, 73.6, 62.6, 49.…
## $ troponin           <dbl> 0.045, 0.036, 0.089, 0.060, 0.060, 0.057, 0.079, 0.…
## $ creatinine         <dbl> 0.96, 0.95, 0.98, NA, 0.93, NA, 0.96, 0.77, NA, NA,…
## $ diabetes           <chr> "Yes", "No", "Yes", "No", "No", "Yes", "No", "Yes",…
## $ hypertension       <chr> "No", "No", "Yes", "Yes", "No", "Yes", "No", "Yes",…
## $ heart_failure      <chr> "No", "No", "No", "No", "No", "No", "Yes", "Yes", "…
## $ smoking_status     <chr> "Never", "Former", NA, NA, "Never", "Never", "Forme…
## $ treat_statin       <chr> "No", "Yes", "No", "Yes", "Yes", "Yes", "No", "Yes"…
## $ treat_beta_blocker <chr> "Yes", "Yes", "Yes", "Yes", "Yes", "No", "Yes", "Ye…
## $ treat_acei         <chr> "No", "No", "No", "Yes", "No", "No", "No", "No", "Y…
## $ length_of_stay     <dbl> 4, 3, 6, 7, 6, 8, 5, 7, 6, 6, 7, 7, 7, 4, 6, 6, 6, …
## $ mortality_30d      <chr> "No", "Yes", "No", "Yes", "No", "Yes", "Yes", "No",…
## $ readmission_30d    <chr> "No", "No", "No", "Yes", "No", "Yes", "No", "No", "…

5. Ver número de datos faltantes por variable (diferentes formas de verlo)

colSums(is.na(datacleanNfinal))
##         patient_id                age                sex                bmi 
##                  0                  2                  0                 12 
##        systolic_bp       diastolic_bp         chol_total                ldl 
##                  1                  0                450                 10 
##                hdl      triglycerides  ejection_fraction           troponin 
##                448                  0                  1                 12 
##         creatinine           diabetes       hypertension      heart_failure 
##                450                  0                  0                  0 
##     smoking_status       treat_statin treat_beta_blocker         treat_acei 
##                449                  0                  0                  0 
##     length_of_stay      mortality_30d    readmission_30d 
##                  0                  0                  0
datacleanNfinal %>%  
  diagnose() %>%
  flextable()

variables

types

missing_count

missing_percent

unique_count

unique_rate

patient_id

numeric

0

0.00

2,500

1.0000

age

numeric

2

0.08

71

0.0284

sex

character

0

0.00

2

0.0008

bmi

numeric

12

0.48

259

0.1036

systolic_bp

numeric

1

0.04

103

0.0412

diastolic_bp

numeric

0

0.00

62

0.0248

chol_total

numeric

450

18.00

192

0.0768

ldl

numeric

10

0.40

157

0.0628

hdl

numeric

448

17.92

83

0.0332

triglycerides

numeric

0

0.00

239

0.0956

ejection_fraction

numeric

1

0.04

422

0.1688

troponin

numeric

12

0.48

274

0.1096

creatinine

numeric

450

18.00

143

0.0572

diabetes

character

0

0.00

2

0.0008

hypertension

character

0

0.00

2

0.0008

heart_failure

character

0

0.00

2

0.0008

smoking_status

character

449

17.96

4

0.0016

treat_statin

character

0

0.00

2

0.0008

treat_beta_blocker

character

0

0.00

2

0.0008

treat_acei

character

0

0.00

2

0.0008

length_of_stay

numeric

0

0.00

15

0.0060

mortality_30d

character

0

0.00

2

0.0008

readmission_30d

character

0

0.00

2

0.0008

skimr::skim(datacleanNfinal)
Data summary
Name datacleanNfinal
Number of rows 2500
Number of columns 23
_______________________
Column type frequency:
character 10
numeric 13
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
sex 0 1.00 4 6 0 2 0
diabetes 0 1.00 2 3 0 2 0
hypertension 0 1.00 2 3 0 2 0
heart_failure 0 1.00 2 3 0 2 0
smoking_status 449 0.82 5 7 0 3 0
treat_statin 0 1.00 2 3 0 2 0
treat_beta_blocker 0 1.00 2 3 0 2 0
treat_acei 0 1.00 2 3 0 2 0
mortality_30d 0 1.00 2 3 0 2 0
readmission_30d 0 1.00 2 3 0 2 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
patient_id 0 1.00 1250.50 721.83 1.00 625.75 1250.50 1875.25 2500.00 ▇▇▇▇▇
age 2 1.00 65.38 12.65 23.00 57.00 65.00 74.00 95.00 ▁▂▇▇▂
bmi 12 1.00 27.84 5.03 15.00 24.40 27.80 31.30 45.60 ▂▇▇▂▁
systolic_bp 1 1.00 130.45 19.82 90.00 117.00 130.00 144.00 198.00 ▃▇▆▂▁
diastolic_bp 0 1.00 79.77 9.85 50.00 73.00 80.00 86.00 114.00 ▁▅▇▃▁
chol_total 450 0.82 201.19 39.57 120.00 173.00 201.00 228.00 337.00 ▃▇▇▂▁
ldl 10 1.00 120.69 29.84 50.00 100.00 121.00 141.00 250.00 ▂▇▆▁▁
hdl 448 0.82 50.21 14.90 15.00 40.00 50.00 61.00 100.00 ▂▇▇▂▁
triglycerides 0 1.00 155.32 47.19 50.00 121.00 149.00 182.00 439.00 ▅▇▂▁▁
ejection_fraction 1 1.00 54.65 9.66 18.40 47.80 54.90 61.40 75.00 ▁▂▆▇▃
troponin 12 1.00 0.07 0.06 0.00 0.03 0.05 0.09 0.65 ▇▁▁▁▁
creatinine 450 0.82 1.02 0.26 0.42 0.83 0.99 1.19 2.31 ▃▇▃▁▁
length_of_stay 0 1.00 6.04 2.22 1.00 4.00 6.00 7.00 15.00 ▂▇▅▁▁

6. Buscar patrones de falta

6.1 Diagrama de Pareto

datacleanNfinal %>%  
  plot_na_pareto(., only_na = TRUE)
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## ℹ The deprecated feature was likely used in the dlookr package.
##   Please report the issue at <https://github.com/choonghyunryu/dlookr/issues>.
## This warning is displayed once per session.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: The `size` argument of `element_line()` is deprecated as of ggplot2 3.4.0.
## ℹ Please use the `linewidth` argument instead.
## ℹ The deprecated feature was likely used in the dlookr package.
##   Please report the issue at <https://github.com/choonghyunryu/dlookr/issues>.
## This warning is displayed once per session.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

# 6.2 Tabla de porcentaje de observaciones faltantes por variable #

tabla_faltantes <- miss_var_summary(datacleanNfinal) %>%
  mutate(pct_miss = round(pct_miss, 1)) %>%
  rename(
    Variable         = variable,
    `N faltantes`    = n_miss,
    `% faltantes`    = pct_miss
  )

tabla_faltantes
## # A tibble: 23 × 3
##    Variable          `N faltantes` `% faltantes`
##    <chr>                     <int>         <num>
##  1 chol_total                  450          18  
##  2 creatinine                  450          18  
##  3 smoking_status              449          18  
##  4 hdl                         448          17.9
##  5 bmi                          12           0.5
##  6 troponin                     12           0.5
##  7 ldl                          10           0.4
##  8 age                           2           0.1
##  9 systolic_bp                   1           0  
## 10 ejection_fraction             1           0  
## # ℹ 13 more rows

Las 4 variables con más faltantes son colesterol total, creatinina, y estaado de tabaquismo cada una con un porcentaje de missing de 18%. Seguidas por Hdl con el 17.9% En el diagrama de Pareto están de color naranja porque tienen una pérdida menor al 20% lo que significa que es “not bad”. Entre estas variables se concentra casi el 100% de los datos faltantes. Las demás variables, IMC, troponinas, colesterol ldl, edad, fracción de eyeccion y presión arterial sistólica, tienen una perdida menor al 5% lo cual indica que estas perdidas podrían serr despreciables.

6.3 Mapa de calor de valores faltantes

datacleanNfinal %>% 
  vis_miss() 

En conjunto, solo el 3.2% de todas las celdas de la base están faltantes y 96.8% presentes. En estas columnas, las marcas negras están dispersas a lo largo de todas las observaciones, sin agruparse en un bloque; eso sugiere un patrón de faltante más bien aleatorio en la posición de las filas, no un tramo concreto de pacientes.

Además, se observa que hay varias líneas negras horizontales en varias columnas a la vez. Es decir que hay co-ocurrencia en algunos pacientes puntuales a quienes les falta información en variass variables al tiempo.

compplpemento: Upset clásico

gg_miss_upset(datacleanNfinal)
## Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
## ℹ Please use tidy evaluation idioms with `aes()`.
## ℹ See also `vignette("ggplot2-in-packages")` for more information.
## ℹ The deprecated feature was likely used in the UpSetR package.
##   Please report the issue to the authors.
## This warning is displayed once per session.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

La matriz de puntos del centro-abajo define cada combinación: un punto solo = falta únicamente esa variable; puntos conectados por una línea = esas variables faltan juntas en el mismo paciente. Las barras verticales de arriba: cuántos pacientes hay en cada combinación exacta. El patrón es predominantemente de faltantes univariados dispersos (barras de 240–266), con una capa secundaria de pares co-ocurrentes (46–61) pacientes cada uno) y muy pocos casos con 3+ faltantes. Esto justifica imputación múltiple y hace poco viable el análisis de casos completos.

6.4 Complemento: Upset

datacleanNfinal %>% 
  plot_na_intersect()

7. Búsqueda de patrones de ausencia

patron <- datacleanNfinal %>%
 missing_pattern()

En el margen izquierdo se indica el número de pacientes que comparten cada patrón; en el margen derecho, el número de variables faltantes en ese patrón; en el encabezado superior se listan las variables, ordenadas de izquierda (mayor completitud) a derecha (mayor proporción de faltantes); y en el margen inferior se muestra el total de valores faltantes por variable.: *El mapa de calor mostró que dentro de las 4 variables afectadas, los datos faltantes se distribuyen de forma dispersa a lo largo de las observaciones, mediante un mecanismo aleatorio.

#8. Comparando asociaciones entre los datos que faltan y los observados #

Un valor p no significativo indica que ambos grupos son similares (consistente con MCAR); un p significativo indica que el faltante se asocia a una variable observada (apunta a MAR).

explanatory <- c(
 "age",
 "sex",
 "bmi",
 "diabetes",
 "hypertension",
 "heart_failure"
)

8.2 Creatinina

dependent <- "creatinine"
datacleanNfinal %>%
 missing_compare(dependent, explanatory)
##  Missing data analysis: creatinine           Not missing     Missing     p
##                                age Mean (SD) 65.7 (12.6) 64.0 (13.0) 0.013
##                                sex    Female  945 (81.5)  215 (18.5) 0.552
##                                         Male 1105 (82.5)  235 (17.5)      
##                                bmi Mean (SD)  27.9 (5.0)  27.8 (5.0) 0.743
##                           diabetes        No 1428 (81.6)  323 (18.4) 0.405
##                                          Yes  622 (83.0)  127 (17.0)      
##                       hypertension        No  811 (81.6)  183 (18.4) 0.703
##                                          Yes 1239 (82.3)  267 (17.7)      
##                      heart_failure        No 1539 (82.6)  324 (17.4) 0.195
##                                          Yes  511 (80.2)  126 (19.8)

Una asociación significativa con la edad: p = 0.013. Los pacientes con creatinina faltante son en promedio algo más jóvenes (64.0 vs 65.7 años). El resto de covariables (sexo, IMC, diabetes, hipertensión, falla cardíaca) no muestra diferencias (todas p > 0.19).

8.3 Colesterol total

dependent <- "chol_total"
datacleanNfinal %>%
 missing_compare(dependent, explanatory)
##  Missing data analysis: chol_total           Not missing     Missing     p
##                                age Mean (SD) 65.5 (12.7) 64.9 (12.5) 0.421
##                                sex    Female  949 (81.8)  211 (18.2) 0.859
##                                         Male 1101 (82.2)  239 (17.8)      
##                                bmi Mean (SD)  27.9 (5.0)  27.8 (5.0) 0.843
##                           diabetes        No 1434 (81.9)  317 (18.1) 0.881
##                                          Yes  616 (82.2)  133 (17.8)      
##                       hypertension        No  797 (80.2)  197 (19.8) 0.061
##                                          Yes 1253 (83.2)  253 (16.8)      
##                      heart_failure        No 1528 (82.0)  335 (18.0) 1.000
##                                          Yes  522 (81.9)  115 (18.1)

Ninguna asociación significativa. Todas las p > 0.05 (la menor es hipertensión, p = 0.061, limítrofe pero no significativa). Consistente con MCAR.

8.4 Tabaquismo

dependent <- "smoking_status"
datacleanNfinal %>%
 missing_compare(dependent, explanatory)
##  Missing data analysis: smoking_status           Not missing     Missing     p
##                                    age Mean (SD) 65.2 (12.8) 66.1 (12.1) 0.159
##                                    sex    Female  949 (81.8)  211 (18.2) 0.821
##                                             Male 1102 (82.2)  238 (17.8)      
##                                    bmi Mean (SD)  27.8 (5.1)  27.9 (4.9) 0.941
##                               diabetes        No 1442 (82.4)  309 (17.6) 0.571
##                                              Yes  609 (81.3)  140 (18.7)      
##                           hypertension        No  808 (81.3)  186 (18.7) 0.458
##                                              Yes 1243 (82.5)  263 (17.5)      
##                          heart_failure        No 1537 (82.5)  326 (17.5) 0.333
##                                              Yes  514 (80.7)  123 (19.3)

Ninguna asociación significativa. TTodas las p > 0.05. Consistente con MCAR. .

#8.5 colesterol HDL

dependent <- "hdl"
datacleanNfinal %>%
 missing_compare(dependent, explanatory)
##  Missing data analysis: hdl           Not missing     Missing     p
##                         age Mean (SD) 65.6 (12.9) 64.2 (11.6) 0.024
##                         sex    Female  960 (82.8)  200 (17.2) 0.441
##                                  Male 1092 (81.5)  248 (18.5)      
##                         bmi Mean (SD)  27.9 (5.1)  27.8 (4.8) 0.800
##                    diabetes        No 1438 (82.1)  313 (17.9) 0.975
##                                   Yes  614 (82.0)  135 (18.0)      
##                hypertension        No  810 (81.5)  184 (18.5) 0.567
##                                   Yes 1242 (82.5)  264 (17.5)      
##               heart_failure        No 1532 (82.2)  331 (17.8) 0.779
##                                   Yes  520 (81.6)  117 (18.4)

Asociación significativa con la edad: p = 0.024. Los pacientes con HDL faltante son algo más jóvenes (64.2 vs 65.6 años).

La gran mayoría de las comparaciones son no significativas, lo que descarta asociaciones fuertes entre el faltante y las características observadas de los pacientes. Las dos únicas señales aparecen con la edad, en creatinine (p = 0.013) y hdl (p = 0.024). En ambos casos los pacientes con dato faltante son ligeramente más jóvenes.

Esto significa que la presencia de estas asociaciones con la edad indica no es estrictamente MCAR para creatinine y hdl, sino más bien MAR (el faltante depende de una variable observada, la edad).

9. Imputación múltiple

Genera varios valores plausibles para cada faltante, creando m bases de datos completas distintas. Se realiza con mice para varaibles continuas y regresión logística para la categórica que es tabaquismmo.

# Copia de seguridad previo a la imputación
datos_imp <- datacleanNfinal

# Convertir variables categóricas a factor
datos_imp <- datos_imp %>%
 mutate(
 smoking_status = factor(smoking_status),
 )
# Matriz de predictores
predM <- datos_imp %>%
 select(-patient_id) %>%
 missing_predictorMatrix(
 drop_from_imputed = c(
 "mortality_30d",
 "readmission_30d"
 )
 )

Imputación

set.seed(123)
imputacion <- datos_imp %>%
 select(-patient_id) %>%
 mice(
 m = 10,
 predictorMatrix = predM,
 maxit = 10
 )
## 
##  iter imp variable
##   1   1  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   1   2  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   1   3  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   1   4  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   1   5  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   1   6  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   1   7  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   1   8  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   1   9  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   1   10  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   2   1  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   2   2  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   2   3  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   2   4  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   2   5  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   2   6  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   2   7  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   2   8  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   2   9  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   2   10  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   3   1  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   3   2  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   3   3  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   3   4  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   3   5  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   3   6  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   3   7  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   3   8  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   3   9  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   3   10  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   4   1  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   4   2  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   4   3  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   4   4  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   4   5  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   4   6  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   4   7  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   4   8  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   4   9  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   4   10  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   5   1  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   5   2  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   5   3  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   5   4  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   5   5  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   5   6  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   5   7  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   5   8  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   5   9  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   5   10  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   6   1  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   6   2  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   6   3  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   6   4  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   6   5  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   6   6  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   6   7  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   6   8  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   6   9  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   6   10  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   7   1  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   7   2  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   7   3  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   7   4  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   7   5  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   7   6  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   7   7  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   7   8  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   7   9  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   7   10  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   8   1  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   8   2  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   8   3  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   8   4  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   8   5  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   8   6  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   8   7  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   8   8  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   8   9  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   8   10  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   9   1  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   9   2  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   9   3  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   9   4  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   9   5  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   9   6  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   9   7  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   9   8  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   9   9  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   9   10  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   10   1  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   10   2  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   10   3  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   10   4  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   10   5  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   10   6  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   10   7  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   10   8  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   10   9  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
##   10   10  age  bmi  systolic_bp  chol_total  ldl  hdl  ejection_fraction  troponin  creatinine  smoking_status
## Warning: Number of logged events: 9
# 1. Que no queden faltantes en las variables que SÍ querías imputar
data_imputada <- complete(imputacion, 1)
colSums(is.na(data_imputada))
##                age                sex                bmi        systolic_bp 
##                  0                  0                  0                  0 
##       diastolic_bp         chol_total                ldl                hdl 
##                  0                  0                  0                  0 
##      triglycerides  ejection_fraction           troponin         creatinine 
##                  0                  0                  0                  0 
##           diabetes       hypertension      heart_failure     smoking_status 
##                  0                  0                  0                  0 
##       treat_statin treat_beta_blocker         treat_acei     length_of_stay 
##                  0                  0                  0                  0 
##      mortality_30d    readmission_30d 
##                  0                  0
# 2. Revisar eventos registrados (colinealidad, etc.)
imputacion$loggedEvents
##   it im dep     meth                out
## 1  0  0     constant                sex
## 2  0  0     constant           diabetes
## 3  0  0     constant       hypertension
## 4  0  0     constant      heart_failure
## 5  0  0     constant       treat_statin
## 6  0  0     constant treat_beta_blocker
## 7  0  0     constant         treat_acei
## 8  0  0     constant      mortality_30d
## 9  0  0     constant    readmission_30d
# 3. Confirmar qué método usó en cada variable
imputacion$method
##                age                sex                bmi        systolic_bp 
##              "pmm"                 ""              "pmm"              "pmm" 
##       diastolic_bp         chol_total                ldl                hdl 
##                 ""              "pmm"              "pmm"              "pmm" 
##      triglycerides  ejection_fraction           troponin         creatinine 
##                 ""              "pmm"              "pmm"              "pmm" 
##           diabetes       hypertension      heart_failure     smoking_status 
##                 ""                 ""                 ""          "polyreg" 
##       treat_statin treat_beta_blocker         treat_acei     length_of_stay 
##                 ""                 ""                 ""                 "" 
##      mortality_30d    readmission_30d 
##                 ""                 ""
# Convergencia: las líneas deben mezclarse sin tendencia clara
plot(imputacion)

# Distribución observada (azul) vs imputada (rojo): deben parecerse
densityplot(imputacion, ~ chol_total + creatinine + hdl)

En todas las variables, las líneas fluctúan alrededor de un valor central, no hay ninguna tendencia. Las gráficas en blanco corresponden a que no hay ninguún dato faltante imputado. El densityplot mostró que los valores imputados (rojo) se distribuyen igual que los observados (azul) lo cual da plausibilidad.

# Extraer una base imputada completa para la descripción
data_final <- complete(imputacion, 1)

11. Variables cuantitativas

# 11. Variables cuantitativas #
library(gtsummary)

data_final %>%
  select(age, bmi, systolic_bp, diastolic_bp, chol_total,
         ldl, hdl, triglycerides, creatinine, troponin,
         ejection_fraction) %>%
  tbl_summary(
    statistic = all_continuous() ~ "{mean} ({sd})",
    digits = all_continuous() ~ 1
  )
Characteristic N = 2,5001
age 65.4 (12.6)
bmi 27.8 (5.0)
systolic_bp 130.4 (19.8)
diastolic_bp 79.8 (9.9)
chol_total 201.4 (39.5)
ldl 120.7 (29.8)
hdl 50.4 (14.7)
triglycerides 155.3 (47.2)
creatinine 1.0 (0.3)
troponin 0.1 (0.1)
ejection_fraction 54.7 (9.7)
1 Mean (SD)

12. Variables cualitativas

# 12. Variables cualitativas #
data_final %>%
  select(sex, diabetes, hypertension, heart_failure,
         smoking_status, treat_statin, treat_beta_blocker,
         treat_acei, mortality_30d, readmission_30d) %>%
  tbl_summary(
    statistic = all_categorical() ~ "{n} ({p}%)"
  )
Characteristic N = 2,5001
sex
    Female 1,160 (46%)
    Male 1,340 (54%)
diabetes 749 (30%)
hypertension 1,506 (60%)
heart_failure 637 (25%)
smoking_status
    Current 476 (19%)
    Former 872 (35%)
    Never 1,152 (46%)
treat_statin 1,766 (71%)
treat_beta_blocker 1,462 (58%)
treat_acei 1,252 (50%)
mortality_30d 224 (9.0%)
readmission_30d 392 (16%)
1 n (%)

Bases de datos original y la imputada

data_final <- complete(imputacion, 1)
# La base original: todavía tiene NA
colSums(is.na(datacleanNfinal))
##         patient_id                age                sex                bmi 
##                  0                  2                  0                 12 
##        systolic_bp       diastolic_bp         chol_total                ldl 
##                  1                  0                450                 10 
##                hdl      triglycerides  ejection_fraction           troponin 
##                448                  0                  1                 12 
##         creatinine           diabetes       hypertension      heart_failure 
##                450                  0                  0                  0 
##     smoking_status       treat_statin treat_beta_blocker         treat_acei 
##                449                  0                  0                  0 
##     length_of_stay      mortality_30d    readmission_30d 
##                  0                  0                  0
# La base completada: ya NO tiene NA (en las variables imputadas)
colSums(is.na(data_final))
##                age                sex                bmi        systolic_bp 
##                  0                  0                  0                  0 
##       diastolic_bp         chol_total                ldl                hdl 
##                  0                  0                  0                  0 
##      triglycerides  ejection_fraction           troponin         creatinine 
##                  0                  0                  0                  0 
##           diabetes       hypertension      heart_failure     smoking_status 
##                  0                  0                  0                  0 
##       treat_statin treat_beta_blocker         treat_acei     length_of_stay 
##                  0                  0                  0                  0 
##      mortality_30d    readmission_30d 
##                  0                  0

Comparación antes y despues de imputar

# Comparación de estadísticas antes y después de imputar
library(dplyr)

vars_imputadas <- c("chol_total", "creatinine", "hdl")

comparacion <- data.frame(
  Variable = vars_imputadas,
  Media_original = sapply(vars_imputadas, function(v) mean(datacleanNfinal[[v]], na.rm = TRUE)),
  Media_imputada = sapply(vars_imputadas, function(v) mean(data_final[[v]])),
  DE_original = sapply(vars_imputadas, function(v) sd(datacleanNfinal[[v]], na.rm = TRUE)),
  DE_imputada = sapply(vars_imputadas, function(v) sd(data_final[[v]]))
)

comparacion
##              Variable Media_original Media_imputada DE_original DE_imputada
## chol_total chol_total     201.194146     201.442400  39.5717974  39.5129244
## creatinine creatinine       1.024468       1.024384   0.2607487   0.2616336
## hdl               hdl      50.214912      50.433600  14.8957080  14.7474400