Regresión Logística

La regresión logística es un tipo de análisis de regresión utilizado para predecir el resultado de una variable categórica (binaria) a partir de una o más variables independientes. La variable dependiente es binaria, lo que significa que tiene dos posibles resultados, como “sí” o “no”, “éxito” o “fracaso”, etc.

La regresión logística utiliza la función logística para modelar la probabilidad de que ocurra un evento. La función logística es una función sigmoide que transforma cualquier valor real en un valor entre 0 y 1, lo que la hace adecuada para modelar probabilidades.

La fórmula general de la regresión logística es: \[ \text{logit}(p) = \ln\left(\frac{p}{1-p}\right) = \beta_0 + \beta_1X_1 + \beta_2X_2 + ... + \beta_nX_n \]

donde: - \(p\) es la probabilidad de que ocurra el evento de interés. - \(\beta_0\) es la intersección (o término constante). - \(\beta_1, \beta_2, ..., \beta_n\) son los coeficientes de regresión para las variables independientes \(X_1, X_2, ..., X_n\).

Regresión Logística en R con los datos de diabetes.csv

Vamos a realizar un análisis de regresión logística utilizando el conjunto de datos diabetes.csv, que contiene información sobre pacientes diabéticos. El objetivo es predecir si un paciente tiene diabetes (1) o no (0) en función de varias características. Usaremos las variables predictoras: BMI, Glucose, Age y DiabetesPedigreeFunction.

Vamos a leer los datos y filtrar los que tengan valores de BMI y Glucose diferentes de 0.

# Leer los datos
diabetes <- read.csv("diabetes.csv")

# Filtrar los datos
diabetes_filt <- diabetes[diabetes$BMI != 0 & diabetes$Glucose != 0 & diabetes$BloodPressure != 0,]

# Verificar la estructura de los datos
str(diabetes_filt)
## 'data.frame':    724 obs. of  9 variables:
##  $ Pregnancies             : int  6 1 8 1 0 5 3 2 4 10 ...
##  $ Glucose                 : int  148 85 183 89 137 116 78 197 110 168 ...
##  $ BloodPressure           : int  72 66 64 66 40 74 50 70 92 74 ...
##  $ SkinThickness           : int  35 29 0 23 35 0 32 45 0 0 ...
##  $ Insulin                 : int  0 0 0 94 168 0 88 543 0 0 ...
##  $ BMI                     : num  33.6 26.6 23.3 28.1 43.1 25.6 31 30.5 37.6 38 ...
##  $ DiabetesPedigreeFunction: num  0.627 0.351 0.672 0.167 2.288 ...
##  $ Age                     : int  50 31 32 21 33 30 26 53 30 34 ...
##  $ Outcome                 : int  1 0 1 0 1 0 1 1 0 1 ...
# Convertir la variable 'Outcome' a factor
diabetes_filt$Outcome <- as.factor(diabetes_filt$Outcome)

Modelo de Regresión Logística

# Ajustar el modelo de regresión logística
modelo_logistico <- glm(Outcome ~ BMI + Glucose + Age + DiabetesPedigreeFunction + BloodPressure, 
                         data = diabetes_filt, 
                         family = binomial)
# Resumen del modelo
summary(modelo_logistico)
## 
## Call:
## glm(formula = Outcome ~ BMI + Glucose + Age + DiabetesPedigreeFunction + 
##     BloodPressure, family = binomial, data = diabetes_filt)
## 
## Coefficients:
##                           Estimate Std. Error z value Pr(>|z|)    
## (Intercept)              -9.014890   0.812880 -11.090  < 2e-16 ***
## BMI                       0.088641   0.015463   5.732 9.90e-09 ***
## Glucose                   0.034567   0.003565   9.697  < 2e-16 ***
## Age                       0.034523   0.008490   4.066 4.78e-05 ***
## DiabetesPedigreeFunction  0.923290   0.303988   3.037  0.00239 ** 
## BloodPressure            -0.007433   0.008505  -0.874  0.38212    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 931.94  on 723  degrees of freedom
## Residual deviance: 685.66  on 718  degrees of freedom
## AIC: 697.66
## 
## Number of Fisher Scoring iterations: 5

Calcular los odd-ratios

# Calcular los odd-ratios
odds_ratios <- exp(coef(modelo_logistico))
# Crear un dataframe con los odd-ratios
odds_ratios_df <- data.frame(
  Variable = names(odds_ratios),
  Odds_Ratio = odds_ratios
)
# Mostrar los odd-ratios
print(odds_ratios_df)
##                                          Variable   Odds_Ratio
## (Intercept)                           (Intercept) 0.0001215859
## BMI                                           BMI 1.0926881350
## Glucose                                   Glucose 1.0351718025
## Age                                           Age 1.0351254490
## DiabetesPedigreeFunction DiabetesPedigreeFunction 2.5175597046
## BloodPressure                       BloodPressure 0.9925941343
# Graficar los odd-ratios
library(ggplot2)
ggplot(odds_ratios_df, aes(x = Variable, y = Odds_Ratio)) +
  geom_bar(stat = "identity", fill = "blue") +
  coord_flip() +
  labs(
    title = "Odd-Ratios de las Variables Predictoras",
    x = "Variables Predictoras",
    y = "Odd-Ratio"
  ) +
  theme_minimal()

Figura 1: Odd-Ratios de las Variables Predictoras

Interpretación de los odd-ratios

Los odd-ratios representan el cambio en las probabilidades de que ocurra el evento de interés (en este caso, la diabetes) por cada unidad de cambio en la variable predictora. Un odd-ratio mayor que 1 indica un aumento en la probabilidad del evento, mientras que un odd-ratio menor que 1 indica una disminución en la probabilidad del evento. Un odd-ratio de 1 indica que no hay efecto de la variable predictora sobre la probabilidad del evento.

Gráfica del Pedigree Function y el Outcome

library(ggplot2)
# Graficar la relación entre DiabetesPedigreeFunction y el Outcome incluyendo la curva de regresión
ggplot(diabetes_filt, aes(x = DiabetesPedigreeFunction, y = Outcome)) +
  geom_point(aes(color = Outcome), alpha = 0.5) +
  labs(
    x = "DiabetesPedigreeFunction",
    y = "Outcome"
  ) +
  theme_minimal()

Figura 2: Relación entre DiabetesPedigreeFunction y el Outcome

Gráfica de la variable Glucose y el Outcome

# Graficar la relación entre Age y el Outcome
ggplot(diabetes_filt, aes(x = Glucose, y = Outcome)) +
  geom_point(aes(color = Outcome), alpha = 0.5) +
  labs(
    x = "Glucose",
    y = "Outcome"
  ) +
  theme_minimal()

Figura 3: Relación entre Glucose y el Outcome

Gráfica de la variable Age y el Outcome

# Graficar la relación entre Age y el Outcome
ggplot(diabetes_filt, aes(x = Age, y = Outcome)) +
  geom_point(aes(color = Outcome), alpha = 0.5) +
  labs(
    x = "Age",
    y = "Outcome"
  ) +
  theme_minimal()

Figura 4: Relación entre Age y el Outcome

Gráfica de la variable BMI y el Outcome

# Graficar la relación entre BMI y el Outcome
ggplot(diabetes_filt, aes(x = BMI, y = Outcome)) +
  geom_point(aes(color = Outcome), alpha = 0.5) +
  labs(
    x = "BMI",
    y = "Outcome"
  ) +
  theme_minimal()

Figura 5: Relación entre BMI y el Outcome