Ejercicios regresión logística

Para realizar un regresión logística en R se utiliza la función glm. Esta función se utiliza para ajustar modelos lineales generalizados, especificados dando una descripción simbólica del predictor lineal y una descripción de la distribución de errores.

Ejemplo 1

Se desea identificar las variables asociadas al bajo peso al nacer. Para ello, se parte del data frame “birthwt2” que fue construida con anterioridad en la clase de medidas de asociación y riesgo. Se describen a continuación los pasos para la elaboración de un modelo de regresión logística en R. Puede descargar la base de datos de aquí

Importar base de datos

birthwt2 <- read.csv("Bases/birthwt2", stringsAsFactors = T)
head(birthwt2)
   X low age lwt   race smoke ptl ht  ui ftv  bwt
1 85  No  19 182  black    No   0 No Yes   0 2523
2 86  No  33 155  other    No   0 No  No   3 2551
3 87  No  20 105  white   Yes   0 No  No   1 2557
4 88  No  21 108  white   Yes   0 No Yes   2 2594
5 89  No  18 107  white   Yes   0 No Yes   0 2600
6 91  No  21 124  other    No   0 No  No   0 2622
attach(birthwt2) # Para no tener problemas con los nombres
str(birthwt2)
'data.frame':   189 obs. of  11 variables:
 $ X    : int  85 86 87 88 89 91 92 93 94 95 ...
 $ low  : Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 1 1 1 1 ...
 $ age  : int  19 33 20 21 18 21 22 17 29 26 ...
 $ lwt  : int  182 155 105 108 107 124 118 103 123 113 ...
 $ race : Factor w/ 3 levels " other","black",..: 2 1 3 3 3 1 3 1 3 3 ...
 $ smoke: Factor w/ 2 levels "No","Yes": 1 1 2 2 2 1 1 1 2 2 ...
 $ ptl  : int  0 0 0 0 0 0 0 0 0 0 ...
 $ ht   : Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 1 1 1 1 ...
 $ ui   : Factor w/ 2 levels "No","Yes": 2 1 1 2 2 1 1 1 1 1 ...
 $ ftv  : int  0 3 1 2 0 0 1 1 1 0 ...
 $ bwt  : int  2523 2551 2557 2594 2600 2622 2637 2637 2663 2665 ...

Construcción de los modelos

Se parte del supuesto que todas la variables del dataframe pudieran estar asociadas al bajo peso al nacer. Por ello se construye un modelo con todas las variables y se comenzarán a eliminar variables hasta quedarnos con un modelo adecuado.

Modelo incial

mod1 <- glm(low~age+lwt+race+smoke+ptl+ht+ui+ftv, family = "binomial", data = birthwt2)
summary(mod1)

Call:
glm(formula = low ~ age + lwt + race + smoke + ptl + ht + ui + 
    ftv, family = "binomial", data = birthwt2)

Coefficients:
             Estimate Std. Error z value Pr(>|z|)   
(Intercept)  1.361119   1.104589   1.232  0.21786   
age         -0.029549   0.037031  -0.798  0.42489   
lwt         -0.015424   0.006919  -2.229  0.02580 * 
raceblack    0.391764   0.537609   0.729  0.46618   
racewhite   -0.880496   0.440778  -1.998  0.04576 * 
smokeYes     0.938846   0.402147   2.335  0.01957 * 
ptl          0.543337   0.345403   1.573  0.11571   
htYes        1.863303   0.697533   2.671  0.00756 **
uiYes        0.767648   0.459318   1.671  0.09467 . 
ftv          0.065302   0.172394   0.379  0.70484   
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 234.67  on 188  degrees of freedom
Residual deviance: 201.28  on 179  degrees of freedom
AIC: 221.28

Number of Fisher Scoring iterations: 4
table(race)
race
 other  black  white 
    67     26     96 

Supuestos del modelo

performance::check_model(mod1)

Binned residual plot

Un “binned residual plot” es una herramienta útil en el análisis de regresión para evaluar la adecuación de un modelo a los datos. En un binned residual plot, estos residuos se agrupan (“binning”) en intervalos basados en los valores predichos o alguna otra variable relevante, y luego se analizan colectivamente.

Aspectos Clave del Binned Residual Plot

  1. Eje Horizontal: Muestra los valores predichos por el modelo o alguna variable independiente de interés.
  2. Eje Vertical: Muestra los residuos o alguna medida resumida de los residuos (como la media o mediana) para cada grupo.

Interpretación

  1. Residuos Cerca de Cero: Idealmente, la media (o mediana) de los residuos en cada bin debería estar cerca de cero. Esto indica que el modelo está haciendo predicciones precisas en ese rango.

  2. Patrón Aleatorio: La ausencia de patrones sistemáticos sugiere que el modelo se ajusta bien a los datos. Un patrón aleatorio de puntos alrededor de la línea de residuo cero es un buen signo.

  3. Patrones en los Residuos: La presencia de patrones, como una tendencia lineal o curvilínea, esto sugiere que el modelo no está capturando alguna relación subyacente en los datos.

  4. Variabilidad Constante: La dispersión de los residuos debería ser más o menos constante a través de los diferentes bins. Si la variabilidad de los residuos cambia significativamente (por ejemplo, aumenta con valores predichos mayores), esto puede indicar heterocedasticidad, lo que sugiere que las suposiciones del modelo podrían no ser apropiadas.

  5. Outliers: Los valores atípicos pueden ser identificados en un binned residual plot. Si hay muchos outliers o si estos siguen un patrón, puede ser necesario revisar el modelo o investigar más sobre estos casos.

Prueba de Hosmer-Lemeshow

glmtoolbox::hltest(mod1)

   The Hosmer-Lemeshow goodness-of-fit test

 Group Size Observed  Expected
     1   19        0  1.139340
     2   19        2  2.035538
     3   19        5  3.151809
     4   19        4  4.281702
     5   19        5  4.888128
     6   19        4  5.647961
     7   19        9  6.598646
     8   19        7  8.183330
     9   19        9 10.327746
    10   18       14 12.745801

         Statistic =  5.65984 
degrees of freedom =  8 
           p-value =  0.68527 

Psuedo \(R^2\)

fmsb::NagelkerkeR2(mod1)
$N
[1] 189

$R2
[1] 0.2277177

