RETO No.1

Se cargan las librerias que se van a utilizar para este analisis y se configura el espacio de trabajo.

## ------------------------------------------------------- #
#librerias
suppressMessages(library(openxlsx))
suppressMessages(library(readxl))
suppressMessages(library(data.table))
suppressMessages(library(dplyr))
suppressMessages(library(tidyverse))
suppressMessages(library(lubridate))
suppressMessages(library(caTools))
suppressMessages(library(caret))
suppressMessages(library(Boruta))
suppressMessages(library(ROSE))
suppressMessages(library(ggplot2))
suppressMessages(library(ggpubr))
## ------------------------------------------------------- #
# R options
g <- gc(reset = T); rm(list = ls())
root <- "/Users/cesara.saavedravanegas/Desktop/Prueba_Tecnica_iDATA"
pth <- paste0(root,"/Reto_1")
## ------------------------------------------------------- #

Haciendo uso de “root” y “pth” se fija el directorio de trabajo para posteriormente poder acceder de manera mas sencilla y ordenada a los datos, tambien para guardar los resultados. Se listan los archivos existentes en la ruta de trabajo y se carga la base de datos “Diabetes 130-US hospitals for years 1999-2008”

## ------------------------------------------------------- #
# Listado de archivos
mylist <- list.files(path = pth, pattern = ".csv$", full.names = TRUE)
# Lectura de la bd
df <- read.csv(mylist[1])
## ------------------------------------------------------- #
head(df)

Tras una visualizacion de la base de datos se evidencian valores perdidos (“?”) en las variables:

Limpieza y pre procesamiento de datos

Se inicia por conocer la cantidad de “?” y “Unknown/Invalid” que hay en la base de datos, para lo cual se hace uso de esta funcion que se encarga de contar para cada una de las variables identificadas

count <- 0
for(i in 1:ncol(df)){
  if(is.factor(df[,i])){
    for(j in 1:nrow(df)){
      if(df[j,i]== "?" | df[j,i]== "Unknown/Invalid" ){
        count <- count + 1
        df[j,i] <- NA
      }
    }
    if(count > 0){
      print(c(colnames(df)[i],count))
    }
  }
  count <- 0
}

Se evidencia que las variables “Weight” tiene al rededor del 97% de valores perdidos. “Payer code” y “Medical specialty” entre el 40% y 50%. Por esta razon la variable “Weight” se elimina de la base de datos y prevenir posibles errores en posteriores analisis.

df$race[df$race == "?"] <- NA
df$weight[df$weight == "?"] <- NA
df$payer_code[df$payer_code == "?"] <- NA
df$medical_specialty[df$medical_specialty == "?"] <- NA
df$gender[df$gender == "Unknown/Invalid"] <- NA
data_NA <- data.frame(features = colnames(df),
                        missing_rates = round(colSums(is.na(df))/nrow(df),3))
data_NA <- data_NA[order(-data_NA$missing_rates),]

