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\).
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)
# 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
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
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.
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
# 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
# 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
# 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