Modelos sucesivos

Se eliminarán variables tomando los valores de \(p\). Se comienza por eliminar la variable age ya que es la que menos aporta al modelo

 mod2 <- glm(low~lwt+race+smoke+ptl+ht+ui, family = "binomial")
summary(mod2)

Call:
glm(formula = low ~ lwt + race + smoke + ptl + ht + ui, family = "binomial")

Coefficients:
             Estimate Std. Error z value Pr(>|z|)   
(Intercept)  0.810528   0.859994   0.942  0.34595   
lwt         -0.015905   0.006855  -2.320  0.02033 * 
raceblack    0.428641   0.538963   0.795  0.42643   
racewhite   -0.897078   0.433881  -2.068  0.03868 * 
smokeYes     0.938727   0.398717   2.354  0.01855 * 
ptl          0.503215   0.341231   1.475  0.14029   
htYes        1.855042   0.695118   2.669  0.00762 **
uiYes        0.785698   0.456441   1.721  0.08519 . 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 234.67  on 188  degrees of freedom
Residual deviance: 201.99  on 181  degrees of freedom
AIC: 217.99

Number of Fisher Scoring iterations: 4

Se elimina la variable ptl

mod3 <- glm(low~lwt+race+smoke+ht+ui, family = "binomial")
summary(mod3)

Call:
glm(formula = low ~ lwt + race + smoke + ht + ui, family = "binomial")

Coefficients:
             Estimate Std. Error z value Pr(>|z|)   
(Intercept)  0.982473   0.849736   1.156  0.24760   
lwt         -0.016732   0.006803  -2.459  0.01392 * 
raceblack    0.398365   0.536721   0.742  0.45795   
racewhite   -0.926197   0.430386  -2.152  0.03140 * 
smokeYes     1.035831   0.392558   2.639  0.00832 **
htYes        1.871416   0.690902   2.709  0.00676 **
uiYes        0.904974   0.447553   2.022  0.04317 * 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 234.67  on 188  degrees of freedom
Residual deviance: 204.22  on 182  degrees of freedom
AIC: 218.22

Number of Fisher Scoring iterations: 4

Dado que la variable race tiene tres niveles uno de ellos es significativo por lo que no se puede eliminar la variable

table(race)
race
 other  black  white 
    67     26     96 

En este caso se tomo la variable otros fue la variable que se tomo como referencia

Intervalos de confianza para los coeficientes

confint(mod3)
                  2.5 %      97.5 %
(Intercept) -0.62731793  2.72391574
lwt         -0.03092559 -0.00410382
raceblack   -0.66341538  1.45620087
racewhite   -1.79386888 -0.09646860
smokeYes     0.28083645  1.82902365
htYes        0.55127683  3.31367522
uiYes        0.02178767  1.78908985

Valores de OR

Para obtener los OR solo basta estimar el exponente de cada uno de los coeficientes

exp(mod3$coefficients)
(Intercept)         lwt   raceblack   racewhite    smokeYes       htYes 
  2.6710537   0.9834068   1.4893874   0.3960571   2.8174471   6.4974921 
      uiYes 
  2.4718677 
exp(confint(mod3))
                2.5 %     97.5 %
(Intercept) 0.5340222 15.2398809
lwt         0.9695477  0.9959046
raceblack   0.5150891  4.2896317
racewhite   0.1663155  0.9080384
smokeYes    1.3242370  6.2278032
htYes       1.7354675 27.4859570
uiYes       1.0220268  5.9840036

Forward, backward and stepwise logistic regression

Para realizar una regresión por pasos se parte de los mismo principios de la regresión lineal múltiple

Creación del modelo vacio y modelo completo

modelo.vacio <- glm(low~1,family = "binomial")
modelo.completo <- glm(low~age+lwt+race+smoke+ptl+ht+ui, family = "binomial")
summary(modelo.vacio)

Call:
glm(formula = low ~ 1, family = "binomial")

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)   -0.790      0.157  -5.033 4.84e-07 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 234.67  on 188  degrees of freedom
Residual deviance: 234.67  on 188  degrees of freedom
AIC: 236.67

Number of Fisher Scoring iterations: 4
summary(modelo.completo)

Call:
glm(formula = low ~ age + lwt + race + smoke + ptl + ht + ui, 
    family = "binomial")

Coefficients:
             Estimate Std. Error z value Pr(>|z|)   
(Intercept)  1.326038   1.104915   1.200  0.23009   
age         -0.027070   0.036452  -0.743  0.45772   
lwt         -0.015183   0.006928  -2.192  0.02841 * 
raceblack    0.401584   0.538868   0.745  0.45613   
racewhite   -0.861635   0.439191  -1.962  0.04978 * 
smokeYes     0.923349   0.400853   2.303  0.02125 * 
ptl          0.541755   0.346264   1.565  0.11768   
htYes        1.833696   0.691765   2.651  0.00803 **
uiYes        0.758597   0.459389   1.651  0.09867 . 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 234.67  on 188  degrees of freedom
Residual deviance: 201.43  on 180  degrees of freedom
AIC: 219.43

Number of Fisher Scoring iterations: 4

forward

modelo.forward <- step(modelo.vacio, 
                       scope = list(lower=modelo.vacio,
                                    upper=modelo.completo), direction = "forward")
Start:  AIC=236.67
low ~ 1

        Df Deviance    AIC
+ ptl    1   227.89 231.89
+ lwt    1   228.69 232.69
+ ui     1   229.60 233.60
+ smoke  1   229.81 233.81
+ ht     1   230.65 234.65
+ race   2   229.66 235.66
+ age    1   231.91 235.91
<none>       234.67 236.67

Step:  AIC=231.89
low ~ ptl

        Df Deviance    AIC
+ lwt    1   223.41 229.41
+ ht     1   223.58 229.58
+ age    1   224.27 230.27
+ race   2   222.53 230.53
+ smoke  1   224.78 230.78
+ ui     1   224.89 230.89
<none>       227.89 231.89

Step:  AIC=229.41
low ~ ptl + lwt

        Df Deviance    AIC
+ ht     1   215.96 223.96
+ race   2   217.68 227.68
+ smoke  1   220.54 228.54
+ age    1   221.05 229.05
+ ui     1   221.23 229.23
<none>       223.41 229.41