print(data_NA)
##                                          features missing_rates
## weight                                     weight         0.969
## medical_specialty               medical_specialty         0.491
## payer_code                             payer_code         0.396
## race                                         race         0.022
## encounter_id                         encounter_id         0.000
## patient_nbr                           patient_nbr         0.000
## gender                                     gender         0.000
## age                                           age         0.000
## admission_type_id               admission_type_id         0.000
## discharge_disposition_id discharge_disposition_id         0.000
## admission_source_id           admission_source_id         0.000
## time_in_hospital                 time_in_hospital         0.000
## num_lab_procedures             num_lab_procedures         0.000
## num_procedures                     num_procedures         0.000
## num_medications                   num_medications         0.000
## number_outpatient               number_outpatient         0.000
## number_emergency                 number_emergency         0.000
## number_inpatient                 number_inpatient         0.000
## diag_1                                     diag_1         0.000
## diag_2                                     diag_2         0.000
## diag_3                                     diag_3         0.000
## number_diagnoses                 number_diagnoses         0.000
## max_glu_serum                       max_glu_serum         0.000
## A1Cresult                               A1Cresult         0.000
## metformin                               metformin         0.000
## repaglinide                           repaglinide         0.000
## nateglinide                           nateglinide         0.000
## chlorpropamide                     chlorpropamide         0.000
## glimepiride                           glimepiride         0.000
## acetohexamide                       acetohexamide         0.000
## glipizide                               glipizide         0.000
## glyburide                               glyburide         0.000
## tolbutamide                           tolbutamide         0.000
## pioglitazone                         pioglitazone         0.000
## rosiglitazone                       rosiglitazone         0.000
## acarbose                                 acarbose         0.000
## miglitol                                 miglitol         0.000
## troglitazone                         troglitazone         0.000
## tolazamide                             tolazamide         0.000
## examide                                   examide         0.000
## citoglipton                           citoglipton         0.000
## insulin                                   insulin         0.000
## glyburide.metformin           glyburide.metformin         0.000
## glipizide.metformin           glipizide.metformin         0.000
## glimepiride.pioglitazone glimepiride.pioglitazone         0.000
## metformin.rosiglitazone   metformin.rosiglitazone         0.000
## metformin.pioglitazone     metformin.pioglitazone         0.000
## change                                     change         0.000
## diabetesMed                           diabetesMed         0.000
## readmitted                             readmitted         0.000
df$weight <- NULL

Categorizacion de variables

Teniendo en cuenta la informacion disponible en https://archive.ics.uci.edu/dataset/296/diabetes+130-us+hospitals+for+years+1999-2008 y el archivo IDS_mapping.csv se realiza la recategorizacion de las variables

## ------------------------------------------------------- #
df <- df %>% dplyr::mutate(admission_type_id = dplyr::case_when(admission_type_id %in% c("1") ~ "Emergency",
                                                          admission_type_id %in% c("2") ~ "Urgent",
                                                          admission_type_id %in% c("3") ~ "Elective",
                                                          admission_type_id %in% c("4") ~ "Newborn",
                                                          admission_type_id %in% c("5") ~ "Not Available",
                                                          admission_type_id %in% c("6") ~ "NULL",
                                                          admission_type_id %in% c("7") ~ "Trauma Center",
                                                          admission_type_id %in% c("8") ~ "Not Mapped"))

## ------------------------------------------------------- #

df$race <- as.factor(df$race)
df$gender <- as.factor(df$gender)
df$age <- as.factor(df$age)
df$payer_code <- as.factor(df$payer_code)
df$max_glu_serum <- as.factor(df$max_glu_serum)
df$A1Cresult <- as.factor(df$A1Cresult)
df$admission_type_id <- as.factor(df$admission_type_id)
df$admission_source_id <- as.factor(df$admission_source_id)
df$discharge_disposition_id <- as.factor(df$discharge_disposition_id)
df$insulin <- as.factor(df$insulin)
df$max_glu_serum <- as.factor(df$max_glu_serum)

1. Analisis exploratorio

A continuacion se presenta un analisis exploratorio para conocer el comportamiento de las principales variables y asi determinar cuales de ellas son de mayor importancia en la relacion.

Analisis univariado

Iniciamos con un analisis demografico del grupo de estudio, esto es,

Estadisticas para concoer los distintos grupos raciales que componen la base de datos, en la figura se eivdencia como el 74.8% de la poblacion se identifican como caucacicos.

Se busca conocer tambien el rango de edades en los cuales se encuentran los individuos

df %>% 
  dplyr::count(gender) %>%
  dplyr::mutate(Por = round(prop.table(n)*100,1)) %>% drop_na() 

Acontinuacion se muestran las estadisticas descriptivas para el tipo de admision. Donde el 53% equivale a admisiones por emergencia.

## Coordinate system already present. Adding new coordinate system, which will
## replace the existing one.

ggpubr::ggarrange(g1,g2,g3,g4)

Como se observa en los diagramas de caja, estas 4 variables que relacionan el numero de dias que un paciente se encuentra en la clinicam, el numero de procedimientos, el numero de visitas a urgencias, tenemos outliers por lo cual se realizara un procesamiento adicional para remover estos datos atipicos y poder observar de mejor manera cual es el comportamiento de la poblacion.

