Práctica 1 Fundamentos de Minería de Datos y Big Data

En esta práctica nos preguntamos qué nivel de colesterol aumenta la probabilidad de que suframos una enfermedad coronaria. Para ello, tenemos una base de datos obtenida del repositorio de “machine learning” de UCLA: https://archive.ics.uci.edu/dataset/45/heart+disease. Puedes consultar qué variables contiene y los posibles valores que pueden tomar. Como verás, tiene “missing values”. Perio vayamos por partes:

Ejercicio 1

Busca las variables con valores omitidos y trata de imputar un valor usando alguna de las técnicas aprendidas en clase.

Ejercicio 2

1.- Discute si los valores de las variables que contiene el archivo parecen razonables (lo que desconozcas, lo tendrás que buscar), y cómo de representativa es la muestra disponible.

2.-Analiza de manera descriptiva/visual qué dicen los datos sobre la relación entre tener una enfermedad coronaria y el nivel de colesterol.

Ejercicio 3

Como habrás visto, dicha relación no parece muy clara . Aunque es bien sabido el impacto del colesterol en la salud cardiaca. ¿Ocultan algo los datos? ¿Qué crees que puede estar pasando?

Ejercicio 4

Nuestra sospecha es que la edad es un factor “confusor”. Para ello, escribe un script en R que obtenga el coeficiente de la regresión logística que predice probabilidad de enfermedad cardiaca frente a nivel de colesterol para distintos grupos de edad. Como la muestra no es grande, recomendamos hacer una ventana de edades (empezamos con toda la muestra y vamos eliminando el más joven a cada paso). Haz un gráfico y analiza a partir de qué edad el modelo detecta una relación que no contradice la evidencia médica. Piensa, entonces, si este modelo se puede generalizar a la población o debería hacerse específico para una subpoblación

Pista: se muestra un posible script del que se han omitido algunas indicaciones

coef<-vector() #almacena los distintos coeficientes
age_v<-seq(?,?,1) #genera una secuencia de edades

for (i in 1:length(age_v))
{
  
  heart_sub<-subset(heart,age>age_v[i])  #elige la submuestra correspondiente
  model <- glm( target ~chol, data = ?, family = binomial) #estima el logit
  coef[i]<-model$coefficients[?] #almacena el coeficiente
  
}

plot(age_v,coef) #realiza el gráfico

Ejercicio 5

Vuelve a pensar tus respuestas dadas en el ejercicio 2 y en el ejercicio 3.

Para los grupos de edad donde el modelo detecta que el colesterol tiene un efecto negativo, haz un gráfico que muestre la probabilidad de enfermedad cardiaca condicionado al nivel de colesterol.

Pista: se muestra un posible script del que se han omitido algunas indicaciones

age_v2<-seq(?,?,1) #se introduce una secuencia de edades
cholesterol<-seq(?,?,1) #se introduce una secuencia de valores de coloesterol
pred<-matrix(0,length(age_v2),length(cholesterol))#se crea una matriz para almacenar las predicciones
data_chol<-data.frame(chol=cholesterol)
for (i in 1:length(age_v2))
{
  
  heart_sub<-subset(heart,age>age_v2[i]) 
  model <- glm( target ~chol, data = ?, family = binomial)
  pred[i,]<-predict(model,newdata=?, type="response")
}

row.names(pred)<-age_v2
colnames(pred)<-cholesterol
col_set <- rainbow(nrow(pred))

matplot(t(pred), x = seq(?,?,1),type = "b",main="Probability of heart disease at different ages",
        ylab="Probabiilty", xlab="cholesterol",col=col_set)

legend("bottomleft", inset=0.01, legend=age_v2, col=col_set,pch=15:19,
       bg= ("white"), horiz=F)

Ejercicio 6

Se suele incidir en que niveles de azúcar altos y de tensión arterial son factores de riesgo para tener enfermedad cardiaca. Discute el impacto del nivel de azúcar y de tensión arterial sobre la probabilidad de enfermedad cardiaca, así como tratar de ver la interacción de estas con el colesterol y la edad de los individuos.

Pista: se muestra un posible script para visualizar las interacciones

#crea una variable "age_q" que divida a los individuos por grupos de edades como te parezca interesante


age_q<- as.factor(ifelse( ???????


sugar_heart<- as.factor(ifelse(heart$fbs==1&heart$target==1, 'HighSugar_Heart1',
                               ifelse(heart$fbs==1&heart$target==0,'HighSugar_Heart0',                              ifelse(heart$fbs==0&heart$target==1,'LowSugar_Heart1','LowSugar_Heart0'))))

heart<-data.frame(heart,sugar_heart,age_q)

interaction.plot(x.factor = heart$age_q,
                 trace.factor = heart$sugar_heart, 
                 response = heart$chol, fun = mean ,xlab="Age",
                 ylab="cholesterol", trace.label="Sugar and Heart Disease", 
                 col=c("green","red","blue","black"),
                 lty=4, lwd=2.5 )


#se puede hacer un gráfico similar con la tensión arterial "trestbps"



press_heart<- as.factor(ifelse(heart$trestbps<122&heart$target==1, 'LowPress_Heart1',
                         ifelse(heart$trestbps<122&heart$target==0, 'LowPress_Heart0', 
                                ifelse(heart$trestbps>=122&heart$target==1, 'HighPress_Heart1', 'HighPress_Heart0'))))





#...y respecto al nivel de azúcar

sugar_heart<- as.factor(ifelse(heart$fbs==1&heart$target==1, 'HighSugar_Heart1',
                               ifelse(heart$fbs==1&heart$target==0, 'HighSugar_Heart0', 
                                      ifelse(heart$fbs==0&heart$target==1, 'LowSugar_Heart1', 'LowSugar_Heart0'))))

Ejercicio 7

Estima y discute el modelo de regresión logística que crees más lógico tras lo aprendido anteriormente. ¿Cómo has incluido las interacciones? ¿Qué grupos de individuos podrían dar lugar a predicciones contraintuitivas?

Se puede proponer realizar predicciones de diferentes individuos representativos (unirlo a lo visto anteriormente) y comparar lo obtenido por el modelo con la idea de criticar el uso, de nuevo, del p-valor. Por ejemplo ¿qué predice el modelo para un individuo de 70 años con 150,200,250 y 300 de colesterol, con azúcar y tensión de 100? ¿qué ocurre si el individuo tiene 40 años?