Step:  AIC=223.96
low ~ ptl + lwt + ht

        Df Deviance    AIC
+ race   2   210.85 222.85
+ ui     1   213.01 223.01
+ smoke  1   213.15 223.15
<none>       215.96 223.96
+ age    1   214.01 224.01

Step:  AIC=222.85
low ~ ptl + lwt + ht + race

        Df Deviance    AIC
+ smoke  1   204.90 218.90
+ ui     1   207.73 221.73
<none>       210.85 222.85
+ age    1   209.81 223.81

Step:  AIC=218.9
low ~ ptl + lwt + ht + race + smoke

       Df Deviance    AIC
+ ui    1   201.99 217.99
<none>      204.90 218.90
+ age   1   204.11 220.11

Step:  AIC=217.99
low ~ ptl + lwt + ht + race + smoke + ui

       Df Deviance    AIC
<none>      201.99 217.99
+ age   1   201.43 219.43
summary(modelo.forward)

Call:
glm(formula = low ~ ptl + lwt + ht + race + smoke + ui, family = "binomial")

Coefficients:
             Estimate Std. Error z value Pr(>|z|)   
(Intercept)  0.810528   0.859994   0.942  0.34595   
ptl          0.503215   0.341231   1.475  0.14029   
lwt         -0.015905   0.006855  -2.320  0.02033 * 
htYes        1.855042   0.695118   2.669  0.00762 **
raceblack    0.428641   0.538963   0.795  0.42643   
racewhite   -0.897078   0.433881  -2.068  0.03868 * 
smokeYes     0.938727   0.398717   2.354  0.01855 * 
uiYes        0.785698   0.456441   1.721  0.08519 . 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 234.67  on 188  degrees of freedom
Residual deviance: 201.99  on 181  degrees of freedom
AIC: 217.99

Number of Fisher Scoring iterations: 4

Backward

modelo.backward <- step(modelo.completo, 
                        scope = list(lower=modelo.vacio, 
                                     upper=modelo.completo), direction = "backward") 
Start:  AIC=219.43
low ~ age + lwt + race + smoke + ptl + ht + ui

        Df Deviance    AIC
- age    1   201.99 217.99
<none>       201.43 219.43
- ptl    1   203.95 219.95
- ui     1   204.11 220.11
- race   2   208.77 222.77
- lwt    1   206.81 222.81
- smoke  1   206.92 222.92
- ht     1   208.81 224.81

Step:  AIC=217.99
low ~ lwt + race + smoke + ptl + ht + ui

        Df Deviance    AIC
<none>       201.99 217.99
- ptl    1   204.22 218.22
- ui     1   204.90 218.90
- smoke  1   207.73 221.73
- lwt    1   208.11 222.11
- race   2   210.31 222.31
- ht     1   209.46 223.46
summary(modelo.backward)

Call:
glm(formula = low ~ lwt + race + smoke + ptl + ht + ui, family = "binomial")

Coefficients:
             Estimate Std. Error z value Pr(>|z|)   
(Intercept)  0.810528   0.859994   0.942  0.34595   
lwt         -0.015905   0.006855  -2.320  0.02033 * 
raceblack    0.428641   0.538963   0.795  0.42643   
racewhite   -0.897078   0.433881  -2.068  0.03868 * 
smokeYes     0.938727   0.398717   2.354  0.01855 * 
ptl          0.503215   0.341231   1.475  0.14029   
htYes        1.855042   0.695118   2.669  0.00762 **
uiYes        0.785698   0.456441   1.721  0.08519 . 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 234.67  on 188  degrees of freedom
Residual deviance: 201.99  on 181  degrees of freedom
AIC: 217.99

Number of Fisher Scoring iterations: 4

Stepwise

modelo.stepwise <- step(modelo.vacio, 
                        scope = list(lower=modelo.vacio, 
                                     upper=modelo.completo),direction = "both")
Start:  AIC=236.67
low ~ 1

        Df Deviance    AIC
+ ptl    1   227.89 231.89
+ lwt    1   228.69 232.69
+ ui     1   229.60 233.60
+ smoke  1   229.81 233.81
+ ht     1   230.65 234.65
+ race   2   229.66 235.66
+ age    1   231.91 235.91
<none>       234.67 236.67

Step:  AIC=231.89
low ~ ptl

        Df Deviance    AIC
+ lwt    1   223.41 229.41
+ ht     1   223.58 229.58
+ age    1   224.27 230.27
+ race   2   222.53 230.53
+ smoke  1   224.78 230.78
+ ui     1   224.89 230.89
<none>       227.89 231.89
- ptl    1   234.67 236.67

Step:  AIC=229.41
low ~ ptl + lwt

        Df Deviance    AIC
+ ht     1   215.96 223.96
+ race   2   217.68 227.68
+ smoke  1   220.54 228.54
+ age    1   221.05 229.05
+ ui     1   221.23 229.23
<none>       223.41 229.41
- lwt    1   227.89 231.89
- ptl    1   228.69 232.69

Step:  AIC=223.96
low ~ ptl + lwt + ht

        Df Deviance    AIC
+ race   2   210.85 222.85
+ ui     1   213.01 223.01
+ smoke  1   213.15 223.15
<none>       215.96 223.96
+ age    1   214.01 224.01
- ptl    1   221.14 227.14
- ht     1   223.41 229.41
- lwt    1   223.58 229.58

Step:  AIC=222.85
low ~ ptl + lwt + ht + race

        Df Deviance    AIC
+ smoke  1   204.90 218.90
+ ui     1   207.73 221.73
<none>       210.85 222.85
+ age    1   209.81 223.81
- race   2   215.96 223.96
- ptl    1   216.29 226.29
- ht     1   217.68 227.68
- lwt    1   218.69 228.69

Step:  AIC=218.9
low ~ ptl + lwt + ht + race + smoke

        Df Deviance    AIC
+ ui     1   201.99 217.99
<none>       204.90 218.90
+ age    1   204.11 220.11
- ptl    1   208.25 220.25
- smoke  1   210.85 222.85
- race   2   213.15 223.15
- ht     1   211.55 223.55
- lwt    1   211.62 223.62

Step:  AIC=217.99
low ~ ptl + lwt + ht + race + smoke + ui

        Df Deviance    AIC
