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:
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
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)
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.
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.
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,
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:
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)
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
##
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
##
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:
Accuracy: Es la metrica comunmente utilizada para evaluar el rendimiento de los modelos de clasificacion y representa la cantidad de predicciones correctas, esto respecto del total de predicciones realizadas por el modelo.
Sensibilidad: La sensibilidad o tambien conocidad como tasas de verdaderos positivos, se encarga de representar la proporcion de casos positivos correctamente clasificados por el modelo.
Especificidad: Es la metrica encargada de evaluar los modelos de clasificacion y que se centra especificamente en identificar correctamente aquellos casos negativos.
# | | 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.
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.