Predicciones con regresión logistica

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:

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

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

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

Criterios de Información

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

¿Cómo generar predicciones?

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

Interpretación de Coeficientes

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

Matriz de confusiones

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