<none>       201.99 217.99
- ptl    1   204.22 218.22
- ui     1   204.90 218.90
+ age    1   201.43 219.43
- smoke  1   207.73 221.73
- lwt    1   208.11 222.11
- race   2   210.31 222.31
- ht     1   209.46 223.46
summary(modelo.stepwise)

Call:
glm(formula = low ~ ptl + lwt + ht + race + smoke + ui, family = "binomial")

Coefficients:
             Estimate Std. Error z value Pr(>|z|)   
(Intercept)  0.810528   0.859994   0.942  0.34595   
ptl          0.503215   0.341231   1.475  0.14029   
lwt         -0.015905   0.006855  -2.320  0.02033 * 
htYes        1.855042   0.695118   2.669  0.00762 **
raceblack    0.428641   0.538963   0.795  0.42643   
racewhite   -0.897078   0.433881  -2.068  0.03868 * 
smokeYes     0.938727   0.398717   2.354  0.01855 * 
uiYes        0.785698   0.456441   1.721  0.08519 . 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 234.67  on 188  degrees of freedom
Residual deviance: 201.99  on 181  degrees of freedom
AIC: 217.99

Number of Fisher Scoring iterations: 4

Ejercicios de practica

Ejercicio de practica 1. Con la base de dato pima.tr

Ejercicio de practica 1

Utilice la base de datos “pima.tr” para identificar variables asociadas a diabetes (type). Construya un modelo manual

Importar base de datos

library(MASS)
data("Pima.tr")
attach(Pima.tr)
head(Pima.tr)
  npreg glu bp skin  bmi   ped age type
1     5  86 68   28 30.2 0.364  24   No
2     7 195 70   33 25.1 0.163  55  Yes
3     5  77 82   41 35.8 0.156  35   No
4     0 165 76   43 47.9 0.259  26   No
5     0 107 60   25 26.4 0.133  23   No
6     5  97 76   27 35.6 0.378  52  Yes

Modelo manual

Modelo con todas las varibles

mod1 <- glm(type~npreg+glu+bp+skin+bmi+ped+age, family = "binomial")
summary(mod1)

Call:
glm(formula = type ~ npreg + glu + bp + skin + bmi + ped + age, 
    family = "binomial")

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept) -9.773062   1.770386  -5.520 3.38e-08 ***
npreg        0.103183   0.064694   1.595  0.11073    
glu          0.032117   0.006787   4.732 2.22e-06 ***
bp          -0.004768   0.018541  -0.257  0.79707    
skin        -0.001917   0.022500  -0.085  0.93211    
bmi          0.083624   0.042827   1.953  0.05087 .  
ped          1.820410   0.665514   2.735  0.00623 ** 
age          0.041184   0.022091   1.864  0.06228 .  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 256.41  on 199  degrees of freedom
Residual deviance: 178.39  on 192  degrees of freedom
AIC: 194.39

Number of Fisher Scoring iterations: 5

Modelos por pasos

Para realizar una regresión por pasos se parte de los mismo principios de la regresión lineal múltiple

Creación del modelo vacio y modelo completo

modelo.vacio <- glm(type~1,family = "binomial", data = Pima.tr)
modelo.completo <- glm(type~., family = "binomial", data = Pima.tr)

forward

modelo.forward <- step(modelo.vacio, 
                       scope = list(lower=modelo.vacio,
                                    upper=modelo.completo), direction = "forward")
Start:  AIC=258.41
type ~ 1

        Df Deviance    AIC
+ glu    1   207.37 211.37
+ age    1   229.94 233.94
+ bmi    1   239.97 243.97
+ npreg  1   242.03 246.03
+ skin   1   244.70 248.70
+ bp     1   247.55 251.55
+ ped    1   248.11 252.11
<none>       256.41 258.41

Step:  AIC=211.37
type ~ glu

        Df Deviance    AIC
+ age    1   197.11 203.11
+ bmi    1   198.47 204.47
+ npreg  1   199.08 205.08
+ ped    1   199.26 205.26
+ skin   1   202.26 208.26
<none>       207.37 211.37
+ bp     1   205.90 211.90

Step:  AIC=203.11
type ~ glu + age

        Df Deviance    AIC
+ ped    1   187.10 195.10
+ bmi    1   188.39 196.39
+ skin   1   193.49 201.49
<none>       197.11 203.11
+ npreg  1   195.55 203.55
+ bp     1   197.10 205.10

Step:  AIC=195.1
type ~ glu + age + ped

        Df Deviance    AIC
+ bmi    1   181.08 191.08
+ skin   1   184.64 194.64
+ npreg  1   184.74 194.74
<none>       187.10 195.10
+ bp     1   187.06 197.06

Step:  AIC=191.08
type ~ glu + age + ped + bmi

        Df Deviance    AIC
+ npreg  1   178.47 190.47
<none>       181.08 191.08
+ bp     1   181.00 193.00
+ skin   1   181.06 193.06

Step:  AIC=190.47
type ~ glu + age + ped + bmi + npreg

       Df Deviance    AIC
<none>      178.47 190.47
+ bp    1   178.40 192.40
+ skin  1   178.46 192.46
summary(modelo.forward)

Call:
glm(formula = type ~ glu + age + ped + bmi + npreg, family = "binomial", 
    data = Pima.tr)

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept) -9.938059   1.541571  -6.447 1.14e-10 ***
glu          0.031809   0.006667   4.771 1.83e-06 ***
age          0.039286   0.020967   1.874  0.06097 .  
ped          1.811417   0.661048   2.740  0.00614 ** 
bmi          0.079672   0.032649   2.440  0.01468 *  
npreg        0.103142   0.064517   1.599  0.10989    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 256.41  on 199  degrees of freedom
Residual deviance: 178.47  on 194  degrees of freedom
AIC: 190.47

Number of Fisher Scoring iterations: 5

Backward

modelo.backward <- step(modelo.completo, 
                        scope = list(lower=modelo.vacio, 
                                     upper=modelo.completo), direction = "backward") 
Start:  AIC=194.39
type ~ npreg + glu + bp + skin + bmi + ped + age

        Df Deviance    AIC
- skin   1   178.40 192.40
- bp     1   178.46 192.46
<none>       178.39 194.39
- npreg  1   180.99 194.99
- age    1   181.95 195.95
- bmi    1   182.24 196.24
- ped    1   186.40 200.40
- glu    1   205.79 219.79