outliers_remover <- function(a){
  df <- a
  aa <- c()
  count <- 1
  for(i in 1:ncol(df)){
    if(is.integer(df[,i])){
      Q3 <- quantile(df[,i], 0.75, na.rm = TRUE)
      Q1 <- quantile(df[,i], 0.25, na.rm = TRUE) 
      IQR <- Q3 - Q1  #IQR(df[,i])
      upper <- Q3 + 1.5 * IQR
      lower <- Q1 - 1.5 * IQR
      for(j in 1:nrow(df)){
        if(is.na(df[j,i]) == TRUE){
          next
        }
        else if(df[j,i] > upper | df[j,i] < lower){
          aa[count] <- j
          count <- count+1                  
        }
      }
    }
  }
  df <- df[-aa,]
}
df <- outliers_remover(df)
## ------------------------------------------------------- #
g1 <- ggplot2::ggplot(df, aes(x=time_in_hospital)) +
  ggplot2::stat_boxplot(geom = "errorbar",
                        width = 0.25) +
  ggplot2::geom_boxplot(outlier.colour="red", outlier.shape=8,
                        outlier.size=4) + 
  ggplot2::labs(title="Numero de dias entre ingreso y alta",y="", x = "Dias") +
  ggplot2::coord_flip()

## ------------------------------------------------------- #
g2 <- ggplot2::ggplot(df, aes(x=num_lab_procedures)) +
  ggplot2::stat_boxplot(geom = "errorbar",
                        width = 0.25) +
  ggplot2::geom_boxplot(outlier.colour="red", outlier.shape=8,
                        outlier.size=4) + 
  ggplot2::labs(title="Numero de pruebas realizadas",y="", x = "") +
  ggplot2::coord_flip()

## ------------------------------------------------------- #
g3 <- ggplot2::ggplot(df, aes(x=num_procedures)) +
  ggplot2::stat_boxplot(geom = "errorbar",
                        width = 0.25) +
  ggplot2::geom_boxplot(outlier.colour="red", outlier.shape=8,
                        outlier.size=4) + 
  ggplot2::labs(title="Numero de procedimientos",y="", x = "") +
  ggplot2::coord_flip()

## ------------------------------------------------------- #
g4 <- ggplot2::ggplot(df, aes(x=number_emergency)) +
  ggplot2::stat_boxplot(geom = "errorbar",
                        width = 0.25) +
  ggplot2::geom_boxplot(outlier.colour="red", outlier.shape=8,
                        outlier.size=4) + 
  ggplot2::labs(title="Numero de visitas a urgencias",y="", x = "") +
  ggplot2::coord_flip()
ggpubr::ggarrange(g1,g2,g3,g4)

Como se observa,al realizar el tratamiento de datos atipicos “outliers”, la variable numero de visitas a urgencias pasa a ser de cero y por lo cual se podria decir que esta variable podria salir de nuestro analisis.

Tras realizar el tratamiento de datos atipicos, es importante conocer el comportamiento de la variable “readmitted” esto dado que esta variable es la que nos permitira realizar la clasifiacion

df %>% 
  dplyr::count(readmitted) %>%
  dplyr::mutate(Por = round(prop.table(n)*100,1))

De la tabla anterior se tiene que el 59% de los pacientes no tiene registro de reingreso, aunque se tiene que un 31.5% de los pacientes tienen reingresos lo cual es una situacion no deseable y es por esta razon que en la siguiente figura se busa conocer cual es el motivo de este reingreso.

