Cesar Augusto Prieto Sarmiento
Universidad Nacional de Colombia
Departamento de Estadística
En el análisis de datos provenientes de pacientes hospitalizados por diabetes, es fundamental entender los factores asociados con las readmisiones hospitalarias y cómo estos influyen en los perfiles de los pacientes. La alta tasa de readmisiones representa un desafío significativo para los sistemas de salud, ya que está relacionada con costos elevados y posibles deficiencias en la atención médica o la gestión del tratamiento.
Este proyecto busca aplicar técnicas multivariadas para explorar y analizar la información de manera integral. Las herramientas seleccionadas permiten identificar patrones ocultos en los datos y agrupar a los pacientes en segmentos homogéneos basados en características compartidas. Los objetivos específicos incluyen:
La combinación de estas técnicas proporciona una perspectiva robusta para analizar los datos tanto desde un enfoque exploratorio como aplicado, permitiendo así responder preguntas clave sobre los perfiles de los pacientes y su relación con las variables relevantes.
Este análisis tiene un enfoque centrado en los datos y está diseñado para proporcionar bases sólidas para investigaciones futuras, tales como la implementación de modelos predictivos o la toma de decisiones clínicas basadas en datos.
El Análisis de Componentes Principales (ACP) es una técnica de reducción de dimensionalidad que permite sintetizar la información contenida en un conjunto de variables en un número menor de componentes no correlacionados. En este caso, se aplicará el ACP a las variables numéricas del conjunto de datos para identificar patrones y estructuras subyacentes.
## Rows: 101,763
## Columns: 8
## $ time_in_hospital <dbl> 4, 2, 4, 5, 1, 7, 6, 3, 2, 3, 2, 4, 3, 3, 1, 4, 5, …
## $ num_lab_procedures <dbl> 66, 48, 21, 38, 6, 42, 43, 26, 24, 60, 10, 32, 63, …
## $ num_procedures <dbl> 3, 0, 3, 0, 0, 2, 2, 1, 3, 0, 0, 2, 4, 2, 4, 0, 6, …
## $ num_medications <dbl> 18, 15, 23, 5, 6, 27, 17, 16, 17, 19, 3, 35, 17, 20…
## $ number_outpatient <dbl> 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, …
## $ number_emergency <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ number_inpatient <dbl> 1, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 1, 0, …
## $ number_diagnoses <dbl> 9, 7, 7, 2, 6, 2, 5, 8, 9, 9, 9, 9, 4, 9, 4, 9, 9, …
Primero se propone un ACP para todas las variables numéricas del conjunto de datos. Con el Objetivo de observar el comportamiento y la importacia de cada una de ellas en el análisis.
## Class: pca dudi
## Call: dudi.pca(df = dat1, scannf = FALSE)
##
## Total inertia: 8
##
## Eigenvalues:
## Ax1 Ax2 Ax3 Ax4 Ax5
## 2.0314 1.3705 0.9839 0.9516 0.8194
##
## Projected inertia (%):
## Ax1 Ax2 Ax3 Ax4 Ax5
## 25.39 17.13 12.30 11.90 10.24
##
## Cumulative projected inertia (%):
## Ax1 Ax1:2 Ax1:3 Ax1:4 Ax1:5
## 25.39 42.52 54.82 66.72 76.96
##
## (Only 5 dimensions (out of 8) are shown)
El Análisis de Componentes Principales revela que los dos primeros componentes explican el 42.52% de la variabilidad total de los datos (25.39% y 17.13% respectivamente). Para capturar más del 75% de la información, se requieren cinco componentes, lo que indica una estructura compleja en los datos que no puede ser reducida a pocas dimensiones sin una pérdida significativa de información. Esto sugiere que las variables originales presentan relaciones complejas entre sí que requieren múltiples dimensiones para ser representadas adecuadamente, esto se puede apreciar más directamente con el histograma de valores propios a con.
## Inertia information:
## Call: inertia.dudi(x = acp)
##
## Decomposition of total inertia:
## inertia cum cum(%)
## Ax1 2.0314 2.031 25.39
## Ax2 1.3705 3.402 42.52
## Ax3 0.9839 4.386 54.82
## Ax4 0.9516 5.337 66.72
## Ax5 0.8194 6.157 76.96
## Ax6 0.7331 6.890 86.12
## Ax7 0.6402 7.530 94.13
## Ax8 0.4699 8.000 100.00
El circulo de corrrelación es una herramienta que permite visualizar la relación entre las variables originales y los componentes principales. Las variables que están más cerca de los ejes del ACP tienen una mayor correlación con ellos, lo que indica su contribución a la varianza explicada por los componentes.
fviz_pca_var(acp, col.var = "contrib", axes = c(1, 2),
gradient.cols = c("#eeaf61", "#ee5d6c", "#6a0d83"),
repel = TRUE, geom = c("arrow", "text")) +
labs(title = "PROYECCIÓN DE LAS VARIABLES RELACIONADAS\nCON LA DURACION DE LA HOSPITALIZACIÓN",
subtitle = "EXPLORACION MULTIVARIADA DE PACIENTES CON HbA1c") +
theme_minimal() +
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 9, face = "bold", hjust = 0.5, color = "grey50"),
text = element_text(size = 10),
legend.position = "right")El círculo de correlación muestra cómo las variables originales están proyectadas en los dos primeros ejes del ACP. Las flechas representan las variables, y su dirección indica su contribución a los componentes principales. Se identificaron dos grupos principales:
En nuestro caso la proyección en el plano de los dos primeros componentes principales nos permitirá visualizar la distribución de los pacientes en función de las variables originales. Esta representación gráfica nos ayudará a identificar patrones y posibles agrupamientos en los datos.
# Proyeccion de los primero 10mil datos en el plano de los dos primeros componentes principales con % de inercia en los ejes
fviz_pca_ind(acp, col.ind = "cos2", axes = c(1, 2),
gradient.cols = c("#eeaf61", "#ee5d6c", "#6a0d83"),
repel = TRUE,geom = "point") +
labs(title = "PROYECCIÓN DE LOS PACIENTES EN LOS DOS\nPRIMEROS COMPONENTES PRINCIPALES",
subtitle = "EXPLORACION MULTIVARIADA DE PACIENTES CON HbA1c") +
theme_minimal() +
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 9, face = "bold", hjust = 0.5, color = "grey50"),
text = element_text(size = 10),
legend.position = "right")Como podemos obsevar en la representacion del plano, los pacientes se encuentran distribuidos de manera homogenea en el plano, lo que indica que no se pueden identificar grupos claros de pacientes basados en estas variables.
Dado estos resultados, se propone realizar un ACP por grupos de variables, utilizando los grupos anteriormente identificados utilizando el circulo de correlación, con el objetivo de identificar patrones más claros y simplificar la interpretación de los resultados.
Este primer grupo de varibales se relacionan directamente a la duración de la hospitalización y el tratamiento médico, por lo que se espera que las variables estén altamente correlacionadas y se puedan identificar patrones claros en los datos. Por otro lado, tambien se espera que la proyección de los pacientes en el plano de los dos primeros componentes principales muestre una mejor distribucion de los pacientes en el plano con el fin de poder identificar grupos.
# Grupo 1: Variables relacionadas con la duración de la hospitalización y el tratamiento médico
dat2 <- data[, c("time_in_hospital", "num_lab_procedures", "num_medications", "number_diagnoses", "Edad", "Genero", "readmitted", "A1Cresult")]
acp1 <- dudi.pca(dat2[,1:4], scannf = FALSE, nf = 3)
summary(acp1)## Class: pca dudi
## Call: dudi.pca(df = dat2[, 1:4], scannf = FALSE, nf = 3)
##
## Total inertia: 4
##
## Eigenvalues:
## Ax1 Ax2 Ax3 Ax4
## 1.8678 0.8608 0.7444 0.5270
##
## Projected inertia (%):
## Ax1 Ax2 Ax3 Ax4
## 46.70 21.52 18.61 13.18
##
## Cumulative projected inertia (%):
## Ax1 Ax1:2 Ax1:3 Ax1:4
## 46.70 68.22 86.82 100.00
El análisis de componentes principales para el grupo 1 de variables muestra que los dos primeros componentes explican el 68.22% de la variabilidad total de los datos (46.70% y 21.52% respectivamente). Para capturar más del 75% de la información, se requieren al menos 3 componentes, con lo cual se completaría un 86.82% al estar aplicando la tecnica con 4 variables y tener que tomar las primeras 3, nos indica que, aunque la estructura de los datos es más simple y se puede reducir a una menor dimension sin una pérdida significativa de información aun no es posible reducirlo a dos dimensiones.
## Inertia information:
## Call: inertia.dudi(x = acp1)
##
## Decomposition of total inertia:
## inertia cum cum(%)
## Ax1 1.8678 1.868 46.70
## Ax2 0.8608 2.729 68.22
## Ax3 0.7444 3.473 86.82
## Ax4 0.5270 4.000 100.00
barplot(acp1$eig, horiz = TRUE) # histograma de valores propios
abline(v = 0.6, lwd = 1, lty = 3, col = "red")Viendo el histograma de valores propios,que aunque el primer eje es el más importante y el segundo eje es significativo, el tercer eje también tiene un valor propio importante, por lo que se propone tomar los tres ejes.
En este caso el circulo de correlaciones sera mostrado en las combinaciones posibles de los ejes para poder observar la relación de las variables con los componentes principales.
fviz_pca_var(acp1, col.var = "contrib", axes = c(1, 2),
gradient.cols = c("#eeaf61", "#ee5d6c", "#6a0d83"),
repel = TRUE, geom = c("arrow", "text")) +
labs(title = "PROYECCIÓN DE LAS VARIABLES RELACIONADAS\nCON LA DURACION DE LA HOSPITALIZACIÓN",
subtitle = "EXPLORACION MULTIVARIADA DE PACIENTES CON HbA1c") +
theme_minimal() +
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 9, face = "bold", hjust = 0.5, color = "grey50"),
text = element_text(size = 10),
legend.position = "right")Este primer grafico muesta la relación tal cual como la habiamos observado en el circulo de correlación anterior, las variables time_in_hospital, num_medications, num_lab_procedures y num_diagnoses están altamente correlacionadas con el primer componente principal, lo que indica que estas variables son las que más influyen en la duración de la hospitalización.
fviz_pca_var(acp1, col.var = "contrib", axes = c(1, 3),
gradient.cols = c("#eeaf61", "#ee5d6c", "#6a0d83"),
repel = TRUE, geom = c("arrow", "text")) +
labs(title = "PROYECCIÓN DE LAS VARIABLES RELACIONADAS\nCON LA DURACION DE LA HOSPITALIZACIÓN",
subtitle = "EXPLORACION MULTIVARIADA DE PACIENTES CON HbA1c") +
theme_minimal() +
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 9, face = "bold", hjust = 0.5, color = "grey50"),
text = element_text(size = 10),
legend.position = "right")En este caso, el segundo eje principal muestra una relación con las variables num_lab_procedures y num_diagnoses, lo que indica que estas variables están relacionadas con la duración de la hospitalización, pero en menor medida que las variables del primer eje.
fviz_pca_var(acp1, col.var = "contrib", axes = c(2, 3),
gradient.cols = c("#eeaf61", "#ee5d6c", "#6a0d83"),
repel = TRUE, geom = c("arrow", "text")) +
labs(title = "PROYECCIÓN DE LAS VARIABLES RELACIONADAS\nCON LA DURACION DE LA HOSPITALIZACIÓN",
subtitle = "EXPLORACION MULTIVARIADA DE PACIENTES CON HbA1c") +
theme_minimal() +
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 9, face = "bold", hjust = 0.5, color = "grey50"),
text = element_text(size = 10),
legend.position = "right")Este tercer grafico muestra la relación de las variables num_lab_procedures y num_diagnoses con el segundo eje principal, lo que indica que estas variables están relacionadas entre sí, pero en menor medida que las variables del primer eje.
Para el caso de la proyeccion en el plano tambien lo haremos considerando los 3 ejes principales, con el objetivo de poder observar la distribución de los pacientes en el plano y poder identificar grupos de pacientes.
fviz_pca_ind(acp1, col.ind = "cos2", axes = c(1, 2),
gradient.cols = c("#eeaf61", "#ee5d6c", "#6a0d83"),
repel = TRUE,geom = "point") +
labs(title = "PROYECCIÓN DE LOS PACIENTES EN LOS DOS\nPRIMEROS COMPONENTES PRINCIPALES",
subtitle = "EXPLORACION MULTIVARIADA DE PACIENTES CON HbA1c") +
theme_minimal() +
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 9, face = "bold", hjust = 0.5, color = "grey50"),
text = element_text(size = 10),
legend.position = "right")fviz_pca_ind(acp1, col.ind = "cos2", axes = c(1, 3),
gradient.cols = c("#eeaf61", "#ee5d6c", "#6a0d83"),
repel = TRUE,geom = "point") +
labs(title = "PROYECCIÓN DE LOS PACIENTES EN LOS DOS\nPRIMEROS COMPONENTES PRINCIPALES",
subtitle = "EXPLORACION MULTIVARIADA DE PACIENTES CON HbA1c") +
theme_minimal() +
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 9, face = "bold", hjust = 0.5, color = "grey50"),
text = element_text(size = 10),
legend.position = "right")fviz_pca_ind(acp1, col.ind = "cos2", axes = c(2, 3),
gradient.cols = c("#eeaf61", "#ee5d6c", "#6a0d83"),
repel = TRUE,geom = "point") +
labs(title = "PROYECCIÓN DE LOS PACIENTES EN LOS DOS\nPRIMEROS COMPONENTES PRINCIPALES",
subtitle = "EXPLORACION MULTIVARIADA DE PACIENTES CON HbA1c") +
theme_minimal() +
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 9, face = "bold", hjust = 0.5, color = "grey50"),
text = element_text(size = 10),
legend.position = "right")Esta siguiente proyecion en el plano sera conrepecto a los 2 ejes principales y se hara con agrupamiento por las variables categoricas, con el objetivo de poder identificar grupos de pacientes basados en estas variables.
fviz_pca_ind(acp1,
axes = c(1, 2),
habillage = dat2[[5]], # Esto creará grupos por 0 y 1
addEllipses = TRUE,
repel = TRUE,
geom = "point") +
labs(title = "PROYECCIÓN DE LOS PACIENTES EN LOS DOS\nPRIMEROS COMPONENTES PRINCIPALES",
subtitle = "AGRUPAMIENTO POR RANGO DE EDAD") +
theme_minimal() +
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 9, face = "bold", hjust = 0.5, color = "grey50"),
text = element_text(size = 10),
legend.position = "right")fviz_pca_ind(acp1,
axes = c(1, 2),
habillage = dat2[[6]], # Esto creará grupos por 0 y 1
addEllipses = TRUE,
repel = TRUE,
geom = "point") +
labs(title = "PROYECCIÓN DE LOS PACIENTES EN LOS DOS\nPRIMEROS COMPONENTES PRINCIPALES",
subtitle = "AGRUPAMIENTO POR SEXO BIOLOGICO") +
theme_minimal() +
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 9, face = "bold", hjust = 0.5, color = "grey50"),
text = element_text(size = 10),
legend.position = "right")fviz_pca_ind(acp1,
axes = c(1, 2),
habillage = dat2[[7]], # Esto creará grupos por 0 y 1
addEllipses = TRUE,
repel = TRUE,
geom = "point") +
labs(title = "PROYECCIÓN DE LOS PACIENTES EN LOS DOS\nPRIMEROS COMPONENTES PRINCIPALES",
subtitle = "AGRUPAMIENTO POR REINGRESO AL HOSPITAL") +
theme_minimal() +
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 9, face = "bold", hjust = 0.5, color = "grey50"),
text = element_text(size = 10),
legend.position = "right")fviz_pca_ind(acp1,
axes = c(1, 2),
habillage = dat2[[8]], # Esto creará grupos por 0 y 1
addEllipses = TRUE,
repel = TRUE,
geom = "point") +
labs(title = "PROYECCIÓN DE LOS PACIENTES EN LOS DOS\nPRIMEROS COMPONENTES PRINCIPALES",
subtitle = "AGRUPAMIENTO POR RESULTADOS EN LA PRUEBA A1") +
theme_minimal() +
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 9, face = "bold", hjust = 0.5, color = "grey50"),
text = element_text(size = 10),
legend.position = "right")Este grupo de variables se relaciona con las visitas ambulatorias, las emergencias hospitalarias y los procedimientos médicos, por lo que se espera que las variables estén altamente correlacionadas y se puedan identificar patrones claros en los datos. Por otro lado, tambien se espera que la proyección de los pacientes en el plano de los dos primeros componentes principales muestre una mejor distribucion de los pacientes en el plano con el fin de poder identificar grupos.
# Grupo 2: Variables relacionadas con las visitas ambulatorias, las emergencias hospitalarias y los procedimientos médicos
dat3 <- data[, c("number_outpatient", "number_emergency", "number_inpatient", "num_procedures", "number_diagnoses", "Edad", "Genero", "readmitted", "A1Cresult")]
acp2 <- dudi.pca(dat3[,1:5], scannf = FALSE, nf = 3)
summary(acp2)## Class: pca dudi
## Call: dudi.pca(df = dat3[, 1:5], scannf = FALSE, nf = 3)
##
## Total inertia: 5
##
## Eigenvalues:
## Ax1 Ax2 Ax3 Ax4 Ax5
## 1.3865 1.0763 0.9436 0.8694 0.7242
##
## Projected inertia (%):
## Ax1 Ax2 Ax3 Ax4 Ax5
## 27.73 21.53 18.87 17.39 14.48
##
## Cumulative projected inertia (%):
## Ax1 Ax1:2 Ax1:3 Ax1:4 Ax1:5
## 27.73 49.26 68.13 85.52 100.00
El análisis de componentes principales para el grupo 2 de variables muestra que los dos primeros componentes explican el 49.26% de la variabilidad total de los datos (27.73% y 21.53% respectivamente). Para capturar más del 75% de la información, se requieren al menos 4 componentes, con lo cual se completaría un 85.52%. Este resultado al igual que el del grupo anterior no es tan bueno, pero, se decidio tomar los 3 ejes principales y continuar con el ejercicio de proyección en el plano.
## Inertia information:
## Call: inertia.dudi(x = acp2)
##
## Decomposition of total inertia:
## inertia cum cum(%)
## Ax1 1.3865 1.386 27.73
## Ax2 1.0763 2.463 49.26
## Ax3 0.9436 3.406 68.13
## Ax4 0.8694 4.276 85.52
## Ax5 0.7242 5.000 100.00
barplot(acp2$eig, horiz = TRUE) # histograma de valores propios
abline(v = 0.9, lwd = 1, lty = 3, col = "red")Aquí, el histograma de valores propios muestra que el primer eje es el más importante, seguido por el segundo eje, lo que indica que estos dos componentes capturan la mayor parte de la variabilidad en los datos. El tercer eje también tiene un valor propio importante, lo que sugiere que podría ser relevante para capturar información adicional.
En este caso el circulo de correlaciones sera mostrado en las combinaciones posibles de los ejes para poder observar la relación de las variables con los componentes principales.
fviz_pca_var(acp2, col.var = "contrib", axes = c(1, 2),
gradient.cols = c("#eeaf61", "#ee5d6c", "#6a0d83"),
repel = TRUE, geom = c("arrow", "text")) +
labs(title = "PROYECCIÓN DE LAS VARIABLES RELACIONADAS\nCON EMERGENCIAS HOSPITALARIAS",
subtitle = "EXPLORACION MULTIVARIADA DE PACIENTES CON HbA1c") +
theme_minimal() +
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 9, face = "bold", hjust = 0.5, color = "grey50"),
text = element_text(size = 10),
legend.position = "right")Para este primer grafico, se observa que las variables number_outpatient, number_emergency y number_inpatient están altamente correlacionadas con el primer componente principal, lo que indica que estas variables son las que más influyen en las emergencias hospitalarias.
fviz_pca_var(acp2, col.var = "contrib", axes = c(1, 3),
gradient.cols = c("#eeaf61", "#ee5d6c", "#6a0d83"),
repel = TRUE, geom = c("arrow", "text")) +
labs(title = "PROYECCIÓN DE LAS VARIABLES RELACIONADAS\nCON EMERGENCIAS HOSPITALARIAS",
subtitle = "EXPLORACION MULTIVARIADA DE PACIENTES CON HbA1c") +
theme_minimal() +
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 9, face = "bold", hjust = 0.5, color = "grey50"),
text = element_text(size = 10),
legend.position = "right")Luego, el grafico en el plano de los ejes 1 y 3 muestra que las variables number_outpatient y number_emergency están altamente correlacionadas con el primer componente principal, lo que indica que estas variables son las que más influyen en las emergencias hospitalarias.
fviz_pca_var(acp2, col.var = "contrib", axes = c(2, 3),
gradient.cols = c("#eeaf61", "#ee5d6c", "#6a0d83"),
repel = TRUE, geom = c("arrow", "text")) +
labs(title = "PROYECCIÓN DE LAS VARIABLES RELACIONADAS\nCON EMERGENCIAS HOSPITALARIAS",
subtitle = "EXPLORACION MULTIVARIADA DE PACIENTES CON HbA1c") +
theme_minimal() +
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 9, face = "bold", hjust = 0.5, color = "grey50"),
text = element_text(size = 10),
legend.position = "right")Ahora el grafico para los ejes 2 y 3 muestra que las variables number_inpatient y num_procedures están altamente correlacionadas con el segundo componente principal, lo que indica que estas variables son las que más influyen en las emergencias hospitalarias.
fviz_pca_ind(acp2, col.ind = "cos2", axes = c(1, 2),
gradient.cols = c("#eeaf61", "#ee5d6c", "#6a0d83"),
repel = TRUE,geom = "point") +
labs(title = "PROYECCIÓN DE LOS PACIENTES EN LOS DOS\nPRIMEROS COMPONENTES PRINCIPALES",
subtitle = "EXPLORACION MULTIVARIADA DE PACIENTES CON HbA1c") +
theme_minimal() +
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 9, face = "bold", hjust = 0.5, color = "grey50"),
text = element_text(size = 10),
legend.position = "right")fviz_pca_ind(acp2, col.ind = "cos2", axes = c(1, 3),
gradient.cols = c("#eeaf61", "#ee5d6c", "#6a0d83"),
repel = TRUE,geom = "point") +
labs(title = "PROYECCIÓN DE LOS PACIENTES EN LOS DOS\nPRIMEROS COMPONENTES PRINCIPALES",
subtitle = "EXPLORACION MULTIVARIADA DE PACIENTES CON HbA1c") +
theme_minimal() +
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 9, face = "bold", hjust = 0.5, color = "grey50"),
text = element_text(size = 10),
legend.position = "right")fviz_pca_ind(acp2, col.ind = "cos2", axes = c(2, 3),
gradient.cols = c("#eeaf61", "#ee5d6c", "#6a0d83"),
repel = TRUE,geom = "point") +
labs(title = "PROYECCIÓN DE LOS PACIENTES EN LOS DOS\nPRIMEROS COMPONENTES PRINCIPALES",
subtitle = "EXPLORACION MULTIVARIADA DE PACIENTES CON HbA1c") +
theme_minimal() +
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 9, face = "bold", hjust = 0.5, color = "grey50"),
text = element_text(size = 10),
legend.position = "right")Ahora probemos como se veria la proyección de los pacientes en el plano de los dos primeros componentes principales, pero esta vez con agrupamiento por las variables categoricas.
fviz_pca_ind(acp2,
axes = c(1, 3),
habillage = dat3[[6]], # Esto creará grupos por 0 y 1
addEllipses = TRUE,
repel = TRUE,
geom = "point") +
labs(title = "PROYECCIÓN DE LOS PACIENTES EN LOS DOS\nPRIMEROS COMPONENTES PRINCIPALES",
subtitle = "AGRUPAMIENTO POR RANGO DE EDAD") +
theme_minimal() +
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 9, face = "bold", hjust = 0.5, color = "grey50"),
text = element_text(size = 10),
legend.position = "right")fviz_pca_ind(acp2,
axes = c(1, 3),
habillage = dat3[[7]], # Esto creará grupos por 0 y 1
addEllipses = TRUE,
repel = TRUE,
geom = "point") +
labs(title = "PROYECCIÓN DE LOS PACIENTES EN LOS DOS\nPRIMEROS COMPONENTES PRINCIPALES",
subtitle = "AGRUPAMIENTO POR SEXO BIOLOGICO") +
theme_minimal() +
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 9, face = "bold", hjust = 0.5, color = "grey50"),
text = element_text(size = 10),
legend.position = "right")fviz_pca_ind(acp2,
axes = c(1, 3),
habillage = dat3[[8]], # Esto creará grupos por 0 y 1
addEllipses = TRUE,
repel = TRUE,
geom = "point") +
labs(title = "PROYECCIÓN DE LOS PACIENTES EN LOS DOS\nPRIMEROS COMPONENTES PRINCIPALES",
subtitle = "AGRUPAMIENTO POR REINGRESO AL HOSPITAL") +
theme_minimal() +
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 9, face = "bold", hjust = 0.5, color = "grey50"),
text = element_text(size = 10),
legend.position = "right")fviz_pca_ind(acp2,
axes = c(1, 3),
habillage = dat3[[9]], # Esto creará grupos por 0 y 1
addEllipses = TRUE,
repel = TRUE,
geom = "point") +
labs(title = "PROYECCIÓN DE LOS PACIENTES EN LOS DOS\nPRIMEROS COMPONENTES PRINCIPALES",
subtitle = "AGRUPAMIENTO POR RESULTADOS EN LA PRUEBA A1") +
theme_minimal() +
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 9, face = "bold", hjust = 0.5, color = "grey50"),
text = element_text(size = 10),
legend.position = "right")Ahora, para el ACM se propone explorar las relaciones entre las variables categóricas del conjunto de datos. El ACM es una técnica de análisis multivariado que permite visualizar y analizar la asociación entre variables categóricas, lo que puede ayudar a identificar patrones y estructuras subyacentes en los datos.
En este caso vamos a dividir el análisis en 2 grupos, el primero conformado por aquellas que son prubeas de laboratorio y el segundo por las variables relacionadas con la hospitalización del paciente, con el objetivo de poder identificar patrones y estructuras subyacentes en los datos, luego se evaluara la posibilidad de realizar el ejercicio combinando varias de estas varibles.
Las variables utilizadas aquí son aquellas relacionadas con las pruebas de laboratorio, como la medicación, los resultados de las pruebas de laboratorio y el nivel máximo de glucosa en suero. Estas variables son categóricas y se espera que estén relacionadas entre sí, lo que puede ayudar a identificar patrones en los datos.
No todas las variables seran usadas en el ACM algunas seran usadas más adelante como ulistrativas para la proyección de los pacientes en el plano.
# Grupo 1: Variables relacionadas con las pruebas de laboratorio
dat4 <- data[, c("Metformin", "Repaglinide", "Nateglinide", "Chlorpropamide", "Glipizide", "Glyburide", "Glimepiride", "Pioglitazone", "Rosiglitazone", "Acarbose", "Miglitol", "Tolazamide", "Insulin", "Glyburide_Metformin", "A1Cresult", "Max_Glu_Serum")]
# Convertir todas las columnas a factor
dat4 <- data.frame(lapply(dat4, as.factor))
# Ahora sí realizar el ACM
acm1 <- dudi.acm(dat4[,1:5], scannf = FALSE)
summary(acm1)## Class: acm dudi
## Call: dudi.acm(df = dat4[, 1:5], scannf = FALSE)
##
## Total inertia: 3
##
## Eigenvalues:
## Ax1 Ax2 Ax3 Ax4 Ax5
## 0.2168 0.2069 0.2052 0.2017 0.2006
##
## Projected inertia (%):
## Ax1 Ax2 Ax3 Ax4 Ax5
## 7.225 6.897 6.840 6.724 6.688
##
## Cumulative projected inertia (%):
## Ax1 Ax1:2 Ax1:3 Ax1:4 Ax1:5
## 7.225 14.122 20.962 27.685 34.374
##
## (Only 5 dimensions (out of 15) are shown)
fviz_screeplot(acm1,
addlabels = TRUE,
ylim = c(0, 20))+
labs(title = "REPRESENTACIÓN DE LOS VALORES PROPIOS OBTENIDOS DEL ACM",
subtitle = "PORCENTAJE DE LA VARIANZA EXPLICADA") +
theme_minimal() +
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 9, face = "bold", hjust = 0.5, color = "grey50"),
text = element_text(size = 10),
legend.position = "right")Aquí podemos observar que el resultado no es tan bueno como se esperaba, ya que los primeros ejes solo explican cada uno 7.2% de la varianza total de los datos, lo que indica que las variables no están altamente correlacionadas entre sí. Sin embargo, se propone continuar con la proyección de los pacientes en el plano de los dos primeros componentes principales para identificar patrones en los datos.
Luego la contribucion es muy poca y esta se puede observar en el siguiente grafico.
fviz_contrib(acm1,
choice = "var",
axes = 1) +
labs(title = "CONTRIBUCIÓN DE LAS VARIABLES EN EL PRIMER EJE",
subtitle = "GRUPO DE VARIABLES RELACIONADAS CON PRUEBAS") +
theme_minimal() +
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 9, face = "bold", hjust = 0.5, color = "grey50"),
text = element_text(size = 10),
legend.position = "right",
axis.text.x = element_text(angle = 45, hjust = 1))fviz_contrib(acm1,
choice = "var",
axes = 2) +
labs(title = "CONTRIBUCIÓN DE LAS VARIABLES EN EL PRIMER EJE",
subtitle = "GRUPO DE VARIABLES RELACIONADAS CON PRUEBAS") +
theme_minimal() +
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 9, face = "bold", hjust = 0.5, color = "grey50"),
text = element_text(size = 10),
legend.position = "right",
axis.text.x = element_text(angle = 45, hjust = 1))Estos dos graficos nos muestas las diferencuas en la contribución de las variables en los dos primeros ejes, lo que indica que las variables no están altamente correlacionadas entre sí.
Ahora, la representación gráfica de los resultados obtenidos del ACM se muestra a continuación.
fviz_mca_biplot(acm1, axes=c(1,2),
repel = TRUE, label = "var",
ggtheme=theme_minimal())+
labs(title = "REPRESENTACIÓN DE LOS RESULTADOS OBTENIDOS DEL ACM",
subtitle = "GRUPO DE VARIABLES RELACIONADAS CON PRUEBAS") +
theme_minimal() +
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 9, face = "bold", hjust = 0.5, color = "grey50"),
text = element_text(size = 10),
legend.position = "right")Del grafico podemos decir que las variables Metformin, Repaglinide, Nateglinide, Chlorpropamide y Glipizide son las que más influyen en el primer eje, mientras que las variables Glyburide, Glimepiride, Pioglitazone, Rosiglitazone y Acarbose son las que más influyen en el segundo eje.
# Grupo 2: Variables relacionadas con la hospitalización
dat5 <- data[,c("change", "diabetesMed", "readmitted", "Raza", "Genero", "Edad", "Admision", "Discharge", "Especialidad")]
# Convertir todas las columnas a factor
dat5 <- data.frame(lapply(dat5, as.factor))
# Ahora sí realizar el ACM
acm2 <- dudi.acm(dat5, scannf = FALSE)
summary(acm2)## Class: acm dudi
## Call: dudi.acm(df = dat5, scannf = FALSE)
##
## Total inertia: 2.222
##
## Eigenvalues:
## Ax1 Ax2 Ax3 Ax4 Ax5
## 0.1714 0.1496 0.1431 0.1278 0.1199
##
## Projected inertia (%):
## Ax1 Ax2 Ax3 Ax4 Ax5
## 7.713 6.734 6.438 5.752 5.395
##
## Cumulative projected inertia (%):
## Ax1 Ax1:2 Ax1:3 Ax1:4 Ax1:5
## 7.713 14.447 20.885 26.637 32.031
##
## (Only 5 dimensions (out of 20) are shown)
fviz_screeplot(acm2,
addlabels = TRUE,
ylim = c(0, 20))+
labs(title = "REPRESENTACIÓN DE LOS VALORES PROPIOS OBTENIDOS DEL ACM",
subtitle = "PORCENTAJE DE LA VARIANZA EXPLICADA") +
theme_minimal() +
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 9, face = "bold", hjust = 0.5, color = "grey50"),
text = element_text(size = 10),
legend.position = "right")Aquí podemos observar que el resultado no es tan bueno como se esperaba, ya que los primeros ejes solo explican cada uno 7.2% de la varianza total de los datos, lo que indica que las variables no están altamente correlacionadas entre sí. Sin embargo, se propone continuar con la proyección de los pacientes en el plano de los dos primeros componentes principales para identificar patrones en los datos.
Luego la contribucion es muy poca y esta se puede observar en el siguiente grafico.
fviz_contrib(acm1,
choice = "var",
axes = 1) +
labs(title = "CONTRIBUCIÓN DE LAS VARIABLES EN EL PRIMER EJE",
subtitle = "GRUPO DE VARIABLES RELACIONADAS CON HOSPITALIZACION") +
theme_minimal() +
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 9, face = "bold", hjust = 0.5, color = "grey50"),
text = element_text(size = 10),
legend.position = "right",
axis.text.x = element_text(angle = 45, hjust = 1))fviz_contrib(acm2,
choice = "var",
axes = 2) +
labs(title = "CONTRIBUCIÓN DE LAS VARIABLES EN EL PRIMER EJE",
subtitle = "GRUPO DE VARIABLES RELACIONADAS CON PRUEBAS") +
theme_minimal() +
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 9, face = "bold", hjust = 0.5, color = "grey50"),
text = element_text(size = 10),
legend.position = "right",
axis.text.x = element_text(angle = 45, hjust = 1))En este caso, la contribución de las variables en los dos primeros ejes es muy baja, lo que indica que las variables no están altamente correlacionadas entre sí. Sin embargo cabe resaltar que las variables change, diabetesMed y readmitted son las que más influyen en el primer eje, mientras que las variables Raza, Genero y Edad son las que más influyen en el segundo eje.
Ahora, la representación gráfica de los resultados obtenidos del ACM se muestra a continuación.
fviz_mca_biplot(acm2, axes=c(1,2),
repel = TRUE, label = "var",
ggtheme=theme_minimal())+
labs(title = "REPRESENTACIÓN DE LOS RESULTADOS OBTENIDOS DEL ACM",
subtitle = "GRUPO DE VARIABLES RELACIONADAS CON LA HOSPITALIZACIÓN") +
theme_minimal() +
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 9, face = "bold", hjust = 0.5, color = "grey50"),
text = element_text(size = 10),
legend.position = "right")De este grafico podemos mencionar que las variables change, diabetesMed y readmitted son las que más influyen en el primer eje, mientras que las variables Raza, Genero y Edad son las que más influyen en el segundo eje.
Para el agrupamiento de pacientes se propone utilizar el algoritmo de K-means, que es un método de agrupamiento no supervisado que asigna cada observación a un grupo basado en la similitud de sus características. En este caso, se propone agrupar a los pacientes en función de sus características clínicas y demográficas, con el objetivo de identificar grupos de pacientes con características similares.
Antes de eso, se propone un agrupamiento jerarquico para darnos idea de cuantos grupos podriamos tener. Como el conjunto de datos es demasiado grande, se tomara una muestra de 1000 pacientes para realizar el agrupamiento jerarquico.
# Análisis de Componentes Principales (ACP)
ACP <- dudi.pca(dat3[1:1000,1:5], scannf = FALSE, nf = 3)
F <- as.matrix(ACP$li)
# Clustering jerárquico con método de Ward
hcl <- ward.cluster(dista = dist(F), h.clust = 1)
# Visualización del dendrograma con estética personalizada
p <- fviz_dend(hcl, rect = TRUE, k_colors = "darkblue", show_labels = FALSE)
# Agregar línea horizontal manualmente con ggplot2
p +
annotate("segment", x = -Inf, xend = Inf, y = 0.25, yend = 0.25,
linetype = "dashed", color = "red") +
labs(title = "DENDROGRAMA DE AGRUPAMIENTO JERÁRQUICO PARA LOS PACIENTES",
subtitle = "SUBMUESTRA ILUSTRATIVA DE LA POBLACIÓN") +
theme_minimal() +
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 9, face = "bold", hjust = 0.5, color = "grey50"),
text = element_text(size = 10))Con lo cual se puede observar que el dendrograma muestra que se pueden tener 5 grupos de pacientes, por lo que se propone realizar el agrupamiento con el algoritmo de K-means para 5 grupos.
Trabajado por: Cesar Prieto - CapStatsML