This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.
When you click the Knit button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:
#EXPLORACION DE DATOS
library(readxl)
library(dplyr)
##
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(splines)
library(mgcv)
## Cargando paquete requerido: nlme
##
## Adjuntando el paquete: 'nlme'
## The following object is masked from 'package:dplyr':
##
## collapse
## This is mgcv 1.9-3. For overview type 'help("mgcv-package")'.
library(ggplot2)
library(gratia)
## Warning: package 'gratia' was built under R version 4.5.3
library(tree)
## Warning: package 'tree' was built under R version 4.5.3
datose <- read_xlsx("salud_cardiovascular.xlsx")
head(datose)
## # A tibble: 6 × 10
## id edad sexo imc presion_sistolica glucosa_ayuno actividad_fisica
## <dbl> <dbl> <chr> <dbl> <dbl> <dbl> <chr>
## 1 1 19 F 23.3 102 73 activo
## 2 2 24 M 17.8 138 98 moderado
## 3 3 44 F 25 116 84 activo
## 4 4 74 F 33.1 149 91 moderado
## 5 5 31 F 28.9 80 84 sedentario
## 6 6 31 F 33.1 118 97 moderado
## # ℹ 3 more variables: fumador <chr>, riesgo_cardiovascular <dbl>,
## # riesgo_alto <chr>
EDAD
##
## Call:
## glm(formula = riesgo_alto ~ poly(edad, 2), family = binomial,
## data = datose)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.2681 0.5175 -4.383 1.17e-05 ***
## poly(edad, 2)1 75.3423 12.2910 6.130 8.80e-10 ***
## poly(edad, 2)2 4.5504 9.1195 0.499 0.618
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 609.16 on 499 degrees of freedom
## Residual deviance: 243.96 on 497 degrees of freedom
## AIC: 249.96
##
## Number of Fisher Scoring iterations: 8
##
## Call:
## glm(formula = riesgo_alto ~ poly(edad, 3), family = binomial,
## data = datose)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -5.112 2.221 -2.302 0.0213 *
## poly(edad, 3)1 173.045 70.010 2.472 0.0134 *
## poly(edad, 3)2 -62.092 46.816 -1.326 0.1847
## poly(edad, 3)3 39.533 23.848 1.658 0.0974 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 609.16 on 499 degrees of freedom
## Residual deviance: 239.37 on 496 degrees of freedom
## AIC: 247.37
##
## Number of Fisher Scoring iterations: 10
##
## Call:
## glm(formula = riesgo_alto ~ poly(edad, 4), family = binomial,
## data = datose)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -5.110971 5.861117 -0.872 0.383
## poly(edad, 4)1 173.001050 178.859243 0.967 0.333
## poly(edad, 4)2 -62.052118 156.844964 -0.396 0.692
## poly(edad, 4)3 39.512358 81.284008 0.486 0.627
## poly(edad, 4)4 0.009228 34.397474 0.000 1.000
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 609.16 on 499 degrees of freedom
## Residual deviance: 239.37 on 495 degrees of freedom
## AIC: 249.37
##
## Number of Fisher Scoring iterations: 12
## Analysis of Deviance Table
##
## Model 1: riesgo_alto ~ edad
## Model 2: riesgo_alto ~ poly(edad, 2)
## Model 3: riesgo_alto ~ poly(edad, 3)
## Model 4: riesgo_alto ~ poly(edad, 4)
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 498 244.19
## 2 497 243.96 1 0.2341 0.62854
## 3 496 239.37 1 4.5852 0.03225 *
## 4 495 239.37 1 0.0000 0.99979
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Single term deletions
##
## Model:
## riesgo_alto ~ poly(edad, 3)
## Df Deviance AIC LRT Pr(>Chi)
## <none> 239.37 247.37
## poly(edad, 3) 3 609.16 611.16 369.79 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Modelo RMSE
## 1 Lineal 0.2775445
## 2 Poli2 0.2773615
## 3 Poli3 0.2754523
## 4 Poli4 0.2754523
SEXO
#Basándose en el hecho de que la variable es categórica, solo se pueden usar modelos paramétricos. En este caso, se usa el modelo glm ya que la variable es categórica.
datose$riesgo_alto <- factor(datose$riesgo_alto, levels = c("bajo", "alto"))
datose$sexo <- as.factor(datose$sexo)
#modelo
modelosexo <- glm(riesgo_alto ~ sexo,
data = datose,
family = binomial)
summary(modelosexo)
##
## Call:
## glm(formula = riesgo_alto ~ sexo, family = binomial, data = datose)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.0090 0.1396 -7.227 4.95e-13 ***
## sexoM 0.3095 0.1961 1.579 0.114
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 609.16 on 499 degrees of freedom
## Residual deviance: 606.66 on 498 degrees of freedom
## AIC: 610.66
##
## Number of Fisher Scoring iterations: 4
#dado a que el modelo muestra que el cambio de sexo no es estadísticamente significativo para explicar el riesgo alto se utiliza entonces un chisq test para observar si realmente no hay relación estadística
tabla_sexo <- table(datose$sexo, datose$riesgo_alto)
print(tabla_sexo)
##
## bajo alto
## F 192 70
## M 159 79
prop.table(tabla_sexo, margin = 1)
##
## bajo alto
## F 0.7328244 0.2671756
## M 0.6680672 0.3319328
chisq.test(tabla_sexo)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: tabla_sexo
## X-squared = 2.2, df = 1, p-value = 0.138
#el chisq test muestra que sexo realmente no es significativa al mostrar un p.value mayor a 0.05
#Por tanto se utilizara un modelo con controles
modelosexocontrol <- glm(
riesgo_alto ~ sexo + edad + imc + presion_sistolica + glucosa_ayuno,
data = datose,
family = binomial
)
summary(modelosexocontrol)
##
## Call:
## glm(formula = riesgo_alto ~ sexo + edad + imc + presion_sistolica +
## glucosa_ayuno, family = binomial, data = datose)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -34.649822 4.225409 -8.200 2.40e-16 ***
## sexoM 0.782722 0.408770 1.915 0.0555 .
## edad 0.285364 0.030969 9.215 < 2e-16 ***
## imc 0.319718 0.054676 5.847 4.99e-09 ***
## presion_sistolica 0.060106 0.014359 4.186 2.84e-05 ***
## glucosa_ayuno 0.010369 0.009391 1.104 0.2695
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 609.16 on 499 degrees of freedom
## Residual deviance: 164.52 on 494 degrees of freedom
## AIC: 176.52
##
## Number of Fisher Scoring iterations: 8
#Aun con el modelo de controles sexo demuestra no ser estadisticamente significativa
#representación visual
boxplot(riesgo_cardiovascular ~ sexo,
data = datose,
col = "aquamarine",
main = "Riesgo cardiovascular ~ Sexo")
imc
#factor
datose$riesgo_alto <- factor(datose$riesgo_alto, levels = c("bajo", "alto"))
datose$riesgo_num <- ifelse(datose$riesgo_alto == "alto", 1, 0)
#ver si hay relacion evidente
plot(datose$imc, datose$riesgo_num,
main="ims vs riesgo ",
pch=19, col="darkblue")
# como no hay se utilizara el mejor modelo
modeloimc <- glm(riesgo_alto ~ poly(imc, 3), data = datose, family = binomial)
#ver cual modelo polinomial es mejor
m1 <- glm(riesgo_alto ~ poly(imc, 1), data = datose, family = binomial)
m2 <- glm(riesgo_alto ~ poly(imc, 2), data = datose, family = binomial)
m3 <- glm(riesgo_alto ~ poly(imc, 3), data = datose,family = binomial)
m4 <- glm(riesgo_alto ~ poly(imc, 4), data = datose,family = binomial)
tabla_anova_imc <- anova(m1, m2, m3, m4)
print(tabla_anova_imc)
## Analysis of Deviance Table
##
## Model 1: riesgo_alto ~ poly(imc, 1)
## Model 2: riesgo_alto ~ poly(imc, 2)
## Model 3: riesgo_alto ~ poly(imc, 3)
## Model 4: riesgo_alto ~ poly(imc, 4)
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 498 590.83
## 2 497 587.13 1 3.6961 0.05454 .
## 3 496 584.96 1 2.1709 0.14064
## 4 495 584.19 1 0.7750 0.37868
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#significancia
drop1(modeloimc, test = "Chisq")
## Single term deletions
##
## Model:
## riesgo_alto ~ poly(imc, 3)
## Df Deviance AIC LRT Pr(>Chi)
## <none> 584.96 592.96
## poly(imc, 3) 3 609.16 611.16 24.2 2.269e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#loess
span_values <- seq(0.2, 0.9, by = 0.05)
errores <- sapply(span_values, function(s) {modelolo <- loess(riesgo_num ~ imc, data =datose, span = s)
sum(modelolo$residuals^2)})
optimo_span <- span_values[which.min(errores)]
print(paste("El span que minimiza el error es:", optimo_span))
## [1] "El span que minimiza el error es: 0.2"
modeloimcl <- loess(riesgo_num ~ imc, data = datose, span = optimo_span)
#spline
modelospimc <- smooth.spline(x = datose$imc, y = datose$riesgo_num,cv = TRUE)
## Warning in smooth.spline(x = datose$imc, y = datose$riesgo_num, cv = TRUE):
## cross-validation with non-unique 'x' values seems doubtful
#predicciones
x_range <- seq(min(datose$imc, na.rm = TRUE), max(datose$imc, na.rm = TRUE),length.out = 100)
prediccionesl <- predict(modeloimcl, newdata = data.frame(imc= x_range))
predlineal <- predict(modeloimc, newdata = data.frame(imc = x_range), type = "response")
predspline <- predict(modelospimc, x = x_range)
#comparativa
plot(datose$imc, datose$riesgo_num,
pch = 16,
col = "pink",
main = "IMC vs riesgo cardiovascular")
lines(x_range, predlineal,col = "red", lwd = 3)
lines(x_range, prediccionesl, col = "steelblue", lwd = 3)
lines(predspline$x, predspline$y,col = "darkgreen",lwd = 3)
#comparacion estadistica
data.frame(Modelo = c("Polinomial3", "LOESS", "Spline"),RMSE = c(sqrt(mean((datose$riesgo_num - predict(modeloimc, type = "response"))^2, na.rm = TRUE)),sqrt(mean((datose$riesgo_num - predict(modeloimcl))^2, na.rm = TRUE)),sqrt(mean((datose$riesgo_num- predict(modelospimc, x = datose$imc)$y)^2, na.rm = TRUE))))
## Modelo RMSE
## 1 Polinomial3 0.4467027
## 2 LOESS 0.4409212
## 3 Spline 0.4475874
#Aquí el modelo que reduce el error y por ende modela mejor la relación es el modelo LOESS, sin embargo es de relevancia mencionar el span chico que se está utilizando por lo cual el modelo es más flexible y sensible a variaciones locales. Por ello, si el objetivo fuera construir un modelo más predictivo y menos dependiente de la forma específica de la muestra el polinomial será el mejor modelo a utilizar.
presion_sistolica
#factor
datose$riesgo_alto <- factor(datose$riesgo_alto, levels = c("bajo", "alto"))
datose$riesgo_num <- ifelse(datose$riesgo_alto == "alto", 1, 0)
#observar la relacion
plot(datose$presion_sistolica, datose$riesgo_num,
main="presion vs riesgo ",
pch=19, col="darkblue")
# como no hay se utilizara el mejor modelo
modelopr <- glm(riesgo_alto ~ poly(presion_sistolica, 3), data = datose, family = binomial)
#ver cual modelo polinomial es mejor
m1p <- glm(riesgo_alto ~ poly(presion_sistolica, 1), data = datose, family = binomial)
m2p <- glm(riesgo_alto ~ poly(presion_sistolica, 2), data = datose, family = binomial)
m3p <- glm(riesgo_alto ~ poly(presion_sistolica, 3), data = datose, family = binomial)
m4p <- glm(riesgo_alto ~ poly(presion_sistolica, 4), data = datose, family = binomial)
tablapr <- anova(m1p, m2p, m3p, m4p, test = "Chisq" )
print(tablapr)
## Analysis of Deviance Table
##
## Model 1: riesgo_alto ~ poly(presion_sistolica, 1)
## Model 2: riesgo_alto ~ poly(presion_sistolica, 2)
## Model 3: riesgo_alto ~ poly(presion_sistolica, 3)
## Model 4: riesgo_alto ~ poly(presion_sistolica, 4)
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 498 595.69
## 2 497 593.73 1 1.9622 0.16127
## 3 496 590.39 1 3.3360 0.06778 .
## 4 495 590.21 1 0.1847 0.66737
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#significancia
drop1(modelopr, test = "Chisq")
## Single term deletions
##
## Model:
## riesgo_alto ~ poly(presion_sistolica, 3)
## Df Deviance AIC LRT Pr(>Chi)
## <none> 590.39 598.39
## poly(presion_sistolica, 3) 3 609.16 611.16 18.766 0.0003055 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#LOES
spanvaluespr <- seq(0.2, 0.9, by = 0.05)
errorespr <- sapply(spanvaluespr, function(s) {modelolopr <- loess(riesgo_num ~ presion_sistolica, data = datose, span = s)
sum(modelolopr$residuals^2)})
optimospanpr <- spanvaluespr[which.min(errorespr)]
print(paste("El span que minimiza el error es:", optimospanpr))
## [1] "El span que minimiza el error es: 0.2"
modeloprlo <- loess(riesgo_num ~ presion_sistolica, data = datose, span = optimospanpr)
#Spline
modelosppr <- smooth.spline( x = datose$presion_sistolica, y = datose$riesgo_num, cv = TRUE)
## Warning in smooth.spline(x = datose$presion_sistolica, y = datose$riesgo_num, :
## cross-validation with non-unique 'x' values seems doubtful
#predicciones
xrangepr <- seq(min(datose$presion_sistolica, na.rm = TRUE),max(datose$presion_sistolica, na.rm = TRUE),length.out = 100)
prediccionesprlo <- predict(modeloprlo,newdata = data.frame(presion_sistolica = xrangepr))
predpr <- predict(modelopr,newdata = data.frame(presion_sistolica = xrangepr), type = "response")
predsplinepr <- predict(modelosppr,x = xrangepr)
#comparativa
plot(datose$presion_sistolica, datose$riesgo_num,
pch = 16,
col = "purple",
main = "Presión sistólica vs riesgo cardiovascular")
lines(xrangepr, predpr, col = "red", lwd = 3)
lines(xrangepr, prediccionesprlo, col = "steelblue", lwd = 3)
lines(predsplinepr$x, predsplinepr$y, col = "darkgreen", lwd = 3)
#comparativa estadistica
data.frame(Modelo = c("Polinomial3", "LOESS", "Spline"),RMSE = c(sqrt(mean((datose$riesgo_num - predict(modelopr, type = "response"))^2, na.rm = TRUE)), sqrt(mean((datose$riesgo_num - predict(modeloprlo))^2, na.rm = TRUE)), sqrt(mean((datose$riesgo_num - predict(modelosppr, x = datose$presion_sistolica)$y)^2, na.rm = TRUE))))
## Modelo RMSE
## 1 Polinomial3 0.4481671
## 2 LOESS 0.4440639
## 3 Spline 0.4484260
#Aquí el modelo que reduce el error y por ende modela mejor la relación es el modelo LOESS, sin embargo es de relevancia mencionar el span chico que se está utilizando por lo cual el modelo es más flexible y sensible a variaciones locales. Por ello, si el objetivo fuera construir un modelo más predictivo y menos dependiente de la forma específica de la muestra el polinomial será el mejor modelo a utilizar
Note that the echo = FALSE parameter was added to the
code chunk to prevent printing of the R code that generated the
plot.
glucosa_ayuno
#factor
datose$riesgo_alto <- factor(datose$riesgo_alto, levels = c("bajo", "alto"))
datose$riesgo_num <- ifelse(datose$riesgo_alto == "alto", 1, 0)
#ver la relacion
plot(datose$glucosa_ayuno, datose$riesgo_num,main = "glucosa en ayuno vs riesgo",pch = 19, col = "darkblue")
#como no se observa una ralacion simple se utilizara otro modelo
modeloga <- glm(riesgo_alto ~ poly(glucosa_ayuno, 4), data = datose, family = binomial)
m1ga <- glm(riesgo_alto ~ poly(glucosa_ayuno, 1), data = datose, family = binomial)
m2ga <- glm(riesgo_alto ~ poly(glucosa_ayuno, 2), data = datose, family = binomial)
m3ga <- glm(riesgo_alto ~ poly(glucosa_ayuno, 3), data = datose, family = binomial)
m4ga <- glm(riesgo_alto ~ poly(glucosa_ayuno, 4), data = datose, family = binomial)
m5ga <- glm(riesgo_alto ~ poly(glucosa_ayuno, 5), data = datose, family = binomial)
tablaga <- anova(m1ga, m2ga, m3ga, m4ga, m5ga)
print(tablaga)
## Analysis of Deviance Table
##
## Model 1: riesgo_alto ~ poly(glucosa_ayuno, 1)
## Model 2: riesgo_alto ~ poly(glucosa_ayuno, 2)
## Model 3: riesgo_alto ~ poly(glucosa_ayuno, 3)
## Model 4: riesgo_alto ~ poly(glucosa_ayuno, 4)
## Model 5: riesgo_alto ~ poly(glucosa_ayuno, 5)
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 498 609.16
## 2 497 608.80 1 0.35432 0.5517
## 3 496 608.67 1 0.13232 0.7160
## 4 495 607.12 1 1.55088 0.2130
## 5 494 606.64 1 0.47867 0.4890
#significancia
drop1(modeloga, test = "Chisq")
## Single term deletions
##
## Model:
## riesgo_alto ~ poly(glucosa_ayuno, 4)
## Df Deviance AIC LRT Pr(>Chi)
## <none> 607.12 617.12
## poly(glucosa_ayuno, 4) 4 609.16 611.16 2.0392 0.7285
#LOESS
spanvaluesga <- seq(0.2, 0.9, by = 0.05)
erroresga <- sapply(spanvaluesga, function(s) {modelologa <- loess(riesgo_num ~ glucosa_ayuno, data = datose, span = s)
sum(modelologa$residuals^2)})
optimospanga <- spanvaluesga[which.min(erroresga)]
print(paste("El span que minimiza el error es:", optimospanga))
## [1] "El span que minimiza el error es: 0.2"
modelogalo <- loess(riesgo_num ~ glucosa_ayuno, data = datose, span = optimospanga)
#Spline
modelospga <- smooth.spline(x = datose$glucosa_ayuno,y = datose$riesgo_num,cv = TRUE)
## Warning in smooth.spline(x = datose$glucosa_ayuno, y = datose$riesgo_num, :
## cross-validation with non-unique 'x' values seems doubtful
#predicciones
xrangega <- seq(min(datose$glucosa_ayuno, na.rm = TRUE),max(datose$glucosa_ayuno, na.rm = TRUE),length.out = 100)
prediccionesgalo <- predict(modelogalo,newdata = data.frame(glucosa_ayuno = xrangega))
predga <- predict(modeloga,newdata = data.frame(glucosa_ayuno = xrangega), type = "response")
predsplinega <- predict(modelospga,x = xrangega)
#comparativa
plot(datose$glucosa_ayuno, datose$riesgo_num,
pch = 16,
col = "lightblue",
main = "Glucosa en ayuno vs riesgo cardiovascular")
lines(xrangega, predga, col = "red", lwd = 3)
lines(xrangega, prediccionesgalo, col = "steelblue", lwd = 3)
lines(predsplinega$x, predsplinega$y, col = "darkgreen", lwd = 3)
#comparativa estadistica
data.frame(Modelo = c("Polinomial4", "LOESS", "Spline"),RMSE =
c(sqrt(mean((datose$riesgo_num - predict(modeloga, type = "response"))^2, na.rm = TRUE)),
sqrt(mean((datose$riesgo_num - predict(modelogalo))^2, na.rm = TRUE)),
sqrt(mean((datose$riesgo_num - predict(modelospga, x = datose$glucosa_ayuno)$y)^2, na.rm = TRUE))))
## Modelo RMSE
## 1 Polinomial4 0.4564547
## 2 LOESS 0.4498901
## 3 Spline 0.4573785
#Aquí el modelo que reduce el error y por ende modela mejor la relación es el modelo LOESS, sin embargo es de relevancia mencionar el span chico que se está utilizando por lo cual el modelo es más flexible y sensible a variaciones locales. Por ello, si el objetivo fuera construir un modelo más predictivo y menos dependiente de la forma específica de la muestra el polinomial será el mejor modelo a utilizar.
Fumador
#Basándose en el hecho de que la variable es categórica solo se pueden usar modelos paramétricos en este caso se usa el modelo glm ya que la variable es categórica
datose$riesgo_alto <- factor(datose$riesgo_alto, levels = c("bajo", "alto"))
datose$fumador <- as.factor(datose$fumador)
#modelo
modelosfu <- glm(riesgo_alto ~ fumador,
data = datose,
family = binomial)
summary(modelosfu)
##
## Call:
## glm(formula = riesgo_alto ~ fumador, family = binomial, data = datose)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.9144 0.1155 -7.917 2.44e-15 ***
## fumadorsi 0.2099 0.2175 0.965 0.334
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 609.16 on 499 degrees of freedom
## Residual deviance: 608.24 on 498 degrees of freedom
## AIC: 612.24
##
## Number of Fisher Scoring iterations: 4
#dado a que el modelo muestra que el cambio de si es fumador o no no es estadísticamente significativo para explicar el riesgo alto se utiliza un chisq test para observar si realmente no hay relación estadística
tablafu <- table(datose$fumador, datose$riesgo_alto)
print(tablafu)
##
## bajo alto
## no 262 105
## si 89 44
prop.table(tablafu, margin = 1)
##
## bajo alto
## no 0.7138965 0.2861035
## si 0.6691729 0.3308271
chisq.test(tablafu)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: tablafu
## X-squared = 0.73185, df = 1, p-value = 0.3923
#el chisq test muestra que ser fumador no es realmente significativo al mostrar un p.value mayor a 0.05
#Se usa un modelo con controles
modelofumcontrol <- glm(
riesgo_alto ~ fumador + edad + imc + presion_sistolica + glucosa_ayuno,
data = datose,
family = binomial
)
summary(modelofumcontrol)
##
## Call:
## glm(formula = riesgo_alto ~ fumador + edad + imc + presion_sistolica +
## glucosa_ayuno, family = binomial, data = datose)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -44.39908 6.08703 -7.294 3.01e-13 ***
## fumadorsi 2.67219 0.61302 4.359 1.31e-05 ***
## edad 0.36281 0.04540 7.992 1.33e-15 ***
## imc 0.44432 0.07414 5.993 2.06e-09 ***
## presion_sistolica 0.06666 0.01598 4.172 3.02e-05 ***
## glucosa_ayuno 0.01613 0.01040 1.552 0.121
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 609.16 on 499 degrees of freedom
## Residual deviance: 143.24 on 494 degrees of freedom
## AIC: 155.24
##
## Number of Fisher Scoring iterations: 8
#bajo este modelo la variable fumador sí es estadísticamente significativa al tener un p.value menor a 0.05, lo que indica que ser fumador sí afecta el riesgo cardiovascular manteniendo las demás variables constantes
#representacion visual
boxplot(riesgo_cardiovascular ~ fumador,
data = datose,
col = "lightblue",
main = "Riesgo cardiovascular ~ Fumador")
Actividad fisica
#Basándose en el hecho de que la variable es categórica solo se pueden usar modelos paramétricos en este caso se usa el modelo glm ya que la variable es categórica
datose$riesgo_alto <- factor(datose$riesgo_alto, levels = c("bajo", "alto"))
datose$actividad_fisica <- as.factor(datose$actividad_fisica)
#modelo
modelosac <- glm(riesgo_alto ~ actividad_fisica,
data = datose,
family = binomial)
summary(modelosac)
##
## Call:
## glm(formula = riesgo_alto ~ actividad_fisica, family = binomial,
## data = datose)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.1550 0.2391 -4.830 1.36e-06 ***
## actividad_fisicamoderado 0.3460 0.2873 1.204 0.228
## actividad_fisicasedentario 0.3784 0.2799 1.352 0.176
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 609.16 on 499 degrees of freedom
## Residual deviance: 607.14 on 497 degrees of freedom
## AIC: 613.14
##
## Number of Fisher Scoring iterations: 4
#dado a que el modelo muestra que el cambio de si hace o no actividad física no es estadísticamente significativo para explicar el riesgo alto se utiliza un chisq test para observar si realmente no hay relación estadística
tablaac <- table(datose$actividad_fisica, datose$riesgo_alto)
print(tablaac)
##
## bajo alto
## activo 73 23
## moderado 128 57
## sedentario 150 69
prop.table(tablaac, margin = 1)
##
## bajo alto
## activo 0.7604167 0.2395833
## moderado 0.6918919 0.3081081
## sedentario 0.6849315 0.3150685
chisq.test(tablaac)
##
## Pearson's Chi-squared test
##
## data: tablaac
## X-squared = 1.9613, df = 2, p-value = 0.3751
#el chisq test muestra que hacer actividad fisica no es realmente significativo al mostrar un p.value mayor a 0.05
#Se usa un modelo con controles
modeloactcontrol <- glm(
riesgo_alto ~ actividad_fisica + edad + imc + presion_sistolica + glucosa_ayuno,
data = datose,
family = binomial
)
summary(modeloactcontrol)
##
## Call:
## glm(formula = riesgo_alto ~ actividad_fisica + edad + imc + presion_sistolica +
## glucosa_ayuno, family = binomial, data = datose)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -37.414766 4.657622 -8.033 9.51e-16 ***
## actividad_fisicamoderado 1.136279 0.567196 2.003 0.045142 *
## actividad_fisicasedentario 2.025430 0.608720 3.327 0.000877 ***
## edad 0.317457 0.036116 8.790 < 2e-16 ***
## imc 0.338119 0.056209 6.015 1.80e-09 ***
## presion_sistolica 0.055662 0.014599 3.813 0.000137 ***
## glucosa_ayuno 0.010658 0.009961 1.070 0.284622
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 609.16 on 499 degrees of freedom
## Residual deviance: 155.73 on 493 degrees of freedom
## AIC: 169.73
##
## Number of Fisher Scoring iterations: 8
#bajo este modelo la variable de actividad física sí es estadísticamente significativa y muestra cómo ser sedentario tiene un mayor efecto en tener riesgo cardiovascular, al esta variable tener el mayor coeficiente de todos los estados de actividad. En general este modelo muestra cómo tener actividad física reduce el riesgo cardiovascular en tanto todas las demás variables sean constantes.
#representacion visual
boxplot(riesgo_cardiovascular ~ actividad_fisica,
data = datose,
col = "blue",
main = "Riesgo cardiovascular ~ Actividad física")
#GAM
#convertir a factores
datose$riesgo_alto <- factor(datose$riesgo_alto, levels = c("bajo", "alto"))
datose$sexo <- as.factor(datose$sexo)
datose$fumador <- as.factor(datose$fumador)
datose$actividad_fisica <- as.factor(datose$actividad_fisica)
datose$riesgo_num <- ifelse(datose$riesgo_alto == "alto", 1, 0)
#exploracion visual de datos
par(mfrow = c(2, 4))
plot(datose$edad, datose$riesgo_num, pch = 16, col = "blue",
main = "Riesgo alt0/Edad")
lines(lowess(datose$edad, datose$riesgo_num), col = "darkblue", lwd = 2)
plot(datose$imc, datose$riesgo_num, pch = 16, col = "pink",
main = "Riesgo alto/IM")
lines(lowess(datose$imc, datose$riesgo_num), col = "lightblue", lwd = 2)
plot(datose$presion_sistolica, datose$riesgo_num, pch = 16, col = "aquamarine",
main = "Riesgo alto/Presión")
lines(lowess(datose$presion_sistolica, datose$riesgo_num), col = "purple", lwd = 2)
plot(datose$glucosa_ayuno, datose$riesgo_num, pch = 16, col = "red",
main = "Riesgo alto/Glucosa")
lines(lowess(datose$glucosa_ayuno, datose$riesgo_num), col = "black", lwd = 2)
barplot(prop.table(table(datose$sexo, datose$riesgo_alto), margin = 1),
beside = TRUE, col = c("gold", "brown"),
main = "Riesgo alto/Sexo")
barplot(prop.table(table(datose$fumador, datose$riesgo_alto), margin = 1),
beside = TRUE, col = c("yellow", "green"),
main = "Riesgo alto/Fumador")
barplot(prop.table(table(datose$actividad_fisica, datose$riesgo_alto), margin = 1),
beside = TRUE, col = c("darkgreen", "darkblue"),
main = "Riesgo alto/Actividad física")
par(mfrow = c(1, 1))
#gam
modelogam <- gam(
riesgo_alto ~
s(edad, k = 10) +
s(imc, k = 10) +
s(presion_sistolica, k = 10) +
s(glucosa_ayuno, k = 10) +
sexo +
fumador +
actividad_fisica,
data = datose,
family = binomial,
method = "REML"
)
summary(modelogam)
##
## Family: binomial
## Link function: logit
##
## Formula:
## riesgo_alto ~ s(edad, k = 10) + s(imc, k = 10) + s(presion_sistolica,
## k = 10) + s(glucosa_ayuno, k = 10) + sexo + fumador + actividad_fisica
##
## Parametric coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -8.1698 1.2247 -6.671 2.55e-11 ***
## sexoM 1.0234 0.4998 2.048 0.040593 *
## fumadorsi 3.2808 0.7169 4.576 4.73e-06 ***
## actividad_fisicamoderado 1.5616 0.7021 2.224 0.026135 *
## actividad_fisicasedentario 2.6142 0.7609 3.436 0.000591 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Approximate significance of smooth terms:
## edf Ref.df Chi.sq p-value
## s(edad) 1.000 1.000 54.614 < 2e-16 ***
## s(imc) 3.231 4.042 36.038 4.37e-07 ***
## s(presion_sistolica) 3.682 4.592 15.658 0.00573 **
## s(glucosa_ayuno) 1.000 1.000 2.238 0.13472
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## R-sq.(adj) = 0.832 Deviance explained = 81.8%
## -REML = 62.379 Scale est. = 1 n = 500
#evaluacion del modelo conjunto
par(mfrow = c(2, 2))
gam.check(modelogam)
##
## Method: REML Optimizer: outer newton
## full convergence after 12 iterations.
## Gradient range [-1.097051e-05,1.838552e-06]
## (score 62.37901 & scale 1).
## Hessian positive definite, eigenvalue range [5.504187e-06,0.6052596].
## Model rank = 41 / 41
##
## Basis dimension (k) checking results. Low p-value (k-index<1) may
## indicate that k is too low, especially if edf is close to k'.
##
## k' edf k-index p-value
## s(edad) 9.00 1.00 1.00 0.52
## s(imc) 9.00 3.23 1.01 0.61
## s(presion_sistolica) 9.00 3.68 0.95 0.13
## s(glucosa_ayuno) 9.00 1.00 0.97 0.22
par(mfrow = c(1, 1))
#evaluacion de valores parciales
par(mfrow = c(2, 2))
plot(modelogam, shade = TRUE, shade.col = "blue",
seWithMean = TRUE, scale = 0, residuals = TRUE,
pch = 16, cex = 0.4, col = "darkblue",
select = 1, main = "s(edad) — efecto parcial")
abline(h = 0, lty = 2, col = "gray")
plot(modelogam, shade = TRUE, shade.col = "pink",
seWithMean = TRUE, scale = 0, residuals = TRUE,
pch = 16, cex = 0.4, col = "lightblue",
select = 2, main = "s(imc) — efecto parcial")
abline(h = 0, lty = 2, col = "gray")
plot(modelogam, shade = TRUE, shade.col = "aquamarine",
seWithMean = TRUE, scale = 0, residuals = TRUE,
pch = 16, cex = 0.4, col = "purple",
select = 3, main = "s(presion_sistolica) — efecto parcial")
abline(h = 0, lty = 2, col = "gray")
plot(modelogam, shade = TRUE, shade.col = "red",
seWithMean = TRUE, scale = 0, residuals = TRUE,
pch = 16, cex = 0.4, col = "black",
select = 4, main = "s(glucosa_ayuno) — efecto parcial")
abline(h = 0, lty = 2, col = "gray")
par(mfrow = c(1, 1))
#En base a los resultados se pueden notar distintas cosas en el modelo GAM en primera el modelo explica el 81.8% de la devianza lo cual significa que reduce bastante el error lo que implica que las variables sí logran explicar la variable riesgo alto y por otro lado tiene un buen ajuste de r cuadrada de 83.2%. Por otro lado las variables paramétricas como fumador gracias al coeficiente se puede concluir que fumar sí tiene un efecto significativo en el riesgo alto además de que es la variable con menor p-value indicando significancia, por otro lado se muestra como entre menor actividad existe mayor riesgo ya que tanto sedentario como moderado son significativas y tienen coeficientes positivos, sin embargo el sedentario tiene un coeficiente mayor. Esto contrasta con el análisis individual, donde las variables categóricas no salieron significativas por sí solas. Sin embargo, esto puede pasar porque el GAM no analiza cada variable de forma aislada, sino dentro del conjunto completo de variables.
#En los términos que son numéricos, existe significancia en todos menos en el de glucosa, además todas menos glucosa
#En general en base al modelo se puede decir que las variables significativas en este caso son edad, imc, presión sistólica, sexo, fumar y actividad física
#Arbol de decisiones
datose$riesgo_alto <- as.factor(datose$riesgo_alto)
datose$sexo <- as.factor(datose$sexo)
datose$fumador <- as.factor(datose$fumador)
datose$actividad_fisica <- as.factor(datose$actividad_fisica)
#entrenamiento
set.seed(123)
train <- sample(1:nrow(datose), nrow(datose) / 2)
datose.test <- datose[-train, ]
tree.riesgo <- tree(riesgo_alto ~ edad + sexo + imc + presion_sistolica +glucosa_ayuno + actividad_fisica + fumador,data = datose,subset = train)
summary(tree.riesgo)
##
## Classification tree:
## tree(formula = riesgo_alto ~ edad + sexo + imc + presion_sistolica +
## glucosa_ayuno + actividad_fisica + fumador, data = datose,
## subset = train)
## Variables actually used in tree construction:
## [1] "edad" "imc" "presion_sistolica"
## [4] "glucosa_ayuno"
## Number of terminal nodes: 12
## Residual mean deviance: 0.2553 = 60.77 / 238
## Misclassification error rate: 0.06 = 15 / 250
#visualizacion
plot(tree.riesgo)
text(tree.riesgo, pretty = 0)
#proceso de podado
cv.riesgo <- cv.tree(tree.riesgo, FUN = prune.misclass)
plot(cv.riesgo$size, cv.riesgo$dev, type = "b",
main = "Validación cruzada del árbol")
#aqui el que tiene el nivel mas bajo de error es el nivel 7 ya que aqui se puede observar el "codo"
prune.riesgo <- prune.misclass(tree.riesgo, best = 7)
plot(prune.riesgo)
text(prune.riesgo, pretty = 0)
#comparacion con matrices
pred.riesgo <- predict(tree.riesgo,newdata = datose.test,type = "class")
pred.prune <- predict(prune.riesgo,newdata = datose.test,type = "class")
real.riesgo <- datose.test$riesgo_alto
tabla.riesgo <- table(Real = real.riesgo,Predicho = pred.riesgo)
tabla.prune <- table(Real = real.riesgo,Predicho = pred.prune)
print(tabla.prune)
## Predicho
## Real bajo alto
## bajo 161 16
## alto 11 62
print(tabla.riesgo)
## Predicho
## Real bajo alto
## bajo 160 17
## alto 8 65
accuracy.riesgo <- mean(pred.riesgo == real.riesgo)
accuracy.prune <- mean(pred.prune == real.riesgo)
error.riesgo <- 1 - accuracy.riesgo
error.prune <- 1 - accuracy.prune
comparacion.arboles <- data.frame(
Modelo = c("Árbol sin podar", "Árbol podado"),
Accuracy = c(accuracy.riesgo, accuracy.prune),
Error = c(error.riesgo, error.prune))
print(comparacion.arboles)
## Modelo Accuracy Error
## 1 Árbol sin podar 0.900 0.100
## 2 Árbol podado 0.892 0.108
#En base a este árbol de decisiones las variables que explican mejor o afectan más el riesgo alto son la edad, el imc, la presión sistólica y glucosa. Por otro lado al evaluar el error y accuracy de ambos árboles se demostró como el árbol sin podar tiene un desempeño solo un poco mayor al árbol podado además de que el árbol podado reduce los falsos positivos o mejor dicho los bajos altos. Es entonces que el árbol podado es preferible ya que no se ajusta y de similar manera no deja que personas con riesgo alto sean desapercibidas.