df %>% 
  dplyr::group_by(readmitted) %>% 
  dplyr::count(admission_type_id) %>%
  dplyr::mutate(Por = round(prop.table(n)*100,1)) %>% drop_na() %>% 
  ggplot2::ggplot(aes(x = reorder(admission_type_id, +Por), 
                      y = Por, fill = readmitted, 
                      label = paste0(Por, "%"))) +
  ggplot2::geom_col(position = 'dodge') + 
  ggplot2::geom_text(position = position_dodge(width = .9), 
                     vjust = -0.4, 
                     hjust=0.5, size = 2, 
                     check_overlap = T)  +
  ggplot2::coord_cartesian(ylim = c(0, 60)) +
  ggplot2::labs(title = "",
                x = "",
                y = "Porcentaje (%)",
                fill = "") + 
  # ggplot2::coord_flip() +
  ggplot2::theme_gray() +
  ggplot2::scale_fill_brewer(palette="Set1") +
  ggplot2::theme(plot.title = element_text(size=16, face='bold'),
                 strip.text = element_text(size = 12, face = "bold"),
                 axis.title.x = element_text(size = 12, face = 'bold'),
                 axis.title.y = element_text(size = 12, face = 'bold'),
                 axis.text = element_text(size = 12),
                 axis.text.x = element_text(angle = 45, vjust = 1, hjust=1),
                 legend.position="bottom")

En la figura anterior se logra evidenciar como el 55% de los pacientes que han tenido una readmision por emergencia.

2. Clasificacion

Como parte del ejercicio de clasificacion para conocer si un paciente esta en riesgo de tener una readmision, se va a realizar un modelo de clasificacion y para lo cual incialmente se dividira la poblacion objeto de estudio en datos de entrenamiento y datos de prueba.

Para llevar a cabo la clasificacion mediante modelos, un paso importante a seguir es hacer una seleccion de variables que nos permita obtener los mejores resultados, para realizar esta seleccion de variables de manera acertada se hace uso de la libreria Boruta, esta libreria realiza la busqueda de las variables mediante un algoritmo Wrapper de random forest y usa un p-value de 0.01 para definir si una variable es signifcativa.

df <- tidyr::drop_na(df)

df$readmitted <- case_when(df$readmitted %in% c(">30","NO") ~ "0",TRUE ~ "1")
df$readmitted <- as.factor(df$readmitted)
levels(df$readmitted)
## [1] "0" "1"
boruta <- Boruta(readmitted ~., data = df, doTrace = 2)
##  1. run of importance source...
##  2. run of importance source...
##  3. run of importance source...
##  4. run of importance source...
##  5. run of importance source...
##  6. run of importance source...
##  7. run of importance source...
##  8. run of importance source...
##  9. run of importance source...
##  10. run of importance source...
##  11. run of importance source...
##  12. run of importance source...
##  13. run of importance source...
## After 13 iterations, +2.4 mins:
##  confirmed 18 attributes: admission_source_id, admission_type_id, age, change, diag_1 and 13 more;
##  rejected 22 attributes: acarbose, acetohexamide, chlorpropamide, citoglipton, examide and 17 more;
##  still have 8 attributes left.
##  14. run of importance source...
##  15. run of importance source...
##  16. run of importance source...
##  17. run of importance source...
## After 17 iterations, +3 mins:
##  rejected 1 attribute: glipizide;
##  still have 7 attributes left.
##  18. run of importance source...
##  19. run of importance source...
##  20. run of importance source...
## After 20 iterations, +3.3 mins:
##  confirmed 1 attribute: insulin;
##  still have 6 attributes left.
##  21. run of importance source...
##  22. run of importance source...
##  23. run of importance source...
##  24. run of importance source...
##  25. run of importance source...
##  26. run of importance source...
##  27. run of importance source...
##  28. run of importance source...
##  29. run of importance source...
##  30. run of importance source...
## After 30 iterations, +4.7 mins:
##  confirmed 1 attribute: metformin;
##  still have 5 attributes left.
##  31. run of importance source...
##  32. run of importance source...
##  33. run of importance source...
##  34. run of importance source...
##  35. run of importance source...
##  36. run of importance source...
## After 36 iterations, +5.5 mins:
##  rejected 1 attribute: glyburide;
##  still have 4 attributes left.
##  37. run of importance source...
##  38. run of importance source...
##  39. run of importance source...
## After 39 iterations, +6 mins:
##  confirmed 2 attributes: diabetesMed, race;
##  still have 2 attributes left.
##  40. run of importance source...
##  41. run of importance source...
##  42. run of importance source...
##  43. run of importance source...
##  44. run of importance source...
## After 44 iterations, +6.6 mins:
##  rejected 1 attribute: max_glu_serum;
##  still have 1 attribute left.
##  45. run of importance source...
##  46. run of importance source...
##  47. run of importance source...
##  48. run of importance source...
##  49. run of importance source...
##  50. run of importance source...
##  51. run of importance source...
##  52. run of importance source...
##  53. run of importance source...
##  54. run of importance source...
##  55. run of importance source...
## After 55 iterations, +8 mins:
##  confirmed 1 attribute: A1Cresult;
##  no more attributes left.
plot(boruta, las = 2, cex.axis = 0.5)

