MODELO DE REGRESIÓN LOGÍSTICA SIMPLE

Se establecera un modelo que permita calcular la probabilidad de obtener un bueno promedio, dependiendo de las horas de estudio. La variable promedio, sera 1 si el promedio es superior a 3.5 y 0 si el promedio es inferior e igual a 3.5.

1. Preparación de los datos

Primero se carga la base de datos ubicada en el computador, despues convertimos la variable promedio en binaria y despues la volvemos factor. De igual forma convertimos a factores las otras variables categoricas de la base de datos.

# Cargamos base de datos
library(readxl)
Ejemplo3 <- read_excel("C:/Users/house/OneDrive/Escritorio/Nueva carpeta/Especialización/Especialización/Curso 2/3. Modelos de regresión/Clase 3/Trabajo en clase/Ejemplo3.xlsx")

# Creamos la variable binaria: 1 si promedio >= 3.5, 0 si < 3.5
Ejemplo3$promedio_binario1 <- ifelse(Ejemplo3$promedio >= 3.5, 1, 0)

# Convertirla en factor
Ejemplo3$promedio_binario2 <- factor(Ejemplo3$promedio_binario1, levels = c(0, 1), labels = c("Bajo", "Alto"))

# Convertir variables categóricas a factores
Ejemplo3$`asiste a clases` <- factor(Ejemplo3$`asiste a clases`)
Ejemplo3$`tiene apoyo academico` <- factor(Ejemplo3$`tiene apoyo academico`)
Ejemplo3$`tener celular`<- factor(Ejemplo3$`tener celular`)

# Verificar
str(Ejemplo3)
## tibble [36 × 12] (S3: tbl_df/tbl/data.frame)
##  $ horas frente a pantallas: num [1:36] 4.56 3.91 2.86 5.31 7.19 ...
##  $ horas sueño             : num [1:36] 3 2 1 6 8 8 9 5 6 6 ...
##  $ hora estudio            : num [1:36] 2 3 1.5 4 3.5 5 6 2.5 7 8 ...
##  $ promedio                : num [1:36] 2.5 2 1 3 4 4.5 5 3.5 3 3.2 ...
##  $ tener celular           : Factor w/ 2 levels "No","Sí": 2 2 2 2 2 2 1 1 1 1 ...
##  $ horas estudio           : num [1:36] 5 2 4 2 1 3 2 3 1 1 ...
##  $ asiste a clases         : Factor w/ 2 levels "No","Sí": 2 1 1 2 2 1 2 1 2 2 ...
##  $ tiene apoyo academico   : Factor w/ 2 levels "No","Sí": 1 2 1 1 2 1 1 1 2 1 ...
##  $ nivel de estrés         : num [1:36] 3 4 4 4 4 1 2 4 2 5 ...
##  $ uso de celular          : num [1:36] 0 5.1 0.5 0.3 7 2.3 6.1 2.9 7 0.2 ...
##  $ promedio_binario1       : num [1:36] 0 0 0 0 1 1 1 1 0 0 ...
##  $ promedio_binario2       : Factor w/ 2 levels "Bajo","Alto": 1 1 1 1 2 2 2 2 1 1 ...

2. Representación de las observaciones

Representar las observaciones es útil para intuir si la variable independiente escogida está relacionada con la variable respuesta y, por lo tanto, puede ser un buen predictor.

Frecuencia (porcentaje) de Promedios según Horas de Sueño
Promedio 1 2 3 5 6 7 8 9 Sum
Bajo 2 (15.4%) 2 (15.4%) 2 (15.4%) 0 (0%) 7 (53.8%) 0 (0%) 0 (0%) 0 (0%) 13 (100%)
Alto 0 (0%) 0 (0%) 0 (0%) 4 (17.4%) 0 (0%) 6 (26.1%) 11 (47.8%) 2 (8.7%) 23 (100%)
Sum 2 (15.4%) 2 (15.4%) 2 (15.4%) 4 (17.4%) 7 (53.8%) 6 (26.1%) 11 (47.8%) 2 (8.7%) 36 (200%)