Step:  AIC=192.4
type ~ npreg + glu + bp + bmi + ped + age

        Df Deviance    AIC
- bp     1   178.47 190.47
<none>       178.40 192.40
- npreg  1   181.00 193.00
- age    1   181.97 193.97
- bmi    1   184.69 196.69
- ped    1   186.41 198.41
- glu    1   205.79 217.79

Step:  AIC=190.47
type ~ npreg + glu + bmi + ped + age

        Df Deviance    AIC
<none>       178.47 190.47
- npreg  1   181.08 191.08
- age    1   182.03 192.03
- bmi    1   184.74 194.74
- ped    1   186.55 196.55
- glu    1   206.06 216.06
summary(modelo.backward)

Call:
glm(formula = type ~ npreg + glu + bmi + ped + age, family = "binomial", 
    data = Pima.tr)

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept) -9.938059   1.541571  -6.447 1.14e-10 ***
npreg        0.103142   0.064517   1.599  0.10989    
glu          0.031809   0.006667   4.771 1.83e-06 ***
bmi          0.079672   0.032649   2.440  0.01468 *  
ped          1.811417   0.661048   2.740  0.00614 ** 
age          0.039286   0.020967   1.874  0.06097 .  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 256.41  on 199  degrees of freedom
Residual deviance: 178.47  on 194  degrees of freedom
AIC: 190.47

Number of Fisher Scoring iterations: 5

Stepwise

modelo.stepwise <- step(modelo.vacio, 
                        scope = list(lower=modelo.vacio, 
                                     upper=modelo.completo),direction = "both")
Start:  AIC=258.41
type ~ 1

        Df Deviance    AIC
+ glu    1   207.37 211.37
+ age    1   229.94 233.94
+ bmi    1   239.97 243.97
+ npreg  1   242.03 246.03
+ skin   1   244.70 248.70
+ bp     1   247.55 251.55
+ ped    1   248.11 252.11
<none>       256.41 258.41

Step:  AIC=211.37
type ~ glu

        Df Deviance    AIC
+ age    1   197.11 203.11
+ bmi    1   198.47 204.47
+ npreg  1   199.08 205.08
+ ped    1   199.26 205.26
+ skin   1   202.26 208.26
<none>       207.37 211.37
+ bp     1   205.90 211.90
- glu    1   256.41 258.41

Step:  AIC=203.11
type ~ glu + age

        Df Deviance    AIC
+ ped    1   187.10 195.10
+ bmi    1   188.39 196.39
+ skin   1   193.49 201.49
<none>       197.11 203.11
+ npreg  1   195.55 203.55
+ bp     1   197.10 205.10
- age    1   207.37 211.37
- glu    1   229.94 233.94

Step:  AIC=195.1
type ~ glu + age + ped

        Df Deviance    AIC
+ bmi    1   181.08 191.08
+ skin   1   184.64 194.64
+ npreg  1   184.74 194.74
<none>       187.10 195.10
+ bp     1   187.06 197.06
- ped    1   197.11 203.11
- age    1   199.26 205.26
- glu    1   217.91 223.91

Step:  AIC=191.08
type ~ glu + age + ped + bmi

        Df Deviance    AIC
+ npreg  1   178.47 190.47
<none>       181.08 191.08
+ bp     1   181.00 193.00
+ skin   1   181.06 193.06
- bmi    1   187.10 195.10
- ped    1   188.39 196.39
- age    1   192.87 200.87
- glu    1   208.01 216.01

Step:  AIC=190.47
type ~ glu + age + ped + bmi + npreg

        Df Deviance    AIC
<none>       178.47 190.47
- npreg  1   181.08 191.08
- age    1   182.03 192.03
+ bp     1   178.40 192.40
+ skin   1   178.46 192.46
- bmi    1   184.74 194.74
- ped    1   186.55 196.55
- glu    1   206.06 216.06
summary(modelo.stepwise)

Call:
glm(formula = type ~ glu + age + ped + bmi + npreg, family = "binomial", 
    data = Pima.tr)

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept) -9.938059   1.541571  -6.447 1.14e-10 ***
glu          0.031809   0.006667   4.771 1.83e-06 ***
age          0.039286   0.020967   1.874  0.06097 .  
ped          1.811417   0.661048   2.740  0.00614 ** 
bmi          0.079672   0.032649   2.440  0.01468 *  
npreg        0.103142   0.064517   1.599  0.10989    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 256.41  on 199  degrees of freedom
Residual deviance: 178.47  on 194  degrees of freedom
AIC: 190.47

Number of Fisher Scoring iterations: 5

Estimación de OR

Seleccione su modelo final y luego estime los OR y sus intervalos de confianza con el siguiente código:

exp(modelo.final$coefficients)
exp(confint(modelo.final))

Ejericios de tarea

Ejericio 1. Tarea

Introducción

La Organización Mundial de la Salud ha estimado que cada año ocurren 12 millones de muertes a nivel mundial debido a enfermedades cardíacas. La mitad de las muertes en Estados Unidos y otros países desarrollados se deben a enfermedades cardiovasculares. El pronóstico temprano de las enfermedades cardiovasculares puede ayudar en la toma de decisiones sobre cambios en el estilo de vida en pacientes de alto riesgo y, a su vez, reducir las complicaciones. Esta investigación tiene como objetivo identificar los factores de riesgo más relevantes de la enfermedad cardíaca, así como predecir el riesgo general utilizando la regresión logística. Puede consultar más información en aquí

Base de datos

Fuente

El conjunto de datos está disponible públicamente en el sitio web de Kaggle, y proviene de un estudio cardiovascular en curso sobre los residentes de la ciudad de Framingham, Massachusetts. El objetivo de la clasificación es predecir si el paciente tiene un riesgo a 10 años de enfermedad coronaria futura (CHD, por sus siglas en inglés). El conjunto de datos proporciona información de los pacientes. Incluye más de 4,000 registros y 15 atributos.

Variables

Cada atributo es un potencial factor de riesgo. Hay factores de riesgo demográficos, conductuales y médicos.La base de datos contiene las siguientes varialbles:

A continuación se describen las variables de la base de datos y su significado

  • Demographic varibles:

  • Sex: male or female (Nominal)

  • Age: Age of the patient;(Continuous - Although the recorded ages have been truncated to whole numbers, the concept of age is continuous) Behavioral

  • Current Smoker: whether or not the patient is a current smoker (Nominal)

  • Cigs Per Day: the number of cigarettes that the person smoked on average in one day.(can be considered continuous as one can have any number of cigarettes, even half a cigarette.)

  • Medical( history) viriables

  • BP Meds: whether or not the patient was on blood pressure medication (Nominal)

  • Prevalent Stroke: whether or not the patient had previously had a stroke (Nominal)

  • Prevalent Hyp: whether or not the patient was hypertensive (Nominal)

  • Diabetes: whether or not the patient had diabetes (Nominal) Medical(current) variables

  • Tot Chol: total cholesterol level (Continuous)

  • Sys BP: systolic blood pressure (Continuous)

  • Dia BP: diastolic blood pressure (Continuous)

  • BMI: Body Mass Index (Continuous)

  • Heart Rate: heart rate (Continuous - In medical research, variables such as heart rate though in fact discrete, yet are considered continuous because of large number of possible values.)

  • Glucose: glucose level (Continuous) Predict variable (desired target)

  • Dependent variable (TenYearCHD)

  • 10 year risk of coronary heart disease CHD (binary: “1”, means “Yes”, “0” means “No”)

Objetivo

Relizar modelos de regresión lógistica para identificar variables asociadas al riesgo cardiovascular a los diez años

Puede descargar la base de datos de aquí Puede encontrar más información sobre el resultado en: https://www.kaggle.com/datasets/dileep070/heart-disease-prediction-using-logistic-regression

Deberá realizar lo siguiente:

  1. Análisis vibariado agrupando por la variable TenYearCHD para identificar variables asociadas al riesgo cardivascular que puedieran incluirse en el modelo
  2. Seleccionar y ajustar un modelo de regresión logística con las variables seleccionadas
  3. Evaluar los supuestos del modelo
  4. Realizar la prueba de Hosmer-Lemeshow
  5. Calcular la pseudo \(R^2\)
  6. Estimar los OR y sus intervalos de confianza
  7. Interpretar sus OR
  8. Concluir

Como ayuda a su análisis se muestra una tabla con el análisis bivariado

Characteristic

0, N = 3,594

1

1, N = 644

1

p-value

2
male 1,476 (41%) 343 (53%) <0.001
age 48 (42, 55) 55 (48, 61) <0.001
education

<0.001
    1 1,397 (40%) 323 (51%)
    2 1,106 (32%) 147 (23%)
    3 599 (17%) 88 (14%)
    4 403 (11%) 70 (11%)
    Unknown 89 16
currentSmoker 1,761 (49%) 333 (52%) 0.2
cigsPerDay 0 (0, 20) 3 (0, 20) 0.005
    Unknown 27 2
BPMeds 83 (2.3%) 41 (6.5%) <0.001
    Unknown 42 11
prevalentStroke 14 (0.4%) 11 (1.7%) <0.001
prevalentHyp 991 (28%) 325 (50%) <0.001
diabetes 69 (1.9%) 40 (6.2%) <0.001
totChol 232 (205, 261) 241 (214, 272) <0.001
    Unknown 41 9
sysBP 127 (116, 141) 139 (125, 158) <0.001
diaBP 81 (74, 88) 86 (78, 95) <0.001
BMI 25.3 (23.0, 27.9) 26.2 (23.5, 28.9) <0.001
    Unknown 9 10
heartRate 75 (68, 83) 75 (68, 85) 0.2
    Unknown 0 1
glucose 78 (71, 86) 79 (72, 90) <0.001
    Unknown 338 50
1

n (%); Median (IQR)

2

Pearson’s Chi-squared test; Wilcoxon rank sum test; Fisher’s exact test

a base de datos bmd.csv contiene datos un grupo de pacientes con fracturas y un grupo de pacientes sin fracturas. Utilizando las variables AGE, SEX, BMI and BMD cree un modelo de regresión logística. Utilice la variable fracture como variable dependiente para la construcción de este modelo. Seleccione el mejor modelo posible manualmente y utilizando el algoritmo de stepwise. Estime para estos modelos el OR y realice una interpretación de los mismos.

Ejercicio 2.

El conjunto de datos bdiag.csv incluye varios detalles de imágenes de pacientes a los que se les realizó una biopsia para detectar cáncer de mama.

La variable Diagnóstico clasifica el tejido biopsiado como M = maligno o B = benigno. Con esta base de datos estime;

  1. El mejor modelo de forma manual
  2. El mejor modelo utilizando el stepwise
  3. OR y sus IC
  4. Interprete sus resultados

Ejercicio 3.

El conjunto de datos SBI.csv contiene información de más de 2300 niños que acudieron a los servicios de emergencia con fiebre y se les realizó una prueba de infección bacteriana grave. El resultado sbi tiene 4 categorías: No aplicable (sin infección) / UTI / Pneum / Bact

Cree un modelo de regresión de logística para identificar a los pacientes sin infección o aquellos pacientes con cualquiera de las infecciones (UTI/Pneum/Bact). Si es necesario cree una variable. Para este modelo seleccione aquellas variables que aportan significativamente al modelo. Estime los OR y sus intervalos de confianza. Interprete este modelo.

Ejercicio 4.

Utilizando la base de datos salt_tension_arterial.csv realice un modelo de regresión logística para identificar las variables asociadas a la hipertensión (Más de 140 mmHg). Seleccione las variables que aportan significativamente al modelo. Estime los OR y sus intervalos de confianza. Interprete este modelo.

Resolución ejercicios Regresión Logística

Resolución ejercicio 1

Importar base de datos

df <- read.csv("Bases/framingham.csv")

Adecuación de la base de datos

df$male <- factor(df$male, levels = c(0, 1), labels = c("Female", "Male"))

df$currentSmoker <- factor(df$currentSmoker, levels = c(0, 1), labels = c("No", "Yes"))

df$BPMeds <- factor(df$BPMeds, levels = c(0, 1), labels = c("No", "Yes"))

df$prevalentStroke <- factor(df$prevalentStroke, levels = c(0, 1), labels = c("No", "Yes"))

