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
)
setwd("~/MAESTRIA EPIDEMIOLOGIA ICESI/aseguramiento_datos/semana5-6")
library(readxl)
datacleanNfinal <- read_excel("datacleanNfinal.xlsx")
View(datacleanNfinal)
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", "…
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)
| 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 | ▂▇▅▁▁ |
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.
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.
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.
datacleanNfinal %>%
plot_na_intersect()
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"
)
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).
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.
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).
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"
)
)
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 #
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 #
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 (%) | |
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 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