# plotImpHistory(boruta)
attStats(boruta)
## Boruta performed 55 iterations in 7.998778 mins.
##  23 attributes confirmed important: A1Cresult, admission_source_id,
## admission_type_id, age, change and 18 more;
##  25 attributes confirmed unimportant: acarbose, acetohexamide,
## chlorpropamide, citoglipton, examide and 20 more;
##             encounter_id              patient_nbr                     race 
##                Confirmed                Confirmed                Confirmed 
##                   gender                      age        admission_type_id 
##                 Rejected                Confirmed                Confirmed 
## discharge_disposition_id      admission_source_id         time_in_hospital 
##                Confirmed                Confirmed                Confirmed 
##               payer_code        medical_specialty       num_lab_procedures 
##                Confirmed                Confirmed                Confirmed 
##           num_procedures          num_medications        number_outpatient 
##                Confirmed                Confirmed                 Rejected 
##         number_emergency         number_inpatient                   diag_1 
##                 Rejected                Confirmed                Confirmed 
##                   diag_2                   diag_3         number_diagnoses 
##                Confirmed                Confirmed                Confirmed 
##            max_glu_serum                A1Cresult                metformin 
##                 Rejected                Confirmed                Confirmed 
##              repaglinide              nateglinide           chlorpropamide 
##                 Rejected                 Rejected                 Rejected 
##              glimepiride            acetohexamide                glipizide 
##                 Rejected                 Rejected                 Rejected 
##                glyburide              tolbutamide             pioglitazone 
##                 Rejected                 Rejected                 Rejected 
##            rosiglitazone                 acarbose                 miglitol 
##                 Rejected                 Rejected                 Rejected 
##             troglitazone               tolazamide                  examide 
##                 Rejected                 Rejected                 Rejected 
##              citoglipton                  insulin      glyburide.metformin 
##                 Rejected                Confirmed                 Rejected 
##      glipizide.metformin glimepiride.pioglitazone  metformin.rosiglitazone 
##                 Rejected                 Rejected                 Rejected 
##   metformin.pioglitazone                   change              diabetesMed 
##                 Rejected                Confirmed                Confirmed 
## Levels: Tentative Confirmed Rejected

Como se observa se tienen 23 variables confirmadas como importantes tras la iteracciones y que son tentativas para aplicar dentro del modelo de clasificacion. TRas los analisis obtenidos haciendo uso de la libreria Boruta procedo a separar nuestra data en los test de entrenamiento y de test para aplicar los correspondientes modelos de clasificacion,

Variable de respuesta

  • readmitted

Variables predictoras

  • race
  • gender
  • age
  • time_in_hospital
  • admission_type_id
  • discharge_disposition_id
  • admission_source_id
  • num_lab_procedures
  • num_procedures
  • num_medications
  • max_glu_serum
set.seed(917)
train <- createDataPartition(df$readmitted, p = 0.8, list = FALSE)
training <- df[train, ]
testing <- df[-train, ]
table(training$readmitted)
## 
##     0     1 
## 12808  1232

Como paso inicial para la ejecucion de los modelos, fijamos la semilla para poder crear las particiones de los datos de entrenamiento y de prueba para el modelo, posterior a esto utilizamos la data de entrenamiento para correr los modelos que se van a probar en este ejercicio. Los modelos escogidos son:

  • Modelo lineal genrealizado (glm)
  • Arboles de desicion

