ANÁLISIS EXPLORATORIO DE DATOS MULTIVARIADO

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.

ANÁLISIS DE COMPONENTES PRINCIPALES (ACP)

ACP GENERAL PARA VARIABLES NUMERICAS

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(acp)      # valores propios y porcentajes
## 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
barplot(acp$eig, horiz = TRUE) # histograma de valores propios
abline(v = 1, lty = 3, col = "red")

CIRCULO DE CORRELACION

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:

  1. Primer Grupo (Hacia el cuadrante Negativo del Eje X)
    • Variables principales: time_in_hospital, num_medications, num_lab_procedures y num_diagnoses.
    • Interpretación: Este grupo de variables está relacionado con la duración de la hospitalización y la intensidad del tratamiento médico. Estas variables contribuyen negativamente al eje CP1, sugiriendo que los pacientes con valores altos en estas métricas tienden a agruparse en esta dirección.
  2. Segundo Grupo (Hacia el cuadrante Positivo del Eje X y negativo del Eje Y)
    • Variables principales: number_outpatient, number_emergency, number_inpatient y num_procedures.
    • Interpretación: Este grupo de variables está relacionado con las visitas ambulatorias, las emergencias hospitalarias y los procedimientos médicos. Estas variables contribuyen negativamente al eje CP2, sugiriendo que los pacientes con valores altos en estas métricas tienden a agruparse en esta dirección.

PROYECCIÓN DE LOS PACIENTES EN EL PLANO

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.

ACP PARA GRUPO 1 DE VARIABLES

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(acp1)      # valores propios y porcentajes
## 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.

CIRCULO DE CORRELACION

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.

EJES (1, 2)

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.

EJES (1, 3)

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.

EJES (2, 3)

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.

PROYECCIÓN DE LOS PACIENTES EN EL PLANO

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.

EJE (1, 2)

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")

EJE (1, 3)

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")

EJE (2, 3)

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")

PROYECCIÓN CON AGRUPAMIENTO

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.

EDAD

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")

SEXO

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")

REINGRESO

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")

PRUEBA A1

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")

ACP PARA GRUPO 2 DE VARIABLES

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(acp2)      # valores propios y porcentajes
## 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.

CIRCULO DE CORRELACION

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.

EJES (1, 2)

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.

EJES (1, 3)

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.

EJES (2, 3)

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.

PROYECCIÓN DE LOS PACIENTES EN EL PLANO

EJE (1, 2)

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")

EJE (1, 3)

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")

EJE (2, 3)

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")

PROYECCIÓN CON AGRUPAMIENTO

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.

EDAD

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")

SEXO

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")

REINGRESO

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")

PRUEBA A1

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")

ANÁLISIS DE CORRESPONDENCIAS MÚLTIPLES (ACM)

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.

ACM PARA VARIABLES DE LABORATORIO

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.

AGRUPAMIENTO DE PACIENTES

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

https://github.com/CapStats-ML