Como se observa en las tablas de frecuencia y el boxplot, el número de estudiantes varía según las horas de sueño. Seis estudiantes duermen de 2 a 3 horas, mientras que la mayoría (30 de 36) duermen entre 5 y 9 horas. El promedio de estudiantes con rendimiento bajo es menor en comparación con quienes tienen un rendimiento alto. En vista de estos datos, es razonable considerar las horas de sueño como una variable predictora del rendimiento académico.

3. Ajuste del modelo de regresión logística simple

Se ajusta un modelo de regresión logística con el proposito de estimar la probabilidad de obtener un promedio alto o bajo. En ese sentido, la variable de respuesta es la variable promedio donde esta es 1 si es mayor e igual a 3.5 y 0 si es menor a 3.5, de igual forma la variable predictora sera horas de estudio.

modelo_logistico <- glm(promedio_binario2 ~ `horas sueño`, data = Ejemplo3, family = "binomial")
summary(modelo_logistico)
## 
## Call:
## glm(formula = promedio_binario2 ~ `horas sueño`, family = "binomial", 
##     data = Ejemplo3)
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)   
## (Intercept)    -6.7186     2.6947  -2.493  0.01266 * 
## `horas sueño`   1.1921     0.4268   2.794  0.00521 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 47.092  on 35  degrees of freedom
## Residual deviance: 25.948  on 34  degrees of freedom
## AIC: 29.948
## 
## Number of Fisher Scoring iterations: 6

4. Interpretación del modelo logístico simple

Modelo Ajustado

\[\text{logit} \left(p\right)=β_0+β_1\text{(horas de sueño)}=-6.71+1.19\text{(horas de sueño)}\] \[\text{Log}\left(\frac{p}{1-p}\right)= \text{logit} \left(p\right)\] Probabilidad

Representa la probabilidad de que un estudiante tenga un promedio alto basado en sus horas de sueño.

\[p = \frac{1}{1+e^{\left(-β_0-β_1\text{(horas de sueño)}\right)}}=\frac{1}{1+e^{\left(6.71-1.19\text{(horas de sueño)}\right)}}\] Odds

Son la razón entre la probabilidad de que un estudiante obtenga un promedio alto \(p\) y la probabilidad de que obtenga un promedio bajo \(1-p\), dado un número de horas de sueño.

\[\text{Odds}=\frac{p}{1-p} = e^{β_0+β_1\text{(horas de sueño)}}=e^{-6.71+1.19\text{(horas de sueño)}}\]

Analisis de Coeficientes

\(β_1\) (Intercepto):

probabilidad <- 1/(1+exp(6.71))
probabilidad
## [1] 0.001217181

\[\text{p} = \frac{1}{1+e^\left(6.71\right)} = 0.0012 = 0.12% \]

odd_intercepto <-exp(-6.71)
odd_intercepto
## [1] 0.001218664

\[odd = e^{-6.71} = 0.001218664 \]

\(β_1\)(Coeficiente de horas de sueño):

probabilidad2 <- 1/(1+exp(-1.1921))
probabilidad2
## [1] 0.7671164

\[\text{p} = \frac{1}{1+e^\left(-1.19\right)} = 0.7671 = 76\% \]

odd_horas <-exp(-1.1921)
odd_horas
## [1] 0.3035831
\[odd = e^{-1.1921} = 0.3035831 \]

Analisis de Desviancia

La desviancia es similar al residuo, pero adaptado a modelos más complejos, donde a menor desviancia mejor es el ajuste del modelo a los datos.

\[\text{Deviance}= -2*\text{log-verosimilitud del modelo}\]

En ese contexto, null deviance es la representación de la desviación del modelo sin predictores y residual deviance, con los predictores. Por lo tanto, en el presente modelo el valor null deviance es del 47.092, mientras que residual deviance es de 25.948, donde se observa que la variabilidad del modelo solo con el intercepto es mayor en comparación a la del modelo con un unico predictor (Horas de sueño). Por lo tanto, el modelo ajustado es significativamente mejor que el modelo nulo, ya que, la inclusion de la variable Horas de sueño proporciona una mejora significativa al modelo.

5. Prediciones

Calculamos la probabilidad estimada para cada observación y la clasificamos como “Alto” si la probabilidad es mayor a 0.5, de igual forma se calculan los odds en la tabla.

\[p =\frac{1}{1+e^{\left(6.71-1.19\text{(horas de sueño)}\right)}}\]

# Probabilidades predichas
probabilidades <- predict(modelo_logistico, type = "response")

