Según el National Heart, Lung, and Blood Institute, la enfermedad coronaria es una de las principales causas de muerte en los Estados Unidos. Y esto ocurre aún pudiendo controlar muchos de los factores de riesgo para prevenir la enfermedad.
Además, según la Organización Mundial de la Salud, las enfermedades cardiovasculares (entre la que se encuentra la enfermedad coronaria) son la principal causa de muerte en el mundo.
Debido a la frecuencia de esta enfermedad, en este trabajo se intenta crear un modelo para predecir si un paciente padece esta enfermedad a partir de unas serie de variables medidas como la frecuencia cardíaca o el nivel de colesterol en sangre.
La sangre es vital para el correcto funcionamiento del cuerpo. Entre sus funciones se encuentra el transporte de oxígeno y nutrientes a las células además de la retirada de las sustancias de desecho de las mismas.
La sangre es transportada por todo el cuerpo gracias a que es bombeada por el corazón. Este recibe sangre con poco oxígeno que manda a los pulmones para que se oxigene y la sangre que recibe de los pulmones la bombea al resto del cuerpo.
Un aporte inadecuado de sangre puede llevar a que las células no obtengan suficiente energía para realizar sus funciones, provocando su muerte en el peor caso.
El corazón también necesita oxígeno y nutrientes para continuar realizando su función, estos llegan por unas arterias conocidas como arterias coronarias. Cuando se da una enfermedad coronaria se habla de una dificultad del flujo sanguíneo en estas arterias debido a la acumulación de sustancias sobre sus paredes.
En el peor caso, el efecto de privar a las células del corazón de nutrientes y oxígeno da lugar a un infarto, es decir, la muerte de parte de las células del corazón. Lo cuál, a su vez, tiene repercusión en el resto del cuerpo pues el bombeo de sangre se ve afectado al debilitarse el corazón.
Aterosclerosis: acumulación de sustancias sobre las paredes de las arterias pudiendo dificultar el flujo sanguíneo. Además, la ruptura de esta placa de sustancias puede causar la formación de un coágulo de sangre (trombo) que, a su vez, puede bloquear aún más la zona afectada o dirigirse a otras partes del cuerpo y bloquear otras zonas (émbolo) (Fuentes: American Heart Association, Mayo Clinic)
Isquemia: reducción del flujo sanguíneo en un órgano (como el corazón). Esto implica una reducción del aporte de oxígeno y nutrientes, por lo que las células no pueden obtener la energía suficiente para realizar sus funciones de manera normal. (Fuentes: American Heart Association, Mayo Clinic, Wikipedia)
Angina: molestia en el pecho debido a una isquemia en las arterias coronarias. (Fuentes: United Kingdom National Health Service, Video sobre angina de Alberto Sanagustín)
Angina estable: angina que se da en situaciones que demanden oxígeno (por ejemplo durante el ejercicio o en situaciones de estrés) y se calma en reposo
Angina inestable: angina que además de poderse dar durante un esfuerzo también puede darse estando en reposo
Angina típica y atípica: se habla de angina típica cuando se manifiesta como una molestia alrededor del pecho. Sin embargo, algunas personas pueden no notar esta molestia sino otros síntomas como náusea o dificultad respiratoria. Se habla, entonces, de una angina atípica que suele ser más común en mujeres. (Fuentes: Harrington Hospital, Wikipedia)
Trombo: es un coágulo de sangre, es decir, masa de sangre en estado sólido que obstruye el paso de la sangre en un vaso sanguíneo. (Fuente: MedlinePlus)
Émbolo: trombo que se desprende y se dirigirse a otras partes del cuerpo. (Fuente: MedlinePlus)
Infarto agudo de miocardio: también conocido como ataque cardíaco, es la muerte de parte del músculo del corazón debido a una isquemia. Es decir, la muerte de parte de las células del músculo por falta de oxígeno y nutrientes. (Fuentes: Healthline, Wikipedia)
Electrocardiograma: registro en un gráfico de las señales eléctricas que provocan los latidos del corazón. A las distintas partes del registro de un latido normal se les ha dado un nombre distintivo, los más interesantes para el proyecto son la onda T y el segmento ST porque pueden dar información acerca de la presencia de problemas como isquemia, infarto, etc. (Fuentes: Mayo Clinic, Wikipedia, Video sobre electrocardiograma de Alberto Sanagustín, Serie de videos sobre el electrocardiograma normal de Alberto Sangaustín).
Prueba de esfuerzo nuclear: se inyecta un tinte radioactivo al paciente para poder ver el flujo de la sangre en reposo y haciendo ejercicio. Además, también se mide la actividad eléctrica del corazón (electrocardiograma). (Fuentes: Mayo Clinic, Healthline)
Enfermedad Asintomática: una enfermedad se considera asintomática si un paciente advierte muy pocos síntomas o ninguno. (Fuentes: definicion.de, MayoClinic)
Hipertrofia del ventrículo izquierdo: engrosamiento de las paredes de la cavidad del corazón que impulsa la sangre al resto del cuerpo. Esto puede hacer que el músculo pierda elasticidad y el corazón deje de funcionar adecuadamente. (Fuente: Mayo Clinic)
El conjunto de datos ha sido tomado de Kaggle (Heart Disease UCI), que a su vez ha sido tomado de UCI Machine Learning Repository. Se tienen datos de alrededor de 300 pacientes de Cleveland y las variables que se recogen están descritas en una sección siguiente.
Gracias al post del usuario InitPic se ha podido advertir que el conjunto de datos en Kaggle es distinto al de UCI Machine Learning Repository pero la descripción de los datos es la misma. Así que la descripción de los datos en la siguiente sección se ha hecho ajustándose a los datos que tenemos.
Parte de este cambio con respecto a los datos originales es que los valores nulos en el conjunto original aquí toman un valor numérico:
A few more things to consider:
data #93, 159, 164, 165 and 252 have ca=4 which is incorrect. In the original Cleveland dataset they are NaNs (so they should be removed)
data #49 and 282 have thal = 0, also incorrect. They are also NaNs in the original dataset.
Como son pocos registros, en este trabajo se ha optado por descartarlos del conjunto.
# Leemos los datos
data <- read.csv('../data/heart.csv')
# El conjunto de datos tiene unos registros con valores no disponibles,
# como son muy pocos lo más sencillo es quitarlos del conjunto.
# En el conjunto de datos de Kaggle los missing value
# tienen unos valores numéricos: 4 para ca, 0 para thal
missing_ca_indeces <- which(data$ca %in% 4)
missing_thal_indeces <-which(data$thal %in% 0)
missing_values_indeces <- c(missing_ca_indeces, missing_thal_indeces)
data <- data[-missing_values_indeces, ]
# Transformamos el tipo de las variables categóricas a factores
data$sex <- as.factor(data$sex)
data$cp <- as.factor(data$cp)
data$fbs <- as.factor(data$fbs)
data$restecg <- as.factor(data$restecg)
data$exang <- as.factor(data$exang)
data$slope <- as.factor(data$slope)
data$thal <- as.factor(data$thal)
data$target <- as.factor(data$target)
# Le damos un nombre más amigable a los valores de los factores para las gráficas
levels(data$sex) <- c("Mujer", "Hombre")
levels(data$cp) <- c("Asintomático", "Angina atípica", "Sin angina", "Angina típica")
levels(data$fbs) <- c("No", "Sí")
levels(data$restecg) <- c("Hipertrofia", "Normal", "Anormalidades")
levels(data$exang) <- c("No", "Sí")
levels(data$slope) <- c("Descendente", "Plano", "Ascendente")
levels(data$thal) <- c("Defecto fijo", "Flujo normal", "Defecto reversible")
levels(data$target) <- c("Padece", "No_padece")
Variable objetivo: indica si el paciente padece una enfermedad coronaria o no.
Podemos observar que la distribución está bastante equilibrada. Gracias a esto no sería mala idea usar la precisión de los modelos como una medida general de su calidad.
Edad del paciente en años. En los datos se refleja, como cabe esperar, que la edad es un factor de riesgo, es decir, a mayor edad más probabilidad de padecer esta enfermedad.
Sexo del paciente
Hay aproximadamente la mitad de datos de mujeres que de hombres. Sin embargo, se puede ver que la edad es también un factor de riesgo para los hombres como se indica en varias de las referencias.
Tipo de dolor en el pecho
La descripción de los datos originales no aporta mucha más información acerca de cómo se llegó a esta clasificación para el tipo de dolor. Sin embargo, se puede ver que un médico atendiendo sólo al tipo de dolor del paciente tiende a fallar bastante a la hora de determinar que un paciente tiene angina pues en la mayoría de los casos resulta que no padece enfermedad coronaria.
Presión sanguínea en reposo en milímetros de mercurio (mm Hg) en el momento de ser ingresado en el hospital.
Por los distintos picos que se ven en el histograma parece que los pacientes tienden a tener una presión normal dentro de su grupo (adultos sanos, adultos que toman medicamentos, tercera edad, etc). Y también parece que un nivel elevado puede ser un buen indicativo de que el paciente presente la enfermedad.
Colesterol en mg/dl. Una variable que las personas podemos controlar, se puede ver que a mayor colesterol mayor índice de aparición de la enfermedad. Resulta curioso que los casos más extremos de colesterol no padezcan la enfermedad, esto puede deberse a otras variables que no podemos ver en este sencillo histograma. O puede ser por variables no observadas, por ejemplo, puede ser que estos pacientes realmente no estuvieran en ayunas a la hora de tomar las muestras de sangre.
Si el nivel de azúcar en sangre en ayunas es mayor a 120 mg/dl o no. Esta es otra variable que se puede controlar. Sin embargo, por sí sola no parece ser muy útil para determinar si un paciente presenta una enfermedad o no. Aunque a priori no podemos descartarla puede que junto con otras variables sí ayude a determinar mejor si un paciente padece o no una enfermedad.
ggplot(data, aes(data$fbs, fill=data$target)) +
geom_bar() +
labs(fill="Enfermedad", x="Nivel de azúcar > 120 mg/dl", y="Número de pacientes")
A partir de aquí las variables están relacionadas con una prueba de esfuerzo nuclear. Es decir, una prueba de esfuerzo donde además se inyecta un tinte radiactivo al paciente para ver gráficamente su flujo sanguíneo.
Resultado del electrocardiograma en reposo.
Cuando se presenta una enfermedad coronaria, el primer síntoma suele ser angina al hacer un esfuerzo. Cuando la angina aparece hasta estando en reposo significa que se ha agravado la enfermedad (normalmente debido a un mayor estrechamiento de las arterias). Por esto son pocos los pacientes a los que se les ve una anormalidad en la actividad del corazón estando en reposo, lo cuál es muy indicativo de la presencia de una enfermedad coronaria. Y también esto explica que una buena parte de los pacientes tengan la enfermedad aún teniendo un ritmo cardíaco normal en reposo.
Por otro lado la posible presencia de una hipertrofia en el ventrículo izquierdo no parece ser muy indicativo por sí solo de la presencia de una enfermedad. Lo más probable es que este valor no se pudiera medir con la suficiente precisión.
Frecuencia cardíaca máxima alcanzada durante la prueba de esfuerzo.
A simple vista puede parecer raro que los pacientes con una mayor frecuencia cardíaca tengan una menor frecuencia de presencia de enfermedad y viceversa. Sin embargo, tiene más sentido al tener en cuenta que la frecuencia cardíaca máxima de una persona depende de la edad (220 - edad). Las mayores frecuencias máximas suelen corresponder a gente más joven.
ggplot(data, aes(data$thalach, fill=data$target)) +
geom_histogram(binwidth=10) +
labs(fill="Enfermedad", x="Frecuencia cardíaca máxima durante el ejercicio", y="Número de pacientes")
Pacientes con una frecuencia cardíaca máxima durante el ejercicio menor a 100:
Pacientes con una frecuencia cardíaca máxima durante el ejercicio mayor a 180:
Si haciendo ejercicio el paciente tuvo angina o no
Se puede ver que la presencia de angina durante ejercicio es un buen indicador de que el paciente padezca una enfermedad coronaria. Sin embargo, también se vuelve a ver que determinar lo que es angina no es algo sencillo pues se puede confundir con otros dolores o puede ser una angina atípica.
Descenso del segmento ST al hacer ejercicio en relación con el mismo en reposo.
El segmento ST es una parte del electrocardiograma de un latido que suele encontrarse a un cierto nivel en un latido normal. Un desplazamiento significativo de este segmento puede ser un indicativo de la presencia de una enfermedad coronaria como se puede ver en los datos.
Pendiente del segmento ST durante la parte más exigente del ejercicio
En la primera gráfica se puede ver que la pendiente por si sola puede ayudar a determinar la presencia de una enfermedad si resulta plana o ascendente. Sin embargo, que la pendiente sea descendente por sí solo no parece dar mucha información. Por ello, en la segunda gráfica se añade una tercera variable y se puede ver que, si la pendiente es descendente, la depresión del segmento ST puede ayudar bastante a determinar si un paciente padece una enfermedad coronaria.
Resultados del flujo sanguíneo medido con el tinte radioactivo
Esta variable, al igual que la siguiente, se obtiene de un proceso bastante intrusivo para los pacientes. Pero por si solas dan una indicación bastante acertada de la presencia o no de una enfermedad coronaria.
Número de vasos sanguíneos principales coloreados por el tinte radioactivo. El número varía de 0 a 4 aunque el valor 4 representa un valor nulo, los cuales se han quitado del conjunto de datos en una celda anterior.
Esta variable se refiere al número de vasos sanguíneos estrechos que se han visto, por ello se puede ver en los datos que a un mayor valor de esta variable mayor es la frecuencia de presencia de una enfermedad coronaria.
Para esta parte he elegido cuatro modelos. Tres modelos son sencillos: regresión logística por ser uno de los modelos con más historia, naive bayes para ver hasta dónde se puede llegar con la asunción de que las variables sean independientes y árboles de decisión para compararlo con el cuarto modelo. El último modelo es random forest para comparar las métricas de los otros modelos con uno que no es tan fácil de interpretar.
Los valores no disponibles ya han sido eliminado de los datos en una celda de código anterior. También se han convertido las variables categóricas al tipo factor de R. Aparte de eso no ha hecho falta realizar ningún preprocesado de los datos pues parece que ya se realiza un preprocesado antes de entrenar los modelos. Por ejemplo, en regresión logística no ha hecho falta convertir los datos categóricos a numéricos, ni lidiar con la multicolinearidad.
Para poder evaluar los clasificadores primero vamos a dividir el conjunto de datos en entrenamiento (70%) y testeo (30%). Esto intentando que la distribución de la variable objetivo sea la misma en ambos.
# Divide el conjunto de datos en entrenamiento y testeo
# manteniendo la misma distribución de la variable objetivo
set.seed(8)
training_indeces <- createDataPartition(data$target, p = .7, list = FALSE)
data.train <- data[ training_indeces,]
data.test <- data[-training_indeces,]
# Validación cruzada de 10 pliegues
fitControl <- trainControl(method="cv", number=10)
El conjunto de testeo imita a datos nuevos en el mundo real, sólo se usará al final del proyecto para obtener una medida fiable del clasificador elegido sobre datos que no ha visto nunca.
El conjunto de entrenamiento se usará para evaluar los modelos mediante validación cruzada de 10 pliegues. Por simplicidad dejaremos la elección de los hiperparámetros por defecto, esto significa que se elegirán unos valores aleatorios y se entrenarán los clasificadores mediante validación cruzada por cada combinación.
set.seed(8)
model.lr <- train(target ~ .,
data = data.train,
method = "glm",
family=binomial(),
trControl = fitControl)
model.lr
## Generalized Linear Model
##
## 208 samples
## 13 predictor
## 2 classes: 'Padece', 'No_padece'
##
## No pre-processing
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 187, 187, 188, 186, 188, 187, ...
## Resampling results:
##
## Accuracy Kappa
## 0.8501948 0.6939953
Parece que esta implementación de regresión logística no tiene hiperparámetros que se puedan especificar. Sin embargo, ya vemos unos resultados de validación cruzada bastante interesantes. La precisión es bastante buena y un índice Kappa de casi 0.7 lo cuál suele considerarse bastante bueno también.
set.seed(8)
model.tree <- train(target ~ .,
data = data.train,
method = "rpart",
trControl = fitControl)
model.tree
## CART
##
## 208 samples
## 13 predictor
## 2 classes: 'Padece', 'No_padece'
##
## No pre-processing
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 187, 187, 188, 186, 188, 187, ...
## Resampling results across tuning parameters:
##
## cp Accuracy Kappa
## 0.05208333 0.7487446 0.4947878
## 0.06250000 0.7301299 0.4566230
## 0.48958333 0.5816883 0.1238841
##
## Accuracy was used to select the optimal model using the largest value.
## The final value used for the model was cp = 0.05208333.
Para el árbol de decisión se ha probado con 3 hiperparámetros. cp
es un hiperparámetro de rpart
que gobierna la complejidad del modelo: menores valores dan árboles más complejos. Podemos ver que con los menores valores del hiperparámetro salen mejores árboles, seguramente porque con los cp
mayores los árboles resultan muy pequeños.
Las métricas son aceptables y además, el árbol resultante es bastante pequeño y fácil de interpretar como se ve a continuación.
Vemos que la frecuencia cardíaca en el ejercicio es la variable principal, sólo con esto (e implícitamente la edad) se puede decidir que una persona no padezca una enfermedad coronaria, acertando en el 76% de los casos. Si además se incluye el número de vasos sanguíneos coloreados por el tinte, se puede ver que es muy probable que una persona con una frecuencia cardíaca alta durante el ejercicio y sin vasos sanguíneos coloreados no padezca una enfermedad coronaria.
Una mejor estrategia de elección de hiperparámetros sería una vía sencilla para intentar obtener resultados mejores, siempre teniendo en cuenta el riesgo del sobreajuste, claro.
set.seed(8)
model.nb <- train(target ~ .,
data = data.train,
method = "naive_bayes",
trControl = fitControl)
model.nb
## Naive Bayes
##
## 208 samples
## 13 predictor
## 2 classes: 'Padece', 'No_padece'
##
## No pre-processing
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 187, 187, 188, 186, 188, 187, ...
## Resampling results across tuning parameters:
##
## usekernel Accuracy Kappa
## FALSE 0.7834632 0.5483933
## TRUE 0.8175108 0.6364399
##
## Tuning parameter 'laplace' was held constant at a value of 0
##
## Tuning parameter 'adjust' was held constant at a value of 1
## Accuracy was used to select the optimal model using the largest value.
## The final values used for the model were laplace = 0, usekernel = TRUE
## and adjust = 1.
Parece que se pueden obtener resultados bastante aceptables asumiendo que las variables son totalmente independientes entre sí. Tampoco es de sorprender pues este modelo es conocido por dar también resultados aceptables en la clasificación de mensajes de SPAM.
set.seed(8)
model.rf <- train(target ~ .,
data = data.train,
method = "rf",
trControl = fitControl)
model.rf
## Random Forest
##
## 208 samples
## 13 predictor
## 2 classes: 'Padece', 'No_padece'
##
## No pre-processing
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 187, 187, 188, 186, 188, 187, ...
## Resampling results across tuning parameters:
##
## mtry Accuracy Kappa
## 2 0.8168182 0.6282945
## 10 0.8211255 0.6397040
## 18 0.8020779 0.6000209
##
## Accuracy was used to select the optimal model using the largest value.
## The final value used for the model was mtry = 10.
Curiosamente este modelo sigue siendo considerablemente peor que regresión logística. Puede que con una mejor estrategia para elegir los valores de los hiperparámetros esto hubiése sido distinto.
En las tablas siguientes se puede ver un resumen de los resultados de los 10 pliegues de validación cruzada.
model.all <- list(RegLogistica=model.lr, Arbol=model.tree, NaiveBayes=model.nb, RandomForest=model.rf)
results <- resamples(model.all)
summary(results, metric=c("Kappa", "Accuracy"))
##
## Call:
## summary.resamples(object = results, metric = c("Kappa", "Accuracy"))
##
## Models: RegLogistica, Arbol, NaiveBayes, RandomForest
## Number of resamples: 10
##
## Kappa
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## RegLogistica 0.4375000 0.6146459 0.7031032 0.6939953 0.8086530 0.9049774
## Arbol 0.1919192 0.3643689 0.5088203 0.4947878 0.6083732 0.7272727
## NaiveBayes 0.3524229 0.5300288 0.6608108 0.6364399 0.7031690 0.9049774
## RandomForest 0.3939394 0.5226980 0.6560297 0.6397040 0.7159299 0.9041096
## NA's
## RegLogistica 0
## Arbol 0
## NaiveBayes 0
## RandomForest 0
##
## Accuracy
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## RegLogistica 0.7142857 0.8196429 0.8535714 0.8501948 0.9047619 0.9523810
## Arbol 0.6000000 0.6750000 0.7619048 0.7487446 0.8071429 0.8636364
## NaiveBayes 0.6666667 0.7646104 0.8297619 0.8175108 0.8553571 0.9523810
## RandomForest 0.7000000 0.7619048 0.8297619 0.8211255 0.8620130 0.9523810
## NA's
## RegLogistica 0
## Arbol 0
## NaiveBayes 0
## RandomForest 0
Regresión logística ha sido el mejor claramente teniendo en cuenta las métricas. Además, sus métricas no varían mucho si vemos los cuartiles.
Por otro lado, el resto de modelos tienen métricas que varían más, lo que indica que pueden no ser tan fiables para tratar con datos nuevos. El árbol de decisión me sorprendió gratamente debido a su sencillez, pero parece ser el menos fiable, tal vez con una mejor elección de hiperparámetros resulte un modelo más robusto.
Como resultados finales vamos a ver los de regresión logítica por ser el mejor modelo. Y también vamos a ver los del árbol para ver si en el conjunto de testeo varían mucho las métricas con respecto a la media de validación cruzada.
Primero se muestran los resultados de regresión logística
## Confusion Matrix and Statistics
##
## Reference
## Prediction Padece No_padece
## Padece 34 5
## No_padece 6 43
##
## Accuracy : 0.875
## 95% CI : (0.7873, 0.9359)
## No Information Rate : 0.5455
## P-Value [Acc > NIR] : 3.53e-11
##
## Kappa : 0.7474
##
## Mcnemar's Test P-Value : 1
##
## Sensitivity : 0.8500
## Specificity : 0.8958
## Pos Pred Value : 0.8718
## Neg Pred Value : 0.8776
## Prevalence : 0.4545
## Detection Rate : 0.3864
## Detection Prevalence : 0.4432
## Balanced Accuracy : 0.8729
##
## 'Positive' Class : Padece
##
Podemos ver que se mantienen más o menos las mismas métricas que con validación cruzada, lo cuál es bastante positivo. Y se tiene una matriz de confusión con la mayoría de las observaciones en la diagonal principal.
Por otra parte, los resultados en el árbol de decisión son mucho peores, como era de esperar son resultados bastante distintos a la media de validación cruzada.
## Confusion Matrix and Statistics
##
## Reference
## Prediction Padece No_padece
## Padece 32 23
## No_padece 8 25
##
## Accuracy : 0.6477
## 95% CI : (0.5386, 0.7466)
## No Information Rate : 0.5455
## P-Value [Acc > NIR] : 0.03351
##
## Kappa : 0.3111
##
## Mcnemar's Test P-Value : 0.01192
##
## Sensitivity : 0.8000
## Specificity : 0.5208
## Pos Pred Value : 0.5818
## Neg Pred Value : 0.7576
## Prevalence : 0.4545
## Detection Rate : 0.3636
## Detection Prevalence : 0.6250
## Balanced Accuracy : 0.6604
##
## 'Positive' Class : Padece
##
Se ha conseguido adquir unos conocimientos básicos acerca de un tema bastante alejado de la informática. Esta es una habilidad bastante importante en la ciencia de datos pues el conocimiento sobre el dominio específico que se está tratando nos permite entender lo que estamos haciendo y tomar mejores decisiones.
En este proyecto, este conocimiento ha servido para entender las variables pues la descripción original era bastante limitada. Sin embargo, también se podría usar este conocimiento para crear nuevas variables que puedan mejorar el rendimiento de los clasificadores, por ejemplo, se podría discretizar la edad, intentar elimitar el factor de la edad en la frecuencia cardíaca, combinar la edad con la presión sanguínea, combinar el nivel de descenso del segmento ST con su pendiente, etc.
Otra posible vía para mejorar los resultados sería mejorar la elección de los hiperparámetros de los modelos o elegir otros modelos. Y una vía más sería realizar este proyecto sin las variables que suponen insertar un tinte radioactivo a los pacientes.
Respecto a la calidad de los modelos, hemos visto cómo la interpretación de la validación cruzada no se debe centrar en ver sólo un estadístico como la media. Gracias a esto hemos podido determinar el mejor modelo y comprobar que un modelo que tiene resultados bastantes dispersos durante el entrenamiento no generaliza bien con datos nuevos.
Finalmente, se ha obtenido un clasificador de la presencia de una enfermedad coronaria con unos resultados bastante aceptables.
El autor de este proyecto es Carlos Domínguez García y el código del proyecto, así como el resto de recursos usados se pueden encontrar en el repositorio de Github del proyecto.
Además de los enlaces que se encuentran por el documento a modo de referencia, también se ha hecho uso de los siguientes recursos para entender mejor el tema:
“Heart disease and heart attacks”. Khan Academy. Visto por última vez el 30/10/2019. Link: https://www.khanacademy.org/science/health-and-medicine/healthcare-misc/v/heart-disease-and-heart-attacks
“Cellular respiration introduction”. Khan Academy. Visto por última vez el 30/10/2019. Link: https://www.khanacademy.org/science/biology/cellular-respiration-and-fermentation/intro-to-cellular-respiration/v/introduction-to-cellular-respiration
“Enfermedades cardiovasculares”. Organización Mundial de la Salud. Visto por última vez el 30/10/2019. Link: https://www.who.int/es/news-room/fact-sheets/detail/cardiovascular-diseases-(cvds)
“Heart Disease”. Mayo Clinic. Visto por última vez el 05/11/2019. Link: https://www.mayoclinic.org/diseases-conditions/heart-disease/symptoms-causes/syc-20353118
“Coronary artery disease”. Mayo Clinic. Visto por última vez el 17/11/2019. Link: https://www.mayoclinic.org/diseases-conditions/coronary-artery-disease/symptoms-causes/syc-20350613
“Heart Attack (Myocardial Infarction)”. Cleveland Clinic. Visto por última vez el 17/11/2019. Link: https://my.clevelandclinic.org/health/diseases/16818-heart-attack-myocardial-infarction
“Coronary Artery Disease”. Cleveland Clinic. Visto por última vez el 17/11/2019. Link: https://my.clevelandclinic.org/health/diseases/16898-coronary-artery-disease
Institute of Medicine (US) Committee on Social Security Cardiovascular Disability Criteria. Cardiovascular Disability: Updating the Social Security Listings. Washington (DC): National Academies Press (US); 2010. 7, Ischemic Heart Disease. Available from: https://www.ncbi.nlm.nih.gov/books/NBK209964/