Mencion especial para el modelo Random Forest, el cual no pudo ser aplicado por problemas al momento de instalar el paquete.

# ERROR: compilation failed for package ‘randomForest’
# * removing ‘/Library/Frameworks/R.framework/Versions/4.1-arm64/Resources/library/randomForest’
# Warning in install.packages :
#   installation of package ‘randomForest’ had non-zero exit status

Ahora procedemos a realizar la implementacion de los modelos:

data_rose <- ROSE(readmitted ~ race + gender + age + time_in_hospital + admission_type_id +
                    discharge_disposition_id + admission_source_id + num_lab_procedures +
                    num_procedures + num_medications + max_glu_serum,
                  data = training)$data
table(data_rose$readmitted)
## 
##    0    1 
## 7030 7010
trCntl <- trainControl(method = "CV",number = 10)

Modelo 1 : Modelo lineal generalizado

Mod_1 <- train(readmitted ~ race + gender + age + time_in_hospital + admission_type_id +
                       discharge_disposition_id + admission_source_id + num_lab_procedures +
                       num_procedures + num_medications + max_glu_serum,
                     data = data_rose, trControl = trCntl, method = "glm", family = "binomial")
## Warning in predict.lm(object, newdata, se.fit, scale = 1, type = if (type == :
## prediction from a rank-deficient fit may be misleading

## Warning in predict.lm(object, newdata, se.fit, scale = 1, type = if (type == :
## prediction from a rank-deficient fit may be misleading

## Warning in predict.lm(object, newdata, se.fit, scale = 1, type = if (type == :
## prediction from a rank-deficient fit may be misleading

## Warning in predict.lm(object, newdata, se.fit, scale = 1, type = if (type == :
## prediction from a rank-deficient fit may be misleading

## Warning in predict.lm(object, newdata, se.fit, scale = 1, type = if (type == :
## prediction from a rank-deficient fit may be misleading

## Warning in predict.lm(object, newdata, se.fit, scale = 1, type = if (type == :
## prediction from a rank-deficient fit may be misleading

## Warning in predict.lm(object, newdata, se.fit, scale = 1, type = if (type == :
## prediction from a rank-deficient fit may be misleading

## Warning in predict.lm(object, newdata, se.fit, scale = 1, type = if (type == :
## prediction from a rank-deficient fit may be misleading

## Warning in predict.lm(object, newdata, se.fit, scale = 1, type = if (type == :
## prediction from a rank-deficient fit may be misleading

## Warning in predict.lm(object, newdata, se.fit, scale = 1, type = if (type == :
## prediction from a rank-deficient fit may be misleading
logit_pred <- predict(Mod_1, testing)
## Warning in predict.lm(object, newdata, se.fit, scale = 1, type = if (type == :
## prediction from a rank-deficient fit may be misleading
confusionMatrix(logit_pred, testing$readmitted)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction    0    1
##          0 2024  149
##          1 1177  159
##                                           
##                Accuracy : 0.6221          
##                  95% CI : (0.6058, 0.6382)
##     No Information Rate : 0.9122          
##     P-Value [Acc > NIR] : 1               
##                                           
##                   Kappa : 0.0592          
##                                           
##  Mcnemar's Test P-Value : <2e-16          
##                                           
##             Sensitivity : 0.6323          
##             Specificity : 0.5162          
##          Pos Pred Value : 0.9314          
##          Neg Pred Value : 0.1190          
##              Prevalence : 0.9122          
##          Detection Rate : 0.5768          
##    Detection Prevalence : 0.6193          
##       Balanced Accuracy : 0.5743          
##                                           
##        'Positive' Class : 0               
## 

Modelo 2 : Arboles de decision (DT)

Mod_2 <- train(readmitted ~ race + gender + age + time_in_hospital + admission_type_id +
                    discharge_disposition_id + admission_source_id + num_lab_procedures +
                    num_procedures + num_medications + max_glu_serum, 
                  data = data_rose, trControl = trCntl, method = "rpart")