# Clasificación binaria
pred_clase <- ifelse(probabilidades > 0.5, "Alto", "Bajo")

# Calcular odds
odds <- round(probabilidades / (1 - probabilidades), 3)

# Mostrar tabla con todo
tabla_predicciones <- data.frame(
  "Horas de sueño" = Ejemplo3$`horas sueño`,
  Probabilidad = round(probabilidades, 3),
  Odds = odds,
  Clasificación = pred_clase
)

# Las 6 primeras predicciones
head(tabla_predicciones)
##   Horas.de.sueño Probabilidad   Odds Clasificación
## 1              3        0.041  0.043          Bajo
## 2              2        0.013  0.013          Bajo
## 3              1        0.004  0.004          Bajo
## 4              6        0.607  1.544          Alto
## 5              8        0.944 16.752          Alto
## 6              8        0.944 16.752          Alto

Probabilidades Predichas

La probabilidad de que un estudiante obtenga un buen promedio varía según las horas de sueño. De acuerdo con la tabla, un estudiante que duerme 3 horas tiene solo un 0.041 de probabilidad de obtener un promedio alto, lo que indica una baja probabilidad de buen desempeño académico con tan pocas horas de descanso. En cambio, estudiante que duerme 8 horas tiene más probabilidad de 0.944 de obtener un promedio alto, lo que refleja alta probabilidad de éxitos académico con más horas de sueño. Este patrón sugiere que un mayor tiempo de descanso está asociado con un mejor rendimiento académico.

Odds

Los odds, en este caso representan la relación entre la probabilidad de éxitos (obtener un promedio alto) y la probabilidad de fracaso (obtener un promedio bajo). En ese sentido, a medida que aumentan las horas de sueño, los odds también lo hacen, lo que indica que es más probable que un estudiante alcance un promedio alto. Como se observa en la tabla, un estudiante que duerme 3 horas tiene un odd de 0.043, lo que refleja una probabilidad muy baja de obtener un promedio alto frente a la posibilidad de obtener uno bajo. En contraste, con 8 horas de sueño, los odds aumentan a 16.7, evidenciando un incremento considerable en la probabilidad de éxito académico.

6. Visualización del modelo

Graficamos la curva logística ajustada sobre los puntos observados para visualizar la relación entre las horas de sueño y la probabilidad estimada del promedio.

library(ggplot2)

ggplot(Ejemplo3, aes(x = `horas sueño`, y = as.numeric(promedio_binario2) - 1)) +
  geom_point(aes(color = promedio_binario2), size = 2) +
    scale_color_manual(values = c("Bajo" = "#EE6A50", "Alto" = "#3A5FCD")) +
  stat_smooth(method = "glm", method.args = list(family = "binomial"), se = FALSE, color = "#548B54") +
  labs(
    title = "PROBABILIDAD DE UN PROMEDIO ALTO SEGÚN LAS HORA DE SUEÑO",
    x = "HORAS DE SUEÑO",
    y = "PROBABILIDAD",
    color = "PROMEDIO"
  ) +
  theme_light()
## `geom_smooth()` using formula = 'y ~ x'

De acuerdo con la gráfica anterior, al categorizar la variable dependiente “promedio” en dos niveles, como promedios altos (mayores o iguales a 3.5) y promedios bajos (menores a 3.5), se observa que existe una probabilidad del 50% de que los estudiantes tengan un promedio alto o bajo, respectivamente.

7. Matriz de Confusión

Comparación de las predicciones con las observaciones. Si la probabilidad predicha del promedio es igual a 0.5 se asigna al nivel 1 (Promedio alto), si es menor se asigna al nivel 0 (Promedio bajo).

##           Observacion
## Prediccion Bajo Alto
##       Alto    7   19
##       Bajo    6    4

De acuerdo con la matriz confusión, su representación en la gráfica de calor y el resumen de resultados, se observa que el modelo detecta bien los promedios altos. En total, clasificó correctamente 19 casos con promedios altos (Verdaderos Positivos), mientras que solo en 4 ocasiones no logró identificarlos, resultando en falsos negativos. Por otro lado, el modelo cometió 7 errores al predecir promedios altos cuando en realidad eran bajos (Falsos Positivos). Finalmente, logró indentificar correctamente 6 promedios bajos (Verdaderos Negativos). Es decir, que el modelo es más eficaz para identificar correctamente los promedios altos que los bajos.

