Cargue todos los paquetes que necesita para trabajar con data.table, modelos de predicción de regresión, árboles de decisión, cluster y Cross-Validation. Además, cargue la base de datos.
ac <- fread("DATOS CONTROL 3.csv")
Realice dos modelos de regresión lineal multiple para predecir la Presión arterial en reposo ¿Cuál predice mejor dentro de muestra?
g
Regression Linear 1: La primera es a base de la presión arterial en repsoso en relacion a la frecuencia cardiaca maxima alcanzada + la edad + nivel de dolor.
summary(reg1)
##
## Call:
## lm(formula = trtbps ~ thalachh + age + cp, data = ac)
##
## Residuals:
## Min 1Q Median 3Q Max
## -37.135 -11.281 -1.682 10.284 69.015
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 91.61113 11.22293 8.163 9.22e-15 ***
## thalachh 0.04643 0.04830 0.961 0.337
## age 0.59284 0.11664 5.083 6.57e-07 ***
## cp 0.86241 0.98546 0.875 0.382
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 16.86 on 299 degrees of freedom
## Multiple R-squared: 0.08535, Adjusted R-squared: 0.07617
## F-statistic: 9.3 on 3 and 299 DF, p-value: 6.747e-06
get_regression_table(reg1) %>% kable()
| term | estimate | std_error | statistic | p_value | lower_ci | upper_ci |
|---|---|---|---|---|---|---|
| intercept | 91.611 | 11.223 | 8.163 | 0.000 | 69.525 | 113.697 |
| thalachh | 0.046 | 0.048 | 0.961 | 0.337 | -0.049 | 0.141 |
| age | 0.593 | 0.117 | 5.083 | 0.000 | 0.363 | 0.822 |
| cp | 0.862 | 0.985 | 0.875 | 0.382 | -1.077 | 2.802 |
Regression Linear 2: La segunda es a base de la presión arterial en repsoso en relación a a los resultados electrocardigraficos en reposo + la edad + chol.
summary(reg2)
##
## Call:
## lm(formula = trtbps ~ restecg + age + chol, data = ac)
##
## Residuals:
## Min 1Q Median 3Q Max
## -40.269 -11.287 -1.052 9.475 65.432
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 101.10500 7.13630 14.168 < 2e-16 ***
## restecg -2.51884 1.87061 -1.347 0.179
## age 0.49917 0.10960 4.555 7.65e-06 ***
## chol 0.01913 0.01930 0.991 0.322
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 16.83 on 299 degrees of freedom
## Multiple R-squared: 0.08779, Adjusted R-squared: 0.07864
## F-statistic: 9.592 on 3 and 299 DF, p-value: 4.581e-06
get_regression_table(reg2) %>% kable()
| term | estimate | std_error | statistic | p_value | lower_ci | upper_ci |
|---|---|---|---|---|---|---|
| intercept | 101.105 | 7.136 | 14.168 | 0.000 | 87.061 | 115.149 |
| restecg | -2.519 | 1.871 | -1.347 | 0.179 | -6.200 | 1.162 |
| age | 0.499 | 0.110 | 4.555 | 0.000 | 0.283 | 0.715 |
| chol | 0.019 | 0.019 | 0.991 | 0.322 | -0.019 | 0.057 |
Interpretación
Cual es la mejor regreción para el metodo:
Para estos primeros 2 modelos podemos concluir que la mejor regression es la segunda por las siguentes razones:
Ante un aumento en una unidad de la Frecuencia cardíaca máxima alcanzada vemos que la presion arterial en reposo aumenta en 0,059 mantenitendo la edad constante. Ante un aumento de 1 año de la persona la presión arterial aumenta en 0,599 manteniendo el resto de las variabels constantes. Según los resultados de estimación la variable “pertenecer al sindicato” es estadísticamente significativa, el p-valor asociado para contrastar H0 : βunion = 0 es cerca de cero, es decir, menor de cualquier nivel de significancia α.
Dado esto, y viendo que el Rsquared, nos damos cuenta que el Rsquared de la segunda regression es mayor por un minimo valor que la primera regression por lo que se puede concluir que predice mejor la muestra.
Realice validación cruzada (CV) a los modelos de la pregunta anterior por el método K-folds con 5 folds. ¿Se mantienen las conclusiones anteriores?
print(predkfolds1) %>% kable()
## Linear Regression
##
## 303 samples
## 2 predictor
##
## No pre-processing
## Resampling: Cross-Validated (5 fold)
## Summary of sample sizes: 242, 242, 242, 244, 242
## Resampling results:
##
## RMSE Rsquared MAE
## 16.8324 0.08340251 12.89862
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
| RMSE | Rsquared | MAE | |
|---|---|---|---|
| 16.8324 | 0.08340251 | 12.89862 |
print(predkfolds2) %>% kable()
## Linear Regression
##
## 303 samples
## 2 predictor
##
## No pre-processing
## Resampling: Cross-Validated (5 fold)
## Summary of sample sizes: 243, 241, 242, 243, 243
## Resampling results:
##
## RMSE Rsquared MAE
## 16.67876 0.09043137 12.92614
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
| RMSE | Rsquared | MAE | |
|---|---|---|---|
| 16.67876 | 0.09043137 | 12.92614 |
Se mantiene la conclución ya que el RMSE es menor en la segunda regression. En esta ocación nos podemos dar cuenta que el RMSE (16.67876 < 16.8324). Por esto, neuvamente podemos concluir que la segunda regression es mejor, ya que un Error Cuadratico Medio nos entrega mas confianza detras de una prediccion a base de criterios estadisticos.
Proponga dos variables sobre las cuales segmentar la muestra, en orden de hacer análisis de clusters con el método de kmeans. Muestre sus resultados gráficamente.
data_cluster <- ac[,.(age, trtbps)]
ggplot(data_cluster, aes(x = age, y= trtbps)) +
geom_point()
k1 <- kmeans(x = data_cluster, centers = 5, nstart = 25)
fviz_cluster(k1, data=data_cluster, geom="point")
kNNdistplot(x=data_cluster,k=3)
k2<-dbscan(x=data_cluster,eps = 5,minPts = 3)
fviz_cluster(k2,data=data_cluster,geom = "point")
Realice dos modelos de árboles de clasificación de la variable output. Pruebe cuál modelo clasifica mejor con validación cruzada. Entrene el modelo con un 80% de la muestra y testee con el 20% restante. Explicite qué modelo es mejor y porqué.
arbol1 <- rpart(output~chol+age+caa, data=ac, method = "class")
rpart.plot(arbol1, main = "Árbol de Clasificación Numero 1: Output")
set.seed(12345)
div <- createDataPartition(ac$output, times = 1, p = 0.8, list = F)
train <- ac[div,]
test <- ac[-div,]
as.numeric(ac$age)
## [1] 63 37 41 56 57 57 56 44 52 57 54 48 49 64 58 50 58 66 43 69 59 44 42 61 40
## [26] 71 59 51 65 53 41 65 44 54 51 46 54 54 65 65 51 48 45 53 39 52 44 47 53 53
## [51] 51 66 62 44 63 52 48 45 34 57 71 54 52 41 58 35 51 45 44 62 54 51 29 51 43
## [76] 55 51 59 52 58 41 45 60 52 42 67 68 46 54 58 48 57 52 54 45 53 62 52 43 53
## [101] 42 59 63 42 50 68 69 45 50 50 64 57 64 43 55 37 41 56 46 46 64 59 41 54 39
## [126] 34 47 67 52 74 54 49 42 41 41 49 60 62 57 64 51 43 42 67 76 70 44 60 44 42
## [151] 66 71 64 66 39 58 47 35 58 56 56 55 41 38 38 67 67 62 63 53 56 48 58 58 60
## [176] 40 60 64 43 57 55 65 61 58 50 44 60 54 50 41 51 58 54 60 60 59 46 67 62 65
## [201] 44 60 58 68 62 52 59 60 49 59 57 61 39 61 56 43 62 63 65 48 63 55 65 56 54
## [226] 70 62 35 59 64 47 57 55 64 70 51 58 60 77 35 70 59 64 57 56 48 56 66 54 69
## [251] 51 43 62 67 59 45 58 50 62 38 66 52 53 63 54 66 55 49 54 56 46 61 67 58 47
## [276] 52 58 57 58 61 42 52 59 40 61 46 59 57 57 55 61 58 58 67 44 63 63 59 57 45
## [301] 68 57 57
arbol2 <- rpart(output ~ age+chol+caa, data = train, method = "class")
rpart.plot(arbol2)
prediccion1 <- predict(arbol2, newdata = test, type = "class")
matriz <- table(test$output, prediccion1)
precision <- sum(diag(matriz))/sum(matriz)
precision
## [1] 0.6666667
arbol3 <- rpart(output~chol+exng+sex+trtbps, data=ac, method = "class")
rpart.plot(arbol3, main = "Árbol de Clasificación Numero 2: Output")
set.seed(12345)
div2 <- createDataPartition(ac$output, times = 1, p = 0.8, list = F)
train2 <- ac[div2,]
test2 <- ac[-div2,]
arbol4 <- rpart(output~chol+exng+sex+trtbps, data = train2, method = "class")
rpart.plot(arbol4)
prediccion2 <- predict(arbol4, newdata = test, type = "class")
matriz2 <- table(test2$output, prediccion2)
precision2 <- sum(diag(matriz2))/sum(matriz2)
precision2
## [1] 0.6166667
Respecto a lo que hicimos anteriormente, con los arboles, nos damos cuenta que el primer modelo tiene una precisión de un 75%, mientras que el segundo modelo tiene una precisión del 76.6%. Dado esto, el segundo modelo es mejor y es mas preciso para poder obtener información prediciendo la cantidad de personas que han tenido el ataque al corazon.