DT_pred <- predict(Mod_2, testing)
confusionMatrix(DT_pred, testing$readmitted)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction    0    1
##          0 2561  204
##          1  640  104
##                                          
##                Accuracy : 0.7595         
##                  95% CI : (0.745, 0.7735)
##     No Information Rate : 0.9122         
##     P-Value [Acc > NIR] : 1              
##                                          
##                   Kappa : 0.084          
##                                          
##  Mcnemar's Test P-Value : <2e-16         
##                                          
##             Sensitivity : 0.8001         
##             Specificity : 0.3377         
##          Pos Pred Value : 0.9262         
##          Neg Pred Value : 0.1398         
##              Prevalence : 0.9122         
##          Detection Rate : 0.7298         
##    Detection Prevalence : 0.7880         
##       Balanced Accuracy : 0.5689         
##                                          
##        'Positive' Class : 0              
## 

3. Evaluacion de los modelos

Para la evaluacion de los modelos de clasificacion, haremos uso de las metricas de sensibilidad, especificidad, prevalencia, accuracy y el indice de Kappa

Para evaluar cual es el mejor modelo, se han tenido en cuenta las metricas presentadas en la tabla anterior, en la cual se tiene que:

# |         | Sensibilidad  | especificdad | prevalencia | Kappa | Accuracy |
# |-------------------------------------------------------------------------|
# |Modelo 1 |  0.6323       |   0.5162     |  0.9122     |0.0592 | 0.6221   |
# |Modelo 2 |  0.8001       |   0.3377     |  0.9122     |0.084  | 0.7595   |
# |-------------------------------------------------------------------------|

Evaluando los indicadores presentados en la tabla anterior, es posible evidenciar como el accuracy es más alto en el Modelo 2, el cual corresponde al modelo de arboles de decision. Lo que indicaria un mejor rendimiento del segundo modelo al momento de realizar la clasificacion de cuando un paciente puede ser readmitido teniendo en cuenta su historial de ingresos, dias de estadia, tipo de admision.

4. Conlusiones

Finalmente al realizar todo este ejercicio de revision y de prediccion, para el cual se exploraron un conjunto de variables demograficas, variables enfocadas a procedimientos clinicos y de diagnosticos con el fin de lograr dar respuesta a la pregunta de investigacion que consiste en determinar si este conjunto de variables permite clasificar y determinar aquellos pacientes que tienen una mayor probabilidad a tener un reingreso dentro de los 30 dias.

Segun el analisis realizado y presentado en la seccion anterior, teniendo en cuenta los coeficientes de Kappa y los resultados entregados por la matriz de confusion como lo son la sensibilidad, especificidad, prevalencia que nos permiten tener una correcta clasificacion. Es posible decidir que el modelo de arboles de decision es aquel que entrega una mejor precision, esto es un 75.95% de precision en la clasificacion.

Hubiera sido importante haber contado con la variable numero de ingresos a urgencias dentro del analisis, para conocer como puede afectar esta el modelo de clasificacion. Sin embargo a contar con una alta cantidad de datos atipicos puede generar un “ruido” o afectacion en las estimaciones.

Finalmente es importante mencionar la importancia de que los hospitales y clinicas continuen utilizando variables demograficas como lo son edad, genero, junto con el registro de admisiones, dias de hospitalizacion,de procedimientos, tambien el incluir el control de medicametos que permite tener una correlacion y un control historico que permita brindar una mejor atencion, lo que repercute directamente en la cantidad de reingresos, costos asociados a estos ingresos y a las posibles complicaciones.

Por lo cual se recomienda continuar realizando este seguimiento y control de informacion, como parte de futuras investigaciones es posible generar distintos factores que agrupen las variables ya existentes y nuevas variables con las cuales poder aplicar un modelo de causa efecto, via PLS path modeling con el cual conocer las cargas factoriales y los aquellos factores que tienen mayor influencia en el reingreso de pacientes.

5. Bibliografia