RESUMEN DE LA MATRIZ DE CONFUSIÓN

Norma de la Matriz de Confusion
Detalle con tipo de caso y descripcion
Observacion Prediccion Tipo de Caso Descripcion Frecuencia
Bajo Alto Falso Positivo (FP) Predijo alto y era bajo 7
Bajo Bajo Verdadero Negativo (VN) Predijo bajo y era bajo 6
Alto Alto Verdadero Positivo (VP) Predijo alto y era alto 19
Alto Bajo Falso Negativo (FN) Predijo bajo y era alto 4

8. Métricas de desempeño predictivo (basadas en la matriz de confusión)

A partir de la matriz de confusión, podemos calcular manualmente: Precisión (accuracy), Sensibilidad (recall), Especificidad y F1-score

Tabla de Métricas de Desempeño
Clasificación de Promedio: Alta vs Baja
Métrica Valor (%) Descripción Fórmula
sensitivity 82.61% Capacidad de identificar correctamente los promedios altos. \( \frac{VP}{VP + FN} \)
specificity 46.15% Capacidad de identificar correctamente los promedios bajos. \( \frac{VN}{VN + FP} \)
precision 73.08% Indica la proporción de casos predichos como positivos que realmente lo eran \( \frac{VP}{VP + FP} \)
f1_score 77.55% Equilibrio entre precisión y sensibilidad. \( \frac{2 \cdot Precision \cdot Sensibilidad}{Precision + Sensibilidad} \)
accuracy 69.44% Mide la proporción total de aciertos (positivos y negativos correctamente clasificados) sobre el total de casos. \( \frac{VP + VN}{sum(matrizconfusion)} \)

Análisis de las métricas del desempeño predictivo

  1. Sensibilidad (Recall): El 82.61% de los promedios altos fueron correctamente identificados.

  2. Especificidad: Indica que solo el 46.15% de los promedios bajos fueron correctamente identificados.

  3. Precisión positiva(Precision) : De todas las predicciones que el modelo hizo como altas, el 73% realmente lo eran.

  4. F1-score: El 77.55% refleja buen equilibrio entre precisión y sensibilidad, lo que indica un buen desempeño del modelo.

  5. Precisión global(Accuracy) : De todas las predicciones realizadas, un 69.44% fueron correctas, tanto de promedios altos, como de promedios bajos.

En ese sentido, el modelo debe ser ajustado para mejorar la especificidad, ya que solo identifico el 46% de los promedios bajos, es decir que no identifica eficazmente los promedios bajos.

9. Métricas de ajuste del modelo

Estas se usan para comparar modelos o evaluar qué tan bien el modelo se ajusta a los datos observados: AIC (Akaike Information Criterion) y Desviancia (Deviance)

modelo_logistico <- glm(promedio_binario2 ~ `horas sueño`, data = Ejemplo3, family = "binomial")
modelo_logistico2 <- glm(promedio_binario2 ~ `horas sueño` + `tiene apoyo academico`, data = Ejemplo3, family = "binomial")

# AIC

AIC(modelo_logistico)
## [1] 29.94785
AIC(modelo_logistico2)
## [1] 31.94519
# Desviancia

summary(modelo_logistico)$deviance
## [1] 25.94785
summary(modelo_logistico2)$deviance
## [1] 25.94519

Análisis de las métricas en el ajuste del modelo

  1. AIC: Se puede concluir de lo anterior que el modelo 1 con la variable predictora (Hora Sueño) es mejor, ya que presenta un AIC bajo en comparación al modelo 2 con dos variables predictoras (Hora sueño y tiene apoyo academico).

  1. Desviancia: La diferencia entre ambos valos de la desviancia de ambos modelos es minima, pero se observa que el modelo 2 representa una desviancia más baja, lo cual indica, que entre más variables el modelo predice mejor el comportamiento de los datos.

10. Ajuste del umbral

Se realiza un histograma con el proposito de revisar la frecuencia y la probabilidad de los datos.

hist(probabilidades, breaks = 10, col = "lightblue", main = "Distribución de probabilidades predichas", xlab = "Probabilidad de ser manual")