df$prevalentHyp <- factor(df$prevalentHyp, levels = c(0, 1), labels = c("No", "Yes"))


df$diabetes <- factor(df$diabetes, levels = c(0, 1), labels = c("No", "Yes"))

df$TenYearCHD <- factor(df$TenYearCHD, levels = c(0, 1), labels = c("No risk", "Yes, risk"))

Visualizar base de datos

visdat::vis_dat(df)

Para poder hacer el modelo de regresión logística se debe de tener en cuenta que no debe de haber NA. El siguiente código se utiliza para identificar si hay NA en la base de datos:

df <- na.omit(df)

visdat::vis_dat(df)

Ahora si podemos hacer el modelo de regresión logística

Moedelo regresión forward

MASS::stepAIC(glm(TenYearCHD ~ ., family = "binomial", data = df), direction = "both")
Start:  AIC=2786.2
TenYearCHD ~ male + age + education + currentSmoker + cigsPerDay + 
    BPMeds + prevalentStroke + prevalentHyp + diabetes + totChol + 
    sysBP + diaBP + BMI + heartRate + glucose

                  Df Deviance    AIC
- diabetes         1   2754.2 2784.2
- currentSmoker    1   2754.4 2784.4
- BMI              1   2754.5 2784.5
- diaBP            1   2754.6 2784.6
- BPMeds           1   2754.7 2784.7
- heartRate        1   2754.8 2784.8
- education        1   2755.1 2785.1
- prevalentStroke  1   2756.1 2786.1
<none>                 2754.2 2786.2
- prevalentHyp     1   2757.1 2787.1
- totChol          1   2758.4 2788.4
- cigsPerDay       1   2762.4 2792.4
- glucose          1   2764.7 2794.7
- sysBP            1   2770.5 2800.5
- male             1   2780.3 2810.3
- age              1   2847.6 2877.6

Step:  AIC=2784.21
TenYearCHD ~ male + age + education + currentSmoker + cigsPerDay + 
    BPMeds + prevalentStroke + prevalentHyp + totChol + sysBP + 
    diaBP + BMI + heartRate + glucose

                  Df Deviance    AIC
- currentSmoker    1   2754.4 2782.4
- BMI              1   2754.5 2782.5
- diaBP            1   2754.6 2782.6
- BPMeds           1   2754.7 2782.7
- heartRate        1   2754.8 2782.8
- education        1   2755.2 2783.2
- prevalentStroke  1   2756.1 2784.1
<none>                 2754.2 2784.2
- prevalentHyp     1   2757.1 2785.1
+ diabetes         1   2754.2 2786.2
- totChol          1   2758.4 2786.4
- cigsPerDay       1   2762.4 2790.4
- sysBP            1   2770.6 2798.6
- glucose          1   2773.0 2801.0
- male             1   2780.4 2808.4
- age              1   2847.7 2875.7

Step:  AIC=2782.42
TenYearCHD ~ male + age + education + cigsPerDay + BPMeds + prevalentStroke + 
    prevalentHyp + totChol + sysBP + diaBP + BMI + heartRate + 
    glucose

                  Df Deviance    AIC
- BMI              1   2754.6 2780.6
- diaBP            1   2754.8 2780.8
- BPMeds           1   2754.9 2780.9
- heartRate        1   2755.0 2781.0
- education        1   2755.3 2781.3
- prevalentStroke  1   2756.3 2782.3
<none>                 2754.4 2782.4
- prevalentHyp     1   2757.3 2783.3
+ currentSmoker    1   2754.2 2784.2
+ diabetes         1   2754.4 2784.4
- totChol          1   2758.6 2784.6
- sysBP            1   2770.8 2796.8
- glucose          1   2773.2 2799.2
- cigsPerDay       1   2776.3 2802.3
- male             1   2780.5 2806.5
- age              1   2847.8 2873.8

Step:  AIC=2780.64
TenYearCHD ~ male + age + education + cigsPerDay + BPMeds + prevalentStroke + 
    prevalentHyp + totChol + sysBP + diaBP + heartRate + glucose

                  Df Deviance    AIC
- diaBP            1   2755.0 2779.0
- BPMeds           1   2755.1 2779.1
- heartRate        1   2755.2 2779.2
- education        1   2755.7 2779.7
- prevalentStroke  1   2756.6 2780.6
<none>                 2754.6 2780.6
- prevalentHyp     1   2757.6 2781.6
+ BMI              1   2754.4 2782.4
+ currentSmoker    1   2754.5 2782.5
+ diabetes         1   2754.6 2782.6
- totChol          1   2758.9 2782.9
- sysBP            1   2771.0 2795.0
- glucose          1   2773.7 2797.7
- cigsPerDay       1   2776.3 2800.3
- male             1   2780.9 2804.9
- age              1   2847.9 2871.9

Step:  AIC=2778.97
TenYearCHD ~ male + age + education + cigsPerDay + BPMeds + prevalentStroke + 
    prevalentHyp + totChol + sysBP + heartRate + glucose

                  Df Deviance    AIC
- BPMeds           1   2755.5 2777.5
- heartRate        1   2755.6 2777.6
- education        1   2756.1 2778.1
- prevalentStroke  1   2756.9 2778.9
<none>                 2755.0 2779.0
- prevalentHyp     1   2757.7 2779.7
+ diaBP            1   2754.6 2780.6
+ currentSmoker    1   2754.8 2780.8
+ BMI              1   2754.8 2780.8
+ diabetes         1   2754.9 2780.9
- totChol          1   2759.2 2781.2
- glucose          1   2774.4 2796.4
- cigsPerDay       1   2776.9 2798.9
- sysBP            1   2778.2 2800.2
- male             1   2780.9 2802.9
- age              1   2854.7 2876.7

Step:  AIC=2777.49
TenYearCHD ~ male + age + education + cigsPerDay + prevalentStroke + 
    prevalentHyp + totChol + sysBP + heartRate + glucose

                  Df Deviance    AIC
- heartRate        1   2756.2 2776.2
- education        1   2756.6 2776.6
<none>                 2755.5 2777.5
- prevalentStroke  1   2757.6 2777.6
- prevalentHyp     1   2758.5 2778.5
+ BPMeds           1   2755.0 2779.0
+ diaBP            1   2755.1 2779.1
+ currentSmoker    1   2755.3 2779.3
+ BMI              1   2755.3 2779.3
+ diabetes         1   2755.5 2779.5
- totChol          1   2759.8 2779.8
- glucose          1   2775.0 2795.0
- cigsPerDay       1   2777.4 2797.4
- sysBP            1   2780.1 2800.1
- male             1   2781.2 2801.2
- age              1   2855.5 2875.5

Step:  AIC=2776.15
TenYearCHD ~ male + age + education + cigsPerDay + prevalentStroke + 
    prevalentHyp + totChol + sysBP + glucose

                  Df Deviance    AIC
- education        1   2757.2 2775.2
<none>                 2756.2 2776.2
- prevalentStroke  1   2758.4 2776.4
- prevalentHyp     1   2759.0 2777.0
+ heartRate        1   2755.5 2777.5
+ BPMeds           1   2755.6 2777.6
+ diaBP            1   2755.8 2777.8
+ currentSmoker    1   2756.0 2778.0
+ BMI              1   2756.0 2778.0
+ diabetes         1   2756.1 2778.1
- totChol          1   2760.3 2778.3
- glucose          1   2775.2 2793.2
- cigsPerDay       1   2777.4 2795.4
- sysBP            1   2780.2 2798.2
- male             1   2783.2 2801.2
- age              1   2858.2 2876.2

Step:  AIC=2775.19
TenYearCHD ~ male + age + cigsPerDay + prevalentStroke + prevalentHyp + 
    totChol + sysBP + glucose

                  Df Deviance    AIC
<none>                 2757.2 2775.2
- prevalentStroke  1   2759.5 2775.5
- prevalentHyp     1   2760.0 2776.0
+ education        1   2756.2 2776.2
+ heartRate        1   2756.6 2776.6
+ BPMeds           1   2756.7 2776.7
+ diaBP            1   2756.7 2776.7
+ BMI              1   2757.0 2777.0
+ currentSmoker    1   2757.0 2777.0
+ diabetes         1   2757.2 2777.2
- totChol          1   2761.2 2777.2
- glucose          1   2776.4 2792.4
- cigsPerDay       1   2778.7 2794.7
- sysBP            1   2782.0 2798.0
- male             1   2784.1 2800.1
- age              1   2863.9 2879.9

Call:  glm(formula = TenYearCHD ~ male + age + cigsPerDay + prevalentStroke + 
    prevalentHyp + totChol + sysBP + glucose, family = "binomial", 
    data = df)

Coefficients:
       (Intercept)            maleMale                 age          cigsPerDay  
         -8.739521            0.553152            0.065337            0.019574  
prevalentStrokeYes     prevalentHypYes             totChol               sysBP  
          0.751412            0.226231            0.002248            0.014219  
           glucose  
          0.007314  

Degrees of Freedom: 3655 Total (i.e. Null);  3647 Residual
Null Deviance:      3121 
Residual Deviance: 2757     AIC: 2775

De acuerdo con este resultado el mejor modelo es:

modelo.final <- glm(formula = TenYearCHD ~ male + age + 
                      cigsPerDay + prevalentStroke + 
                      prevalentHyp + totChol + sysBP + 
                      glucose, family = "binomial", 
                    data = df)

Para visualizar los resultadosde una mejor manera puede emplear el siguient código:

library(broom)

# Extraer los OR y sus IC
resultado <- tidy(modelo.final, exponentiate = TRUE, conf.int = TRUE)

# Visualizar los resultados
print(resultado)
# A tibble: 9 × 7
  term               estimate std.error statistic  p.value  conf.low conf.high
  <chr>                 <dbl>     <dbl>     <dbl>    <dbl>     <dbl>     <dbl>
1 (Intercept)        0.000160   0.523      -16.7  8.72e-63 0.0000568  0.000441
2 maleMale           1.74       0.107        5.17 2.37e- 7 1.41       2.15    
3 age                1.07       0.00644     10.1  3.69e-24 1.05       1.08    
4 cigsPerDay         1.02       0.00418      4.68 2.85e- 6 1.01       1.03    
5 prevalentStrokeYes 2.12       0.484        1.55 1.20e- 1 0.791      5.40    
6 prevalentHypYes    1.25       0.135        1.67 9.40e- 2 0.961      1.63    
7 totChol            1.00       0.00112      2.00 4.52e- 2 1.00       1.00    
8 sysBP              1.01       0.00286      4.98 6.48e- 7 1.01       1.02    
9 glucose            1.01       0.00167      4.37 1.23e- 5 1.00       1.01    
# Extraer los coeficientes y la matriz de covarianzas del modelo
coeficientes <- coef(modelo.final)
vcov_matriz <- vcov(modelo.final)

# Calcular OR e IC
OR <- exp(coeficientes)
se <- sqrt(diag(vcov_matriz))
ci_lower <- exp(coeficientes - 1.96 * se)
ci_upper <- exp(coeficientes + 1.96 * se)

# Crear un data frame con los resultados
resultado <- data.frame(
  Variable = names(coeficientes),
  OR = OR,
  IC_Lower = ci_lower,
  IC_Upper = ci_upper
)

# Visualizar los resultados
print(resultado)
                             Variable           OR     IC_Lower     IC_Upper
(Intercept)               (Intercept) 0.0001601305 5.749886e-05 0.0004459529
maleMale                     maleMale 1.7387255317 1.409676e+00 2.1445829633
age                               age 1.0675188536 1.054121e+00 1.0810868741
cigsPerDay                 cigsPerDay 1.0197670534 1.011443e+00 1.0281592142
prevalentStrokeYes prevalentStrokeYes 2.1199912723 8.217083e-01 5.4695358028
prevalentHypYes       prevalentHypYes 1.2538650255 9.621726e-01 1.6339869965
totChol                       totChol 1.0022504938 1.000048e+00 1.0044577257
sysBP                           sysBP 1.0143206595 1.008656e+00 1.0200170206
glucose                       glucose 1.0073412920 1.004044e+00 1.0106491976

Evaluación del modelo mediante AUC

library(pROC)
predicciones <- predict(modelo.final, type = "response")
eval_modelo <- roc(df$TenYearCHD, predicciones)
plot(eval_modelo)

auc(eval_modelo)
Area under the curve: 0.7374