Abraham Castañon - A01747966 Angie Zerón - A00834060
En este Markdown se buscará hacer un análisis de las probabilidades que tiene cada caso de tener diabetes o no
La base de datos que se utilizó fue sacada de Kaggle y todos los derechos de la misma son del propietario Link: https://www.kaggle.com/datasets/kandij/diabetes-dataset/data
Variables:
Pregnancies: Número de embarazos que ha tenido la persona.
Glucose: Nivel de glucosa en sangre medido en mg/dL. Es una medida de la concentración de azúcar en la sangre.
BloodPressure: Presión arterial sistólica y diastólica en mmHg. La presión arterial sistólica es la presión en las arterias cuando el corazón late, y la presión arterial diastólica es la presión cuando el corazón está en reposo entre latidos.
SkinThickness: Espesor del pliegue cutáneo en mm. Es una medida del grosor de la piel en ciertas áreas del cuerpo.
Insulin: Nivel de insulina en suero medido en mU/ml. La insulina es una hormona producida por el páncreas que regula el metabolismo de la glucosa en el cuerpo.
BMI (Body Mass Index): Índice de masa corporal, calculado como el peso en kg dividido por el cuadrado de la altura en metros (kg/m²). Es una medida común para evaluar si una persona tiene un peso saludable en relación con su altura.
DiabetesPedigreeFunction: Función que evalúa la heredabilidad de la diabetes en función de la historia familiar.
Age: Edad de la persona en años.
Outcome: Variable categórica que indica si la persona tiene diabetes (1) o no (0), es decir, es una variable binaria que representa el resultado o diagnóstico de la diabetes.
library(stats)
library(psych)
library(readxl)
library(MASS)
library(ISLR)
library(vcd)
library(openxlsx)
library(corrplot)
bd = read.xlsx("diabetes.xlsx")
head(bd)
## Pregnancies Glucose BloodPressure SkinThickness Insulin BMI
## 1 6 148 72 35 0 33.6
## 2 1 85 66 29 0 26.6
## 3 8 183 64 0 0 23.3
## 4 1 89 66 23 94 28.1
## 5 0 137 40 35 168 43.1
## 6 5 116 74 0 0 25.6
## DiabetesPedigreeFunction Age Outcome
## 1 0.627 50 1
## 2 0.351 31 0
## 3 0.672 32 1
## 4 0.167 21 0
## 5 2.288 33 1
## 6 0.201 30 0
colSums(is.na(bd))
## Pregnancies Glucose BloodPressure
## 0 0 0
## SkinThickness Insulin BMI
## 0 0 0
## DiabetesPedigreeFunction Age Outcome
## 0 0 0
sum(is.na(bd))
## [1] 0
modelo_logit = glm(Outcome~Age+Glucose+BloodPressure+BMI+Pregnancies,data=bd,family=binomial(link="logit"))
summary(modelo_logit)
##
## Call:
## glm(formula = Outcome ~ Age + Glucose + BloodPressure + BMI +
## Pregnancies, family = binomial(link = "logit"), data = bd)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.1292 -0.7192 -0.4249 0.7551 2.8634
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -7.957463 0.684278 -11.629 < 2e-16 ***
## Age 0.017087 0.009172 1.863 0.06249 .
## Glucose 0.033787 0.003401 9.935 < 2e-16 ***
## BloodPressure -0.013514 0.005104 -2.648 0.00811 **
## BMI 0.090961 0.014212 6.400 1.55e-10 ***
## Pregnancies 0.118803 0.031594 3.760 0.00017 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 993.48 on 767 degrees of freedom
## Residual deviance: 734.99 on 762 degrees of freedom
## AIC: 746.99
##
## Number of Fisher Scoring iterations: 5
modelo_probit = glm(Outcome~Age+Glucose+BloodPressure+BMI+Pregnancies,data=bd,family=binomial(link="probit"))
summary(modelo_probit)
##
## Call:
## glm(formula = Outcome ~ Age + Glucose + BloodPressure + BMI +
## Pregnancies, family = binomial(link = "probit"), data = bd)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.1155 -0.7349 -0.4154 0.7768 3.0255
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -4.664986 0.374504 -12.456 < 2e-16 ***
## Age 0.011286 0.005396 2.091 0.036490 *
## Glucose 0.019235 0.001902 10.114 < 2e-16 ***
## BloodPressure -0.007867 0.002977 -2.643 0.008225 **
## BMI 0.053856 0.008054 6.687 2.27e-11 ***
## Pregnancies 0.070593 0.018369 3.843 0.000122 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 993.48 on 767 degrees of freedom
## Residual deviance: 736.05 on 762 degrees of freedom
## AIC: 748.05
##
## Number of Fisher Scoring iterations: 5
CIA_Logit = AIC(modelo_logit)
CIA_Probit = AIC(modelo_probit)
CIA_Logit
## [1] 746.9861
CIA_Probit
## [1] 748.0513
El modelo con mejor ajuste con base al CIA es el probit al tener un valor menor que en este caso es el Probit
IMPORTANTE: Las predicciones que regresa el modelo directamente NO son probabilidades, sino que es un ajuste para el logaritmo del cociente de probabilidades (momios). Por ello, es necesario realizar las siguientes transformaciones para asegurarse que estos valores sí corresponden a probabilidades.
log.odds <- predict(modelo_probit, data.frame(Age = 36, Glucose = 85, BloodPressure = 64, BMI = 28.9, Pregnancies = 3, Familia = 2.71))
Prob1 = pnorm(log.odds)
Prob1
## 1
## 0.08707293
# Equivalentemente
predict(modelo_probit, data.frame(Age = 36, Glucose = 85, BloodPressure = 64, BMI = 28.9, Pregnancies = 3, Familia = 2.71), type="response")
## 1
## 0.08707293
En este modelo los coeficientes indican cómo una unidad de esta unidad afecta al logaritmo de cociente de probabilidades. Lo más relevante en sí es el signo de esta relación para así saber si el incremento de la variable en cuestión aumenta o disminuye la probabilidad de tener el atributo que se está prediciendo.
Prob1*coef(modelo_probit)
## (Intercept) Age Glucose BloodPressure BMI
## -0.4061939725 0.0009827280 0.0016748288 -0.0006850302 0.0046894352
## Pregnancies
## 0.0061467522
La Matriz de Confusiones es la herramienta principal para generar diferentes métricas que sirven para evaluar el desmepeño de nuestro modelo. Estas métricas las veremos con mayor detalle en las próximas clases.
predicciones1 <- ifelse(test = modelo_probit$fitted.values > 0.5, yes =1, no = 0)
matriz_confusion1 <- table(predicciones1,modelo_probit$model$Outcome,dnn = c( "predicciones","observaciones"))
matriz_confusion1
## observaciones
## predicciones 0 1
## 0 436 111
## 1 64 157
A partir de esta matriz se puede estimar una medida del ajuste
(436+157)/(547+221)*100
## [1] 77.21354
Nuestro modelo tiene 77% de confiabilidad lo cual no es perfecto pero puede considerarse regular