rm(list=ls())
library(data.table)
library(margins)
library(caret)
library(ggplot2)
library(rpart)
library(rpart.plot)
library(factoextra)
library(dbscan)
base <- fread("C:/Users/Esteban/Desktop/UAI/1 Sem 2021/Data Science/Controles/Control 3/DATOS CONTROL 3.csv")
Observación: No obtendrá puntaje si compara un modelo de regresión de una variable.
Primera regresión: Buscamos predecir la Presión Arterial en reposo a partir de las variables edad, sexo, Colesterol, Frecuencia cardíaca máxima alcanzada y ataque al corazón.
d.reg1 <- formula(trtbps ~age+sex+chol+thalachh+output)
reg_1 <- lm(d.reg1,data=base)
summary(reg_1)
##
## Call:
## lm(formula = d.reg1, data = base)
##
## Residuals:
## Min 1Q Median 3Q Max
## -38.991 -11.229 -0.966 10.019 64.248
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 88.52941 11.85669 7.467 9.20e-13 ***
## age 0.54469 0.11973 4.549 7.85e-06 ***
## sex -2.13415 2.23900 -0.953 0.3413
## chol 0.01368 0.01960 0.698 0.4858
## thalachh 0.09610 0.04978 1.931 0.0545 .
## output -5.15991 2.26243 -2.281 0.0233 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 16.76 on 297 degrees of freedom
## Multiple R-squared: 0.1024, Adjusted R-squared: 0.08729
## F-statistic: 6.777 on 5 and 297 DF, p-value: 5.31e-06
Al realizar esta regresion notamos que las variables sex chol thalachh output, no son estadisticamente significativas. Por lo que no es conveniente agregarlas al modelo. De hecho si corremos un modelo de regersión solo con la variable significativa (age ) notaremos que el R cuadrado ajustado es más alto, lo que no indica que es mejor excluir las variables estaditicamente no siginificativas .
Para plantear un buen segundo modelo de regresion realice varias regresiones lineales simples para evaluar la significancia estaditica de las variables. En este segundo modelo mejorado quitamos las variables independientes sex chol thalachh output y agregamos fbs, que corresponde a una variable dummy que indica si el azúcar en sangre en ayunas es mayor a 120 mg / dl.
Segunda regresión: Buscamos predecir la Presión Arterial en reposo a partir de las variables age,oldpeak y fbs.
d.reg2 <- formula(trtbps~age+oldpeak+fbs)
reg_2 <- lm(d.reg2,data=base)
summary(reg_2)
##
## Call:
## lm(formula = d.reg2, data = base)
##
## Residuals:
## Min 1Q Median 3Q Max
## -35.872 -10.785 -1.239 10.039 63.885
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 104.0149 5.7970 17.943 < 2e-16 ***
## age 0.4463 0.1080 4.131 4.7e-05 ***
## oldpeak 2.1725 0.8389 2.590 0.01008 *
## fbs 7.3200 2.6935 2.718 0.00696 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 16.55 on 299 degrees of freedom
## Multiple R-squared: 0.1187, Adjusted R-squared: 0.1099
## F-statistic: 13.43 on 3 and 299 DF, p-value: 3.029e-08
Al realizar esta segunda regresion encontramos que todas las variables incluidas so significativas al 95% . Y también podemos notar que el R cuadrado ajustado es superior al del modelo 1. (0.08729<0.1099). Además si comparamos los R squared de ambos modelos, el r squared del primero es superior al del segundo, lo que nos indica una mayor capacidad predictiva. (0.1024 <0.1187)
Otra forma de ver las capacidades predictivas de nuestros modelos es comparando los RMSE de ambos.
base$fit_lineal1 <- fitted(reg_1,base)
base$fit_lineal2 <- fitted(reg_2,base)
data.table(RMSE=RMSE(base$fit_lineal1,base$trtbps),
MAE=MAE(base$fit_lineal1,base$trtbps))
## RMSE MAE
## 1: 16.58848 12.82995
data.table(RMSE=RMSE(base$fit_lineal2,base$trtbps),
MAE=MAE(base$fit_lineal2,base$trtbps))
## RMSE MAE
## 1: 16.43678 12.86658
Podemos notar que el RMSE del segundo modelo es inferior al del primero. De esta manera podemos concluir que el segundo modelo predice de mejor manera de dentro de la muestra.
Pista1: Recuerde setear la semilla set.seed(12345).
Pista2: Si existen variables con NA recuerde que puede excluirlas esas observaciones del análisis, pero no las elimine.
set.seed(12345)
setupKCV <- trainControl(method = 'cv',number = 5, p=0.7)
Primer Modelo
train(d.reg1,data=base,method='lm',trControl=setupKCV)
## Linear Regression
##
## 303 samples
## 5 predictor
##
## No pre-processing
## Resampling: Cross-Validated (5 fold)
## Summary of sample sizes: 242, 242, 242, 244, 242
## Resampling results:
##
## RMSE Rsquared MAE
## 16.86823 0.08034923 13.03859
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
Segundo Modelo
train(d.reg2,data=base,method='lm',trControl=setupKCV)
## Linear Regression
##
## 303 samples
## 3 predictor
##
## No pre-processing
## Resampling: Cross-Validated (5 fold)
## Summary of sample sizes: 243, 241, 242, 243, 243
## Resampling results:
##
## RMSE Rsquared MAE
## 16.33825 0.1251715 12.9107
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
Manteneos las conclusiones anteriores pues el RSME del segundo modelo sigue siendo inferior al del primero. De hecho la diferencia incremento.
Segmentaremos la muestra en base a las variables age y oldpeak, que seria la edad del inidividuo y el peak anterior.
samp <- base[ age > 30 & trtbps <181 ,.(age,trtbps)]
ggplot(samp) +
geom_point(aes(x=age ,y=trtbps))
cluster <- kmeans(x = samp,centers = 5)
fviz_cluster(cluster,data=samp,geom = "point")
Importante: Recuerde setear la semilla set.seed(12345).
Observación: No obtendrá puntaje si compara un modelo de clasificación de una variable.
Primer Arbol: Usaremos las variables age, sex, cp, restecg y caa
arbol1 <- rpart(output ~ age+sex+cp+restecg+caa,data=base,method = 'class')
Segundo Arbol: Usaremos las variables age, thall, thalachh, trtbps
arbol2 <- rpart(output ~ age+thall+thalachh+trtbps,data=base,method = 'class')
Entrenamos los modelos y los graficamos
set.seed(12345)
div <- createDataPartition(base$output, times = 1, p = 0.8, list = F)
train <- base[div,]
test <- base[-div,]
arbol1t <- rpart(output ~ age+sex+cp+restecg+caa, data=train, method = "class")
rpart.plot(arbol1t, main = "Modelo 1: Clasificacion ataque cardiaco")
arbol2t <- rpart(output ~ age+thall+thalachh+trtbps, data=train, method = "class")
rpart.plot(arbol2t, main = "Modelo 2: Clasificacion ataque cardiaco")
Finalmente, hacemos las predicciones y evalueamos los modelos
Del primer Modelo
prediccion_1 <- predict(arbol1t, newdata = test, type = "class")
matriz1 <- table(test$output, prediccion_1)
matriz1
## prediccion_1
## 0 1
## 0 21 8
## 1 8 23
Precisión
sum(diag(matriz1))/sum(matriz1)
## [1] 0.7333333
Del Segundo Modelo
prediccion_2 <- predict(arbol2t, newdata = test, type = "class")
matriz2 <- table(test$output, prediccion_2)
matriz2
## prediccion_2
## 0 1
## 0 16 13
## 1 9 22
Precisión
sum(diag(matriz2))/sum(matriz2)
## [1] 0.6333333
Nos quedamos con el primer modelo, pues tiene una mayor precisión que el segundo. Podemos observar de las matrices que para ambos casos el modelo 1 predice mejor un ataque al corazón.