De acuerdo con la el histograma de barras, se evidencia que la mayor cantidad de datos se encuentra entre las probabilidades 0.6 a 0.7 y de 0.8 a 1.

##   Umbral Accuracy sensitivity specificity precision    F1
## 1    0.6    0.694       0.826       0.462     0.731 0.776
## 2    0.7    0.889       0.826       1.000     1.000 0.905
## 3    0.8    0.889       0.826       1.000     1.000 0.905
## 4    0.9    0.722       0.565       1.000     1.000 0.722

En la tabla se encuentran los umbrales que presentan la mayor cantidad de casos, donde los umbrales del 0.7 al 0.8 son los que mejor se ajustan al modelo logistico.

11. Umbral ajustado

En ese sentido, si la probabilidad predicha del promedio es igual a 0.8 se asigna al nivel 1 (Promedio alto), si es menor e igual se asigna al nivel 0 (Promedio bajo).

##           Observacion
## Prediccion Bajo Alto
##       Alto    7   19
##       Bajo    6    4

RESUMEN DE LA MATRIZ DE CONFUSIÓN

Norma de la Matriz de Confusion
Detalle con tipo de caso y descripcion
Observacion Prediccion Tipo de Caso Descripcion Frecuencia
Bajo Alto Falso Positivo (FP) Predijo alto y era bajo 0
Bajo Bajo Verdadero Negativo (VN) Predijo bajo y era bajo 13
Alto Alto Verdadero Positivo (VP) Predijo alto y era alto 19
Alto Bajo Falso Negativo (FN) Predijo bajo y era alto 4

11. Metricas con el umbral ajustado

Tabla de Métricas de Desempeño
Clasificación de Promedio: Alta vs Baja
Métrica Valor (%) Descripción Fórmula
sensitivity 82.61% Capacidad de identificar correctamente los promedios altos. \( \frac{VP}{VP + FN} \)
specificity 100.00% Capacidad de identificar correctamente los promedios bajos. \( \frac{VN}{VN + FP} \)
precision 100.00% Indica la proporción de casos predichos como positivos que realmente lo eran \( \frac{VP}{VP + FP} \)
f1_score 90.48% Equilibrio entre precisión y sensibilidad. \( \frac{2 \cdot Precision \cdot Sensibilidad}{Precision + Sensibilidad} \)
accuracy 88.89% Mide la proporción total de aciertos (positivos y negativos correctamente clasificados) sobre el total de casos. \( \frac{VP + VN}{sum(matrizconfusion)} \)

Seleccionando el umbral 0.8, se determina que la especificidad del umbral es del 100%, es decir que el modelo clasifica correctamente los promedios bajos. Por otra parte, el modelo se equivoca clasificando los promedios altos, ya que la sensibilidad corresponde al 82.61%, asimismo la precisión de los umbrales fue del 100%, lo cual indica que los promedios altos se clasificaron de manera correcta, ahora el valor del f1_score establece que existe equilibrio del 91% entre la precisión y la sensibilidad, por ultimo la precisión global del modelo (accuracy) fue del 88.89%, indicando que el modelo presentó errores en la clasificación, pero el desempeño fue bueno.

CONCLUSIONES

  1. De la investigación se concluye que el modelo que se ajusto al comportamiento de los datos es adecuado ya que, permite predecir a partir de las horas de sueño la probabilidad de obtener un promedio alto (mayor e igual a 3.5) o un promedio bajo (menor a 3.5), dependiendo del umbral seleccionado, que en este caso es del 0.8.
  2. El modelo logistico simple puede predecir de manera adecuada, pero al agregarle más variables que influyan sobre el modelo, la predicción se volvera más aproximada al comportamiento que tengan los datos, en ese sentido un modelo multivariado tiende a ser mejor, ya que se presentan más variables que aportan a la predicción.
  3. Al ajustar el umbral de probabilidad, se observó que el modelo cumple altamente con las métricas de desempeño, donde todas (Sensitivity, Specificity, Precrision, F1 Score y Acurracy), indicaron proporciones mayores al 80% y ademas Specificity y precisión clasificaron correctamente los promedios.
  4. Con base al modelo de regresión logistico, se concluye que ambos coeficientes (Intercepto y Valor que acompaña la variable horas de sueño) son significativos, al ser menores al 0.05.