Regresión Logística Ordinal

Author

Tania Jazmín Molina Ramírez

Published

August 14, 2024

1 - Regresión Logística Ordinal

La regresión logística ordinal es una herramienta para examinar la relación entre variables predictivas y la probabilidad de que un resultado ordinal caiga en una categoría particular o superior.

1.1 - Principios básicos de la regresión logística ordinal

  • Categorías ordenadas: La variable dependiente tiene categorías ordenadas.
  • Modelo Logit acumulativo: Relaciona las probabilidades logarítmicas de estar en una categoría o superior con variables predictivas.
  • Cuotas proporcionales: Evaluar el supuesto de probabilidades proporcionales.
  • Selección de modelo: Elegir variables predictivas adecuadas.

1.2 - Regresión Logística Ordinal en R Studio

1.2.1 - Base de Datos

La base de datos trata sobre el rendimiento académico de los estudiantes, contiene información de 998 estudiantes (cada fila representa a un estudiante), y para cada uno de esos estudiantes, tiene 13 características, considerando diferentes factores que pueden influir en su desempeño en matemáticas. Estos factores incluyen características demográficas como género, etnia, y el nivel educativo de los padres, además de elementos contextuales como el tipo de almuerzo que reciben, si han completado un curso de preparación para exámenes, y si participan en actividades extracurriculares.

También se tienen en cuenta aspectos como las horas de estudio, el acceso a recursos educativos y tecnológicos, la motivación del estudiante, el tipo de institución educativa (pública o privada), y si cuentan con acceso a tutoría. Todos estos factores se analizan para entender mejor cómo influyen en el rendimiento académico de los estudiantes, en particular en matemáticas.

Variable Categoría Qué es?
gender Variable categórica con categorías female y male Género: female (femenino) o male (masculino)
race_ethnicity Variable categórica con categorías group A, group B, group C, group D, group E Etnia: grupos A, B, C, D, E
parental_level_of_education Variable categórica con categorías associate’s degree, bachelor’s degree, high school, master’s degree, some college, some high school Nivel educativo de los padres: associate’s degree (título de asociado), bachelor’s degree (licenciatura), high school (secundaria), master’s degree (máster), some college (algunos estudios universitarios), some high school (algunos estudios de secundaria)
lunch Variable categórica con categorías free/reduced y standard Tipo de almuerzo: free/reduced (gratuito/reducido), standard (estándar)
test_preparation_course Variable categórica con categorías none y completed Curso de preparación para exámenes: none (ninguno), completed (completado)
math_score Variable ordinal con categorías Bajo Rendimiento, Rendimiento medio, Rendimiento alto Puntaje en matemáticas: Bajo Rendimiento, Rendimiento medio, Rendimiento alto
study_hours Variable continua (número de horas) Horas de estudio
extracurricular Variable categórica con categorías No y Si Actividades extracurriculares: No o Si
resources_access Variable categórica con categorías Bajo, Medio, Alto Acceso a recursos: Bajo, Medio, Alto
institution_type Variable categórica con categorías Privada y Publica Tipo de institución: Privada o Publica
student_motivation Variable categórica con categorías Baja, Media, Alta Motivación del estudiante: Baja, Media, Alta
tutoring_access Variable categórica con categorías No y Si Acceso a tutoría: No o Si
tech_resources Variable categórica con categorías Bajo, Medio, Alto Recursos tecnológicos: Bajo, Medio, Alto

1.2.2 - Carga de los Datos y Exploración Preliminar

Primero, cargamos las librerías necesarias para manejar y analizar los datos.

# Cargar las librerías necesarias
library(tidyverse)  # Para manipulación y visualización de datos
library(MASS)       # Para la regresión logística ordinal
library(readr)      # Para leer datos desde archivos CSV
library(knitr)      # Para formatear tablas

Cargamos los datos desde un archivo CSV, especificando que el delimitador es el punto y coma (;) y eliminamos los espacios en blanco al principio y al final de las entradas.

# Cargar el conjunto de datos desde el directorio
Student_Data <- read_delim("datos_actualizados.csv", 
                              delim = ";", escape_double = FALSE, trim_ws = TRUE)

1.3 - Análisis Exploratorio de Datos (EDA)

Realizamos un Análisis Exploratorio ya que es una manera de asegurarnos de que estamos usando buenos datos y tomando decisiones informadas desde el principio.

1.3.1 - Exploramos la Estructura de los Datos

# Resumen descriptivo de las variables numéricas
summary(Student_Data)
    gender          race_ethnicity     parental_level_of_education
 Length:999         Length:999         Length:999                 
 Class :character   Class :character   Class :character           
 Mode  :character   Mode  :character   Mode  :character           
                                                                  
                                                                  
                                                                  
    lunch           test_preparation_course  math_score         study_hours    
 Length:999         Length:999              Length:999         Min.   : 1.000  
 Class :character   Class :character        Class :character   1st Qu.: 3.000  
 Mode  :character   Mode  :character        Mode  :character   Median : 6.000  
                                                               Mean   : 5.505  
                                                               3rd Qu.: 8.000  
                                                               Max.   :10.000  
 extracurricular    resources_access   institution_type   student_motivation
 Length:999         Length:999         Length:999         Length:999        
 Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                            
                                                                            
                                                                            
 tutoring_access    tech_resources    
 Length:999         Length:999        
 Class :character   Class :character  
 Mode  :character   Mode  :character  
                                      
                                      
                                      
head(Student_Data)
# A tibble: 6 × 13
  gender race_ethnicity parental_level_of_education lunch test_preparation_cou…¹
  <chr>  <chr>          <chr>                       <chr> <chr>                 
1 female group B        bachelor's degree           stan… none                  
2 female group C        some college                stan… completed             
3 female group B        master's degree             stan… none                  
4 male   group A        associate's degree          free… none                  
5 male   group C        some college                stan… none                  
6 female group B        associate's degree          stan… none                  
# ℹ abbreviated name: ¹​test_preparation_course
# ℹ 8 more variables: math_score <chr>, study_hours <dbl>,
#   extracurricular <chr>, resources_access <chr>, institution_type <chr>,
#   student_motivation <chr>, tutoring_access <chr>, tech_resources <chr>
unique(Student_Data)
# A tibble: 998 × 13
   gender race_ethnicity parental_level_of_educat…¹ lunch test_preparation_cou…²
   <chr>  <chr>          <chr>                      <chr> <chr>                 
 1 female group B        bachelor's degree          stan… none                  
 2 female group C        some college               stan… completed             
 3 female group B        master's degree            stan… none                  
 4 male   group A        associate's degree         free… none                  
 5 male   group C        some college               stan… none                  
 6 female group B        associate's degree         stan… none                  
 7 female group B        some college               stan… completed             
 8 male   group B        some college               free… none                  
 9 male   group D        high school                free… completed             
10 female group B        high school                free… none                  
# ℹ 988 more rows
# ℹ abbreviated names: ¹​parental_level_of_education, ²​test_preparation_course
# ℹ 8 more variables: math_score <chr>, study_hours <dbl>,
#   extracurricular <chr>, resources_access <chr>, institution_type <chr>,
#   student_motivation <chr>, tutoring_access <chr>, tech_resources <chr>

1.3.2 - Revisamos las Variables

La selección de variables para convertirlas en factores u ordinales depende de su relevancia para el análisis y el modelo que se está construyendo.

Para comenzar vamos a convertir nuestra variable dependiente, que es math_score en un factor ordinal con niveles específicos que reflejen el rendimiento en matemáticas.

# Convertir la variable 'math_score' a un factor ordinal
Student_Data$math_score <- factor(Student_Data$math_score,
                                  levels = c("Bajo Rendimiento", "Rendimiento medio", "Rendimiento alto"),
                                  ordered = TRUE)
# Verificar los niveles de la variable 'math_score'
levels(Student_Data$math_score)
[1] "Bajo Rendimiento"  "Rendimiento medio" "Rendimiento alto" 
# Resumen de la variable 'math_score'
table(Student_Data$math_score)

 Bajo Rendimiento Rendimiento medio  Rendimiento alto 
              338               485               176 

Probablemente el desvalance notoriamente existente, puede darnos problemas entorno a la categoria Rendimiento alto.


Convertimos las demas variables a tipos que el modelo necesite, asegurando que las otras variables estén en el formato correcto (numéricas o categóricas).

# Asegurar que las variables numéricas sean de tipo numérico
Student_Data <- Student_Data %>%
  mutate(
    study_hours = as.numeric(study_hours)
  )

# Convertir variables categóricas a factores
Student_Data <- Student_Data %>%
  mutate(
    gender = factor(gender),
    race_ethnicity = factor(race_ethnicity),
    parental_level_of_education = factor(parental_level_of_education),
    lunch = factor(lunch),
    test_preparation_course = factor(test_preparation_course),
    institution_type = factor(institution_type),
    student_motivation = factor(student_motivation),
    tutoring_access = factor(tutoring_access),
    tech_resources = factor(tech_resources),
    extracurricular = factor(extracurricular),
    resources_access = factor(resources_access, levels = c("Bajo", "Medio", "Alto")) # Convertir a factor con niveles definidos)
  )

1.4 - Ajuste del Modelo de Regresión Logística Ordinal

Ajustamos el modelo1 de regresión logística ordinal usando todas las variables. Esto nos ayudará a ver cómo cada variable contribuye al rendimiento en matemáticas.

# Ajustar el modelo de regresión logística ordinal
modelo1 <- polr(math_score ~ gender + race_ethnicity + parental_level_of_education + lunch + test_preparation_course + study_hours + extracurricular + resources_access + institution_type +  student_motivation+ tutoring_access + tech_resources, data = Student_Data, Hess = TRUE)

# Resumen del primer modelo
summary(modelo1)
Call:
polr(formula = math_score ~ gender + race_ethnicity + parental_level_of_education + 
    lunch + test_preparation_course + study_hours + extracurricular + 
    resources_access + institution_type + student_motivation + 
    tutoring_access + tech_resources, data = Student_Data, Hess = TRUE)

Coefficients:
                                                 Value Std. Error  t value
gendermale                                    0.679404    0.12757  5.32557
race_ethnicitygroup B                         0.457521    0.26216  1.74518
race_ethnicitygroup C                         0.552410    0.24502  2.25450
race_ethnicitygroup D                         0.790258    0.24906  3.17298
race_ethnicitygroup E                         1.585667    0.27959  5.67131
parental_level_of_educationbachelor's degree  0.293064    0.22553  1.29945
parental_level_of_educationhigh school       -0.622972    0.19979 -3.11819
parental_level_of_educationmaster's degree    0.447737    0.29147  1.53615
parental_level_of_educationsome college      -0.039996    0.18822 -0.21250
parental_level_of_educationsome high school  -0.395631    0.20183 -1.96020
lunchstandard                                 1.363764    0.13757  9.91297
test_preparation_coursenone                  -0.628179    0.13262 -4.73668
study_hours                                   0.008998    0.02255  0.39903
extracurricularSi                            -0.016189    0.12625 -0.12823
resources_accessMedio                         0.158258    0.15657  1.01076
resources_accessAlto                          0.083685    0.15249  0.54878
institution_typePublica                       0.223477    0.12657  1.76570
student_motivationBaja                        0.010740    0.15364  0.06990
student_motivationMedia                       0.001926    0.15477  0.01245
tutoring_accessSi                            -0.144960    0.12636 -1.14721
tech_resourcesBajo                           -0.389254    0.15548 -2.50362
tech_resourcesMedio                          -0.326339    0.15525 -2.10203

Intercepts:
                                   Value   Std. Error t value
Bajo Rendimiento|Rendimiento medio  0.4570  0.3636     1.2569
Rendimiento medio|Rendimiento alto  3.1107  0.3781     8.2263

Residual Deviance: 1811.756 
AIC: 1859.756 

Coeficientes del Modelo1
Los coeficientes indican el efecto de cada variable en las probabilidades de que un estudiante esté en un nivel superior de rendimiento en matemáticas.

  • gendermale (Coeficiente: 0.6794): Los estudiantes masculinos tienen una mayor probabilidad de estar en un nivel superior de rendimiento en matemáticas en comparación con las estudiantes femeninas.

  • race_ethnicity: Los grupos de etnicidad tienen un impacto significativo en el rendimiento en matemáticas. A medida que se avanza a través de los grupos de etnicidad (de B a E), la probabilidad de estar en un nivel superior de rendimiento aumenta, con el grupo E mostrando el efecto más fuerte. Estos resultados sugieren que la etnicidad puede ser un factor importante en el rendimiento académico.

  • parental_level_of_education: El nivel educativo de los padres tiene un impacto mixto en el rendimiento en matemáticas. Tener un padre con una educación secundaria alta o con algo de secundaria tiene un efecto negativo. En contraste, tener un padre con un título de licenciatura o maestría puede tener un efecto positivo, pero los resultados no siempre son significativos. Esto sugiere que la educación parental puede influir en el rendimiento, pero el efecto no es consistente a través de todos los niveles educativos.

  • resources_access: El acceso a recursos educativos, tanto de nivel medio como alto, muestra un efecto positivo en el rendimiento en matemáticas, pero estos efectos no son estadísticamente significativos. Esto podría indicar que el impacto de los recursos educativos en el rendimiento en matemáticas no es tan fuerte o puede estar enmascarado por otras variables.

  • lunchstandard (Coeficiente: 1.3638): Los estudiantes que reciben almuerzo estándar tienen una mayor probabilidad de mejor rendimiento comparado con los que reciben almuerzo gratuito.

  • test_preparation_coursenone (Coeficiente: -0.6282): No tomar un curso de preparación para exámenes está asociado con una menor probabilidad de mejor rendimiento.

  • study_hours (Coeficiente: 0.0090): Cada hora adicional de estudio tiene un leve aumento en la probabilidad de mejor rendimiento.

  • extracurricular (Coeficiente: -0.0162): Participar en actividades extracurriculares no tiene un impacto significativo en el rendimiento.

  • institution_type: El tipo de institución (pública vs. privada) tiene un pequeño efecto positivo en el rendimiento en matemáticas, y aunque el efecto es marginalmente significativo, puede ser relevante para entender las diferencias en el rendimiento entre tipos de instituciones.

  • student_motivation: La motivación estudiantil, ya sea baja o media, no tiene un efecto significativo en el rendimiento en matemáticas. Esto podría indicar que otros factores pueden tener un impacto más fuerte en el rendimiento, o que la motivación no se mide de manera suficientemente precisa en este modelo.

  • tutoring_access: El acceso a tutoría no tiene un impacto significativo en el rendimiento en matemáticas según el modelo. Puede que la tutoría no sea un factor crucial o que la calidad y frecuencia de la tutoría varíen entre los estudiantes.

  • tech_resources: El acceso a recursos tecnológicos bajos o medios tiene un impacto negativo significativo en el rendimiento en matemáticas. Esto podría indicar que la falta de tecnología adecuada afecta de manera importante la capacidad de los estudiantes para tener un buen rendimiento.


Extraemos los coeficientes del modelo y calculamos los valores p para determinar qué variables son estadísticamente significativas.

# Obtener coeficientes del primer modelo
coeficientes1 <- summary(modelo1)$coefficients

# Crear dataframe con variables, t_value y p_value del primer modelo
resultados1 <- data.frame(
  Variable = rownames(coeficientes1),
  t_value = coeficientes1[, "t value"],
  p_value = 2 * pt(abs(coeficientes1[, "t value"]), df = modelo1$df.residual, lower.tail = FALSE)
)

# Añadir columna de significancia
resultados1$Significativa <- ifelse(resultados1$p_value < 0.05, "Sí", "No")


kable(resultados1, caption = "Resultados del Primer Modelo de Regresión Logística Ordinal")
Resultados del Primer Modelo de Regresión Logística Ordinal
Variable t_value p_value Significativa
gendermale gendermale 5.3255738 0.0000001
race_ethnicitygroup B race_ethnicitygroup B 1.7451799 0.0812686 No
race_ethnicitygroup C race_ethnicitygroup C 2.2545032 0.0243858
race_ethnicitygroup D race_ethnicitygroup D 3.1729752 0.0015561
race_ethnicitygroup E race_ethnicitygroup E 5.6713079 0.0000000
parental_level_of_educationbachelor’s degree parental_level_of_educationbachelor’s degree 1.2994453 0.1940983 No
parental_level_of_educationhigh school parental_level_of_educationhigh school -3.1181924 0.0018730
parental_level_of_educationmaster’s degree parental_level_of_educationmaster’s degree 1.5361453 0.1248272 No
parental_level_of_educationsome college parental_level_of_educationsome college -0.2124966 0.8317641 No
parental_level_of_educationsome high school parental_level_of_educationsome high school -1.9601956 0.0502574 No
lunchstandard lunchstandard 9.9129712 0.0000000
test_preparation_coursenone test_preparation_coursenone -4.7366768 0.0000025
study_hours study_hours 0.3990250 0.6899621 No
extracurricularSi extracurricularSi -0.1282303 0.8979931 No
resources_accessMedio resources_accessMedio 1.0107610 0.3123816 No
resources_accessAlto resources_accessAlto 0.5487809 0.5832814 No
institution_typePublica institution_typePublica 1.7656955 0.0777599 No
student_motivationBaja student_motivationBaja 0.0698990 0.9442884 No
student_motivationMedia student_motivationMedia 0.0124468 0.9900717 No
tutoring_accessSi tutoring_accessSi -1.1472136 0.2515748 No
tech_resourcesBajo tech_resourcesBajo -2.5036179 0.0124556
tech_resourcesMedio tech_resourcesMedio -2.1020322 0.0358065
Bajo Rendimiento|Rendimiento medio Bajo Rendimiento|Rendimiento medio 1.2569309 0.2090797 No
Rendimiento medio|Rendimiento alto Rendimiento medio|Rendimiento alto 8.2262708 0.0000000

Calculamos la precisión del modelo (proporción de predicciones correctas). Esto nos indica qué tan bien el modelo está funcionando.

# Predicción del primer modelo ajustado
prediccion1 <- predict(modelo1, newdata = Student_Data, type = "class")

# Crear matriz de confusión del primer modelo
tabla_conf_ajust1 <- table(Predicción = prediccion1, Realidad = Student_Data$math_score)
tabla_conf_ajust1
                   Realidad
Predicción         Bajo Rendimiento Rendimiento medio Rendimiento alto
  Bajo Rendimiento               145               104                6
  Rendimiento medio              192               362              147
  Rendimiento alto                 1                19               23


El modelo parece estar teniendo dificultades para predecir la categoría “Rendimiento Alto”, ya que no hay ninguna predicción correcta en esta categoría. Esto podría indicar que el modelo no está capturando bien las características que permiten a los estudiantes alcanzar un alto rendimiento.

Además hay confusión entre “Bajo Rendimiento” y “Rendimiento Medio”, así como entre “Rendimiento Medio” y “Rendimiento Alto”. Estos errores indican que el modelo puede estar clasificando incorrectamente a estudiantes en niveles de rendimiento cercanos entre sí.

Esto sugiere que podría ser necesario ajustar el modelo o explorar otras variables para mejorar la precisión de las predicciones.


Calculamos las prediciones para una visión general del desempeño del modelo

# Calcular precisión del primer modelo
precision1 <- sum(diag(tabla_conf_ajust1)) / sum(tabla_conf_ajust1)
paste("Precisión ajustada del primer modelo:", round(precision1 * 100, 2), "%")
[1] "Precisión ajustada del primer modelo: 53.05 %"

Una precisión del 53.05% indica que el modelo está funcionando ligeramente mejor que el azar (en un modelo de clasificación de tres categorías, el azar tendría una precisión del 33.33% si todas las categorías fueran igualmente probables).

Esta precisión sugiere que hay espacio para mejorar el modelo, ya sea ajustando parámetros, añadiendo más variables, o utilizando técnicas adicionales para mejorar el rendimiento.



1.4.1 - Modificación Del Modelo

Para ajustar el modelo, eliminamos variables para ver cómo afecta esto a la precisión y la significancia, esto tomando encuenta las que tengan el p-value mas grande.

1.4.1.1 - Primera Eliminación

Para mejorar AIC y la capacidad predictiva del modelo, lo mejor sería eliminar las variables que tienen p-values más altos, ya que estas variables son menos significativas.

  • resources_accessAlto: p-value = 0.5832814
  • resources_accessMedio: p-value = 0.3123816

Por lo que eliminamos resources_access

# Ajustar el modelo de regresión logística ordinal
modelo2 <- polr(math_score ~  gender + race_ethnicity + parental_level_of_education + lunch + test_preparation_course + study_hours + extracurricular+ institution_type +  student_motivation+ tutoring_access + tech_resources,
                       data = Student_Data, Hess = TRUE)

# Resumen del modelo
summary(modelo2)
Call:
polr(formula = math_score ~ gender + race_ethnicity + parental_level_of_education + 
    lunch + test_preparation_course + study_hours + extracurricular + 
    institution_type + student_motivation + tutoring_access + 
    tech_resources, data = Student_Data, Hess = TRUE)

Coefficients:
                                                  Value Std. Error   t value
gendermale                                    0.6758490    0.12748  5.301477
race_ethnicitygroup B                         0.4477796    0.26180  1.710369
race_ethnicitygroup C                         0.5431889    0.24467  2.220127
race_ethnicitygroup D                         0.7778087    0.24854  3.129541
race_ethnicitygroup E                         1.5802565    0.27909  5.662113
parental_level_of_educationbachelor's degree  0.3033531    0.22514  1.347381
parental_level_of_educationhigh school       -0.6207563    0.19959 -3.110132
parental_level_of_educationmaster's degree    0.4579771    0.29161  1.570507
parental_level_of_educationsome college      -0.0459167    0.18809 -0.244120
parental_level_of_educationsome high school  -0.3999005    0.20165 -1.983149
lunchstandard                                 1.3614429    0.13753  9.898905
test_preparation_coursenone                  -0.6290461    0.13247 -4.748512
study_hours                                   0.0094944    0.02254  0.421272
extracurricularSi                            -0.0091066    0.12602 -0.072264
institution_typePublica                       0.2235088    0.12649  1.766983
student_motivationBaja                        0.0078109    0.15358  0.050858
student_motivationMedia                       0.0007926    0.15474  0.005122
tutoring_accessSi                            -0.1492045    0.12613 -1.182923
tech_resourcesBajo                           -0.3848346    0.15536 -2.477026
tech_resourcesMedio                          -0.3267354    0.15521 -2.105183

Intercepts:
                                   Value   Std. Error t value
Bajo Rendimiento|Rendimiento medio  0.3684  0.3512     1.0491
Rendimiento medio|Rendimiento alto  3.0197  0.3655     8.2630

Residual Deviance: 1812.78 
AIC: 1856.78 

El AIC ha mejorado ligeramente a 1856.78, lo que sugiere que este modelo podría ser ligeramente mejor que el primero.

# Obtener coeficientes del primer modelo
coeficientes2 <- summary(modelo2)$coefficients

# Crear dataframe con variables, t_value y p_value del primer modelo
resultados2 <- data.frame(
  Variable = rownames(coeficientes2),
  t_value = coeficientes2[, "t value"],
  p_value = 2 * pt(abs(coeficientes2[, "t value"]), df = modelo2$df.residual, lower.tail = FALSE)
)

# Añadir columna de significancia
resultados2$Significativa <- ifelse(resultados2$p_value < 0.05, "Sí", "No")


kable(resultados2, caption = "Resultados del segundo Modelo de Regresión Logística Ordinal")
Resultados del segundo Modelo de Regresión Logística Ordinal
Variable t_value p_value Significativa
gendermale gendermale 5.3014769 0.0000001
race_ethnicitygroup B race_ethnicitygroup B 1.7103692 0.0875151 No
race_ethnicitygroup C race_ethnicitygroup C 2.2201273 0.0266390
race_ethnicitygroup D race_ethnicitygroup D 3.1295409 0.0018027
race_ethnicitygroup E race_ethnicitygroup E 5.6621134 0.0000000
parental_level_of_educationbachelor’s degree parental_level_of_educationbachelor’s degree 1.3473811 0.1781699 No
parental_level_of_educationhigh school parental_level_of_educationhigh school -3.1101317 0.0019242
parental_level_of_educationmaster’s degree parental_level_of_educationmaster’s degree 1.5705071 0.1166210 No
parental_level_of_educationsome college parental_level_of_educationsome college -0.2441202 0.8071890 No
parental_level_of_educationsome high school parental_level_of_educationsome high school -1.9831493 0.0476304
lunchstandard lunchstandard 9.8989054 0.0000000
test_preparation_coursenone test_preparation_coursenone -4.7485118 0.0000024
study_hours study_hours 0.4212718 0.6736493 No
extracurricularSi extracurricularSi -0.0722637 0.9424069 No
institution_typePublica institution_typePublica 1.7669829 0.0775433 No
student_motivationBaja student_motivationBaja 0.0508576 0.9594494 No
student_motivationMedia student_motivationMedia 0.0051221 0.9959142 No
tutoring_accessSi tutoring_accessSi -1.1829233 0.2371273 No
tech_resourcesBajo tech_resourcesBajo -2.4770259 0.0134165
tech_resourcesMedio tech_resourcesMedio -2.1051831 0.0355302
Bajo Rendimiento|Rendimiento medio Bajo Rendimiento|Rendimiento medio 1.0490794 0.2944010 No
Rendimiento medio|Rendimiento alto Rendimiento medio|Rendimiento alto 8.2629974 0.0000000
# Predicción del modelo ajustado
prediccion2 <- predict(modelo2, newdata = Student_Data, type = "class")

# Crear matriz de confusión
tabla_conf_ajust2 <- table(Predicción = prediccion2, Realidad = Student_Data$math_score)
tabla_conf_ajust2
                   Realidad
Predicción         Bajo Rendimiento Rendimiento medio Rendimiento alto
  Bajo Rendimiento               143               104                8
  Rendimiento medio              194               366              145
  Rendimiento alto                 1                15               23

El modelo predice el “Bajo Rendimiento” correctamente 143 veces, “Rendimiento medio” correctamente 366 veces, y “Rendimiento alto” 23 veces. Sin embargo, confunde “Rendimiento medio” con “Bajo Rendimiento” en 194 casos y “Rendimiento alto” con “Rendimiento medio” en 145 casos.

# Calcular precisión
precision2 <- sum(diag(tabla_conf_ajust2)) / sum(tabla_conf_ajust2)
paste("Precisión ajustada:", round(precision2 * 100, 2), "%")
[1] "Precisión ajustada: 53.25 %"

La precisión ajustada es de 53.25%, una mejora muy pequeña respecto al primer modelo, dado que ambos modelos parecen tener una precisión relativamente baja, esto sugiere que podría ser necesario seguir ajustando el modelo o explorar otras variables o interacciones para mejorar su capacidad predictiva.


1.4.1.2 - Segunda Eliminación

En este caso, las dos variables con los p-values más altos que no son significativas son:

  • student_motivationMedia con un p-value de 0.9959
  • student_motivationBaja con un p-value de 0.9594
# Ajustar el modelo de regresión logística ordinal
modelo3 <- polr(math_score ~  race_ethnicity + parental_level_of_education + lunch + test_preparation_course + study_hours + extracurricular+ institution_type + tutoring_access + tech_resources,
                       data = Student_Data, Hess = TRUE)

# Resumen del modelo
summary(modelo3)
Call:
polr(formula = math_score ~ race_ethnicity + parental_level_of_education + 
    lunch + test_preparation_course + study_hours + extracurricular + 
    institution_type + tutoring_access + tech_resources, data = Student_Data, 
    Hess = TRUE)

Coefficients:
                                                 Value Std. Error  t value
race_ethnicitygroup B                         0.326077    0.25888  1.25956
race_ethnicitygroup C                         0.415750    0.24165  1.72044
race_ethnicitygroup D                         0.691213    0.24610  2.80870
race_ethnicitygroup E                         1.471001    0.27651  5.31997
parental_level_of_educationbachelor's degree  0.285181    0.22378  1.27438
parental_level_of_educationhigh school       -0.583241    0.19828 -2.94147
parental_level_of_educationmaster's degree    0.407453    0.29208  1.39502
parental_level_of_educationsome college      -0.059277    0.18700 -0.31698
parental_level_of_educationsome high school  -0.387711    0.20059 -1.93289
lunchstandard                                 1.349171    0.13644  9.88818
test_preparation_coursenone                  -0.624134    0.13167 -4.74012
study_hours                                   0.009608    0.02238  0.42939
extracurricularSi                            -0.003941    0.12525 -0.03147
institution_typePublica                       0.225214    0.12540  1.79599
tutoring_accessSi                            -0.136155    0.12526 -1.08700
tech_resourcesBajo                           -0.341412    0.15402 -2.21672
tech_resourcesMedio                          -0.305456    0.15429 -1.97979

Intercepts:
                                   Value   Std. Error t value
Bajo Rendimiento|Rendimiento medio -0.0144  0.3340    -0.0432
Rendimiento medio|Rendimiento alto  2.5778  0.3451     7.4699

Residual Deviance: 1841.408 
AIC: 1879.408 

El AIC de 1879.408 es ligeramente más alto que en el modelo anterior, lo que sugiere que este modelo es un poco menos ajustado, y sigue siendo mejor el modelo2.

# Obtener coeficientes del primer modelo
coeficientes3 <- summary(modelo3)$coefficients

# Crear dataframe con variables, t_value y p_value del primer modelo
resultados3 <- data.frame(
  Variable = rownames(coeficientes3),
  t_value = coeficientes3[, "t value"],
  p_value = 2 * pt(abs(coeficientes3[, "t value"]), df = modelo3$df.residual, lower.tail = FALSE)
)

# Añadir columna de significancia
resultados3$Significativa <- ifelse(resultados3$p_value < 0.05, "Sí", "No")


kable(resultados3, caption = "Resultados del Tercer Modelo de Regresión Logística Ordinal")
Resultados del Tercer Modelo de Regresión Logística Ordinal
Variable t_value p_value Significativa
race_ethnicitygroup B race_ethnicitygroup B 1.2595600 0.2081280 No
race_ethnicitygroup C race_ethnicitygroup C 1.7204373 0.0856687 No
race_ethnicitygroup D race_ethnicitygroup D 2.8087032 0.0050730
race_ethnicitygroup E race_ethnicitygroup E 5.3199665 0.0000001
parental_level_of_educationbachelor’s degree parental_level_of_educationbachelor’s degree 1.2743841 0.2028294 No
parental_level_of_educationhigh school parental_level_of_educationhigh school -2.9414717 0.0033434
parental_level_of_educationmaster’s degree parental_level_of_educationmaster’s degree 1.3950249 0.1633244 No
parental_level_of_educationsome college parental_level_of_educationsome college -0.3169842 0.7513231 No
parental_level_of_educationsome high school parental_level_of_educationsome high school -1.9328941 0.0535371 No
lunchstandard lunchstandard 9.8881780 0.0000000
test_preparation_coursenone test_preparation_coursenone -4.7401167 0.0000025
study_hours study_hours 0.4293851 0.6677374 No
extracurricularSi extracurricularSi -0.0314674 0.9749032 No
institution_typePublica institution_typePublica 1.7959850 0.0728048 No
tutoring_accessSi tutoring_accessSi -1.0869955 0.2773061 No
tech_resourcesBajo tech_resourcesBajo -2.2167189 0.0268712
tech_resourcesMedio tech_resourcesMedio -1.9797921 0.0480063
Bajo Rendimiento|Rendimiento medio Bajo Rendimiento|Rendimiento medio -0.0431933 0.9655563 No
Rendimiento medio|Rendimiento alto Rendimiento medio|Rendimiento alto 7.4698722 0.0000000
# Predicción del modelo ajustado
prediccion3 <- predict(modelo3, newdata = Student_Data, type = "class")

# Crear matriz de confusión
tabla_conf_ajust3 <- table(Predicción = prediccion3, Realidad = Student_Data$math_score)
tabla_conf_ajust3
                   Realidad
Predicción         Bajo Rendimiento Rendimiento medio Rendimiento alto
  Bajo Rendimiento               144               101                6
  Rendimiento medio              194               366              154
  Rendimiento alto                 0                18               16
# Calcular precisión
precision3 <- sum(diag(tabla_conf_ajust3)) / sum(tabla_conf_ajust3)
paste("Precisión ajustada:", round(precision3 * 100, 2), "%")
[1] "Precisión ajustada: 52.65 %"

Aunque este modelo tiene una precisión ajustada ligeramente inferior (52.65%) y un AIC más alto, la eliminación de algunas variables parece haber mantenido un desempeño razonable.

Sin embargo, podría ser necesario considerar más ajustes o exploraciones adicionales para mejorar el rendimiento predictivo.


1.4.1.3 - Tercera Eliminación

  • study_hours (p-value = 0.6677374)
  • extracurricularSi (p-value = 0.9749032)
    Estas dos variables tienen los p-values más altos y no son significativas en el modelo, lo que sugiere que no aportan mucho a la predicción del rendimiento en matemáticas por ello las eliminamos.
# Ajustar el modelo de regresión logística ordinal
modelo4 <- polr(math_score ~  race_ethnicity + parental_level_of_education + lunch + test_preparation_course + institution_type + tutoring_access + tech_resources, data = Student_Data, Hess = TRUE)

# Resumen del modelo
summary(modelo4)
Call:
polr(formula = math_score ~ race_ethnicity + parental_level_of_education + 
    lunch + test_preparation_course + institution_type + tutoring_access + 
    tech_resources, data = Student_Data, Hess = TRUE)

Coefficients:
                                                Value Std. Error t value
race_ethnicitygroup B                         0.33002     0.2587  1.2757
race_ethnicitygroup C                         0.41943     0.2414  1.7375
race_ethnicitygroup D                         0.69317     0.2461  2.8172
race_ethnicitygroup E                         1.47072     0.2760  5.3279
parental_level_of_educationbachelor's degree  0.28306     0.2235  1.2667
parental_level_of_educationhigh school       -0.58250     0.1983 -2.9381
parental_level_of_educationmaster's degree    0.40668     0.2918  1.3937
parental_level_of_educationsome college      -0.06172     0.1869 -0.3302
parental_level_of_educationsome high school  -0.39154     0.2003 -1.9544
lunchstandard                                 1.34640     0.1362  9.8820
test_preparation_coursenone                  -0.62461     0.1316 -4.7452
institution_typePublica                       0.22437     0.1253  1.7899
tutoring_accessSi                            -0.13688     0.1252 -1.0930
tech_resourcesBajo                           -0.34428     0.1537 -2.2400
tech_resourcesMedio                          -0.30773     0.1541 -1.9963

Intercepts:
                                   Value   Std. Error t value
Bajo Rendimiento|Rendimiento medio -0.0690  0.3032    -0.2275
Rendimiento medio|Rendimiento alto  2.5227  0.3148     8.0143

Residual Deviance: 1841.593 
AIC: 1875.593 

El AIC es 1875.593, lo que indica que es un modelo ligeramente más ajustado que el modelo3.

# Obtener coeficientes del primer modelo
coeficientes4 <- summary(modelo4)$coefficients

# Crear dataframe con variables, t_value y p_value del primer modelo
resultados4 <- data.frame(
  Variable = rownames(coeficientes4),
  t_value = coeficientes4[, "t value"],
  p_value = 2 * pt(abs(coeficientes4[, "t value"]), df = modelo4$df.residual, lower.tail = FALSE)
)

# Añadir columna de significancia
resultados4$Significativa <- ifelse(resultados4$p_value < 0.05, "Sí", "No")


kable(resultados4, caption = "Resultados del Cuarto Modelo de Regresión Logística Ordinal")
Resultados del Cuarto Modelo de Regresión Logística Ordinal
Variable t_value p_value Significativa
race_ethnicitygroup B race_ethnicitygroup B 1.2757088 0.2023601 No
race_ethnicitygroup C race_ethnicitygroup C 1.7375482 0.0826040 No
race_ethnicitygroup D race_ethnicitygroup D 2.8171744 0.0049420
race_ethnicitygroup E race_ethnicitygroup E 5.3279107 0.0000001
parental_level_of_educationbachelor’s degree parental_level_of_educationbachelor’s degree 1.2667313 0.2055518 No
parental_level_of_educationhigh school parental_level_of_educationhigh school -2.9380544 0.0033800
parental_level_of_educationmaster’s degree parental_level_of_educationmaster’s degree 1.3937142 0.1637193 No
parental_level_of_educationsome college parental_level_of_educationsome college -0.3301592 0.7413501 No
parental_level_of_educationsome high school parental_level_of_educationsome high school -1.9544280 0.0509341 No
lunchstandard lunchstandard 9.8819753 0.0000000
test_preparation_coursenone test_preparation_coursenone -4.7452232 0.0000024
institution_typePublica institution_typePublica 1.7899417 0.0737713 No
tutoring_accessSi tutoring_accessSi -1.0930073 0.2746587 No
tech_resourcesBajo tech_resourcesBajo -2.2400452 0.0253110
tech_resourcesMedio tech_resourcesMedio -1.9963057 0.0461764
Bajo Rendimiento|Rendimiento medio Bajo Rendimiento|Rendimiento medio -0.2275253 0.8200626 No
Rendimiento medio|Rendimiento alto Rendimiento medio|Rendimiento alto 8.0142676 0.0000000
# Predicción del modelo ajustado
prediccion4 <- predict(modelo4, newdata = Student_Data, type = "class")

# Crear matriz de confusión
tabla_conf_ajust4 <- table(Predicción = prediccion4, Realidad = Student_Data$math_score)
tabla_conf_ajust4
                   Realidad
Predicción         Bajo Rendimiento Rendimiento medio Rendimiento alto
  Bajo Rendimiento               142               101                7
  Rendimiento medio              196               368              153
  Rendimiento alto                 0                16               16
# Calcular precisión
precision4 <- sum(diag(tabla_conf_ajust4)) / sum(tabla_conf_ajust4)
paste("Precisión ajustada:", round(precision4 * 100, 2), "%")
[1] "Precisión ajustada: 52.65 %"

La precisión ajustada del modelo es 52.65%, lo que es igual a la del modelo3, esto sugiere que la eliminación adicional de variables no ha mejorado ni empeorado significativamente la capacidad predictiva del modelo.


1.4.1.4 - Cuarta Eliminación

Eliminamos la variable:
* parental_level_of_education

# Ajustar el modelo de regresión logística ordinal
modelo5 <- polr(formula = math_score ~ race_ethnicity + lunch + test_preparation_course + 
                 institution_type + tutoring_access + tech_resources, 
                 data = Student_Data, Hess = TRUE)

# Resumen del modelo
summary(modelo5)
Call:
polr(formula = math_score ~ race_ethnicity + lunch + test_preparation_course + 
    institution_type + tutoring_access + tech_resources, data = Student_Data, 
    Hess = TRUE)

Coefficients:
                              Value Std. Error t value
race_ethnicitygroup B        0.3196     0.2569   1.244
race_ethnicitygroup C        0.4685     0.2389   1.961
race_ethnicitygroup D        0.7486     0.2437   3.072
race_ethnicitygroup E        1.5400     0.2732   5.636
lunchstandard                1.3068     0.1350   9.679
test_preparation_coursenone -0.6307     0.1302  -4.842
institution_typePublica      0.2197     0.1243   1.767
tutoring_accessSi           -0.1530     0.1243  -1.231
tech_resourcesBajo          -0.3313     0.1526  -2.171
tech_resourcesMedio         -0.2866     0.1511  -1.896

Intercepts:
                                   Value   Std. Error t value
Bajo Rendimiento|Rendimiento medio  0.0995  0.2709     0.3673
Rendimiento medio|Rendimiento alto  2.6424  0.2850     9.2722

Residual Deviance: 1865.565 
AIC: 1889.565 

El AIC para el modelo es 1889.565. Este valor indica que el modelo tiene una capacidad de ajuste ligeramente peor en comparación con el Modelo4.

# Obtener coeficientes del primer modelo
coeficientes5 <- summary(modelo5)$coefficients

# Crear dataframe con variables, t_value y p_value del primer modelo
resultados5 <- data.frame(
  Variable = rownames(coeficientes5),
  t_value = coeficientes5[, "t value"],
  p_value = 2 * pt(abs(coeficientes5[, "t value"]), df = modelo5$df.residual, lower.tail = FALSE)
)

# Añadir columna de significancia
resultados5$Significativa <- ifelse(resultados5$p_value < 0.05, "Sí", "No")


kable(resultados5, caption = "Resultados del Quinto Modelo de Regresión Logística Ordinal")
Resultados del Quinto Modelo de Regresión Logística Ordinal
Variable t_value p_value Significativa
race_ethnicitygroup B race_ethnicitygroup B 1.2438160 0.2138626 No
race_ethnicitygroup C race_ethnicitygroup C 1.9605772 0.0502093 No
race_ethnicitygroup D race_ethnicitygroup D 3.0716043 0.0021875
race_ethnicitygroup E race_ethnicitygroup E 5.6360722 0.0000000
lunchstandard lunchstandard 9.6794893 0.0000000
test_preparation_coursenone test_preparation_coursenone -4.8424785 0.0000015
institution_typePublica institution_typePublica 1.7669385 0.0775475 No
tutoring_accessSi tutoring_accessSi -1.2312771 0.2185126 No
tech_resourcesBajo tech_resourcesBajo -2.1713413 0.0301430
tech_resourcesMedio tech_resourcesMedio -1.8961833 0.0582276 No
Bajo Rendimiento|Rendimiento medio Bajo Rendimiento|Rendimiento medio 0.3673244 0.7134558 No
Rendimiento medio|Rendimiento alto Rendimiento medio|Rendimiento alto 9.2722245 0.0000000
# Predicción del modelo ajustado
prediccion5 <- predict(modelo5, newdata = Student_Data, type = "class")

# Crear matriz de confusión
tabla_conf_ajust5 <- table(Predicción = prediccion5, Realidad = Student_Data$math_score)
tabla_conf_ajust5
                   Realidad
Predicción         Bajo Rendimiento Rendimiento medio Rendimiento alto
  Bajo Rendimiento               143               100                7
  Rendimiento medio              194               375              153
  Rendimiento alto                 1                10               16
# Calcular precisión
precision5 <- sum(diag(tabla_conf_ajust5)) / sum(tabla_conf_ajust5)
paste("Precisión ajustada:", round(precision5 * 100, 2), "%")
[1] "Precisión ajustada: 53.45 %"

La precisión ajustada del modelo es 53.45%, lo que muestra una ligera mejora respecto a los demas Modelos, sugiriendo que la simplificación adicional de variables ha tenido un pequeño impacto positivo en la capacidad predictiva del modelo.


1.4.1.5 - Quinta Eliminación

Eliminamos la variable:
* tutoring_access

# Ajustar el modelo de regresión logística ordinal
modelo6 <- polr(formula = math_score ~ race_ethnicity + lunch + test_preparation_course + 
                 institution_type  + tech_resources, 
                 data = Student_Data, Hess = TRUE)

# Resumen del modelo
summary(modelo6)
Call:
polr(formula = math_score ~ race_ethnicity + lunch + test_preparation_course + 
    institution_type + tech_resources, data = Student_Data, Hess = TRUE)

Coefficients:
                              Value Std. Error t value
race_ethnicitygroup B        0.2981     0.2562   1.164
race_ethnicitygroup C        0.4520     0.2384   1.896
race_ethnicitygroup D        0.7292     0.2430   3.001
race_ethnicitygroup E        1.5145     0.2723   5.561
lunchstandard                1.3047     0.1349   9.672
test_preparation_coursenone -0.6198     0.1299  -4.773
institution_typePublica      0.2219     0.1243   1.785
tech_resourcesBajo          -0.3309     0.1525  -2.170
tech_resourcesMedio         -0.2900     0.1511  -1.919

Intercepts:
                                   Value   Std. Error t value
Bajo Rendimiento|Rendimiento medio  0.1677  0.2652     0.6326
Rendimiento medio|Rendimiento alto  2.7076  0.2802     9.6631

Residual Deviance: 1867.082 
AIC: 1889.082 
# Obtener coeficientes del primer modelo
coeficientes6 <- summary(modelo6)$coefficients

# Crear dataframe con variables, t_value y p_value del primer modelo
resultados6 <- data.frame(
  Variable = rownames(coeficientes6),
  t_value = coeficientes6[, "t value"],
  p_value = 2 * pt(abs(coeficientes6[, "t value"]), df = modelo6$df.residual, lower.tail = FALSE)
)

# Añadir columna de significancia
resultados6$Significativa <- ifelse(resultados6$p_value < 0.05, "Sí", "No")

kable(resultados6, caption = "Resultados del Sexto Modelo de Regresión Logística Ordinal")
Resultados del Sexto Modelo de Regresión Logística Ordinal
Variable t_value p_value Significativa
race_ethnicitygroup B race_ethnicitygroup B 1.1638213 0.2447774 No
race_ethnicitygroup C race_ethnicitygroup C 1.8956468 0.0582984 No
race_ethnicitygroup D race_ethnicitygroup D 3.0006055 0.0027621
race_ethnicitygroup E race_ethnicitygroup E 5.5611462 0.0000000
lunchstandard lunchstandard 9.6720223 0.0000000
test_preparation_coursenone test_preparation_coursenone -4.7726888 0.0000021
institution_typePublica institution_typePublica 1.7853404 0.0745128 No
tech_resourcesBajo tech_resourcesBajo -2.1704007 0.0302141
tech_resourcesMedio tech_resourcesMedio -1.9193523 0.0552275 No
Bajo Rendimiento|Rendimiento medio Bajo Rendimiento|Rendimiento medio 0.6325566 0.5271696 No
Rendimiento medio|Rendimiento alto Rendimiento medio|Rendimiento alto 9.6631218 0.0000000
# Predicción del modelo ajustado
prediccion6 <- predict(modelo6, newdata = Student_Data, type = "class")

# Crear matriz de confusión
tabla_conf_ajust6 <- table(Predicción = prediccion6, Realidad = Student_Data$math_score)
tabla_conf_ajust6
                   Realidad
Predicción         Bajo Rendimiento Rendimiento medio Rendimiento alto
  Bajo Rendimiento               137               101                8
  Rendimiento medio              201               376              158
  Rendimiento alto                 0                 8               10
# Calcular precisión
precision6 <- sum(diag(tabla_conf_ajust6)) / sum(tabla_conf_ajust6)
paste("Precisión ajustada:", round(precision6 * 100, 2), "%")
[1] "Precisión ajustada: 52.35 %"

La precisión de este modelo es la más baja entre todos los modelos, indicando que su capacidad para clasificar correctamente es menor.


1.4.1.6 - Sexta Eliminación

Eliminamos la variable:
* race_ethnicity

# Ajustar el modelo de regresión logística ordinal
modelo7 <- polr(formula = math_score ~  + lunch + test_preparation_course + institution_type  + tech_resources, 
                 data = Student_Data, Hess = TRUE)

# Resumen del modelo
summary(modelo7)
Call:
polr(formula = math_score ~ +lunch + test_preparation_course + 
    institution_type + tech_resources, data = Student_Data, Hess = TRUE)

Coefficients:
                              Value Std. Error t value
lunchstandard                1.3243     0.1335   9.916
test_preparation_coursenone -0.6329     0.1287  -4.918
institution_typePublica      0.2035     0.1229   1.656
tech_resourcesBajo          -0.3378     0.1513  -2.233
tech_resourcesMedio         -0.3240     0.1497  -2.164

Intercepts:
                                   Value   Std. Error t value
Bajo Rendimiento|Rendimiento medio -0.4241  0.1677    -2.5291
Rendimiento medio|Rendimiento alto  2.0239  0.1800    11.2442

Residual Deviance: 1912.441 
AIC: 1926.441 

El AIC del modelo es 1926.441, que es más alto en comparación con los modelos anteriores. Esto sugiere que el modelo podría estar sobreajustado a las pocas variables que quedan.

# Obtener coeficientes del primer modelo
coeficientes7 <- summary(modelo7)$coefficients

# Crear dataframe con variables, t_value y p_value del primer modelo
resultados7 <- data.frame(
  Variable = rownames(coeficientes7),
  t_value = coeficientes7[, "t value"],
  p_value = 2 * pt(abs(coeficientes7[, "t value"]), df = modelo7$df.residual, lower.tail = FALSE)
)

# Añadir columna de significancia
resultados7$Significativa <- ifelse(resultados7$p_value < 0.05, "Sí", "No")

kable(resultados7, caption = "Resultados del Septimo Modelo de Regresión Logística Ordinal")
Resultados del Septimo Modelo de Regresión Logística Ordinal
Variable t_value p_value Significativa
lunchstandard lunchstandard 9.916287 0.0000000
test_preparation_coursenone test_preparation_coursenone -4.917954 0.0000010
institution_typePublica institution_typePublica 1.656349 0.0979673 No
tech_resourcesBajo tech_resourcesBajo -2.233105 0.0257644
tech_resourcesMedio tech_resourcesMedio -2.163795 0.0307182
Bajo Rendimiento|Rendimiento medio Bajo Rendimiento|Rendimiento medio -2.529120 0.0115889
Rendimiento medio|Rendimiento alto Rendimiento medio|Rendimiento alto 11.244239 0.0000000
# Predicción del modelo ajustado
prediccion7 <- predict(modelo7, newdata = Student_Data, type = "class")

# Crear matriz de confusión
tabla_conf_ajust7 <- table(Predicción = prediccion7, Realidad = Student_Data$math_score)
tabla_conf_ajust7
                   Realidad
Predicción         Bajo Rendimiento Rendimiento medio Rendimiento alto
  Bajo Rendimiento               139               108               11
  Rendimiento medio              199               377              165
  Rendimiento alto                 0                 0                0
# Calcular precisión
precision7 <- sum(diag(tabla_conf_ajust7)) / sum(tabla_conf_ajust7)
paste("Precisión ajustada:", round(precision7 * 100, 2), "%")
[1] "Precisión ajustada: 51.65 %"

La precisión ajustada es 51.65%, que muestra una disminución en comparación con los demás modelos. Esto indica una ligera reducción en la capacidad predictiva del modelo.


1.4.1.7 - Septima Eliminación

Eliminamos la variable:
* institution_type

# Ajustar el modelo de regresión logística ordinal
modelo8 <- polr(formula = math_score ~ lunch + test_preparation_course
                  + tech_resources, 
                 data = Student_Data, Hess = TRUE)

# Resumen del modelo
summary(modelo8)
Call:
polr(formula = math_score ~ lunch + test_preparation_course + 
    tech_resources, data = Student_Data, Hess = TRUE)

Coefficients:
                              Value Std. Error t value
lunchstandard                1.3148     0.1332   9.868
test_preparation_coursenone -0.6232     0.1285  -4.851
tech_resourcesBajo          -0.3345     0.1512  -2.212
tech_resourcesMedio         -0.3154     0.1496  -2.109

Intercepts:
                                   Value   Std. Error t value
Bajo Rendimiento|Rendimiento medio -0.5235  0.1565    -3.3444
Rendimiento medio|Rendimiento alto  1.9189  0.1677    11.4405

Residual Deviance: 1915.189 
AIC: 1927.189 

El AIC del modelo es 1927.189, que es un poco más alto en comparación con el Modelo 7 (1926.441). Esto sugiere que el modelo podría estar sobreajustado. Y en cuestion de AIC el Modelo2 tiene el más bajo.

# Obtener coeficientes del primer modelo
coeficientes8 <- summary(modelo8)$coefficients

# Crear dataframe con variables, t_value y p_value del primer modelo
resultados8 <- data.frame(
  Variable = rownames(coeficientes8),
  t_value = coeficientes8[, "t value"],
  p_value = 2 * pt(abs(coeficientes8[, "t value"]), df = modelo8$df.residual, lower.tail = FALSE)
)

# Añadir columna de significancia
resultados8$Significativa <- ifelse(resultados8$p_value < 0.05, "Sí", "No")

kable(resultados8, caption = "Resultados del Octavo Modelo de Regresión Logística Ordinal")
Resultados del Octavo Modelo de Regresión Logística Ordinal
Variable t_value p_value Significativa
lunchstandard lunchstandard 9.868016 0.0000000
test_preparation_coursenone test_preparation_coursenone -4.850617 0.0000014
tech_resourcesBajo tech_resourcesBajo -2.211552 0.0272247
tech_resourcesMedio tech_resourcesMedio -2.108926 0.0352008
Bajo Rendimiento|Rendimiento medio Bajo Rendimiento|Rendimiento medio -3.344439 0.0008553
Rendimiento medio|Rendimiento alto Rendimiento medio|Rendimiento alto 11.440454 0.0000000
# Predicción del modelo ajustado
prediccion8 <- predict(modelo8, newdata = Student_Data, type = "class")

# Crear matriz de confusión
tabla_conf_ajust8 <- table(Predicción = prediccion8, Realidad = Student_Data$math_score)
tabla_conf_ajust8
                   Realidad
Predicción         Bajo Rendimiento Rendimiento medio Rendimiento alto
  Bajo Rendimiento               146               107               12
  Rendimiento medio              192               378              164
  Rendimiento alto                 0                 0                0
# Calcular precisión
precision8 <- sum(diag(tabla_conf_ajust8)) / sum(tabla_conf_ajust8)
paste("Precisión ajustada:", round(precision8 * 100, 2), "%")
[1] "Precisión ajustada: 52.45 %"

La precisión ajustada es 52.45%, una ligera mejora en comparación con el Modelo 7 (51.65%), indicando que la capacidad predictiva ha mejorado ligeramente, pero aún es inferior a los modelos con mayor precisión.


1.4.2 Comparaciones

# Extraer el AIC de cada modelo
aic_modelo1 <- AIC(modelo1)
aic_modelo2 <- AIC(modelo2)
aic_modelo3 <- AIC(modelo3)
aic_modelo4 <- AIC(modelo4)
aic_modelo5 <- AIC(modelo5)
aic_modelo6 <- AIC(modelo6)
aic_modelo7 <- AIC(modelo7)
aic_modelo8 <- AIC(modelo8)

# Crear un dataframe para almacenar los AIC
resultados_aic <- data.frame(
  Modelo = c("Modelo1", "Modelo2", "Modelo3", "Modelo4", "Modelo5", "Modelo6", "Modelo7", "Modelo8"),
  AIC = c(aic_modelo1, aic_modelo2, aic_modelo3, aic_modelo4, aic_modelo5, aic_modelo6, aic_modelo7, aic_modelo8)
)

# Ver los resultados
resultados_aic
   Modelo      AIC
1 Modelo1 1859.756
2 Modelo2 1856.780
3 Modelo3 1879.408
4 Modelo4 1875.593
5 Modelo5 1889.565
6 Modelo6 1889.082
7 Modelo7 1926.441
8 Modelo8 1927.189

Podemos observar que el mejor AIC lo tiene el Modelo2, seguido del Modelo1, cabe de mencionar que el Modelo8 si bien tiene un AIC mas grande, todas sus variables son significativas.

# Crear un dataframe para almacenar las precisiones
resultados <- data.frame(
  Modelo = c("Modelo1", "Modelo2", "Modelo3", "Modelo4", "Modelo5", "Modelo6", "Modelo7", "Modelo8"),
  Precisión = c(precision1, precision2, precision3, precision4, precision5, precision6, precision7, precision8)
)

# Ver los resultados
resultados
   Modelo Precisión
1 Modelo1 0.5305305
2 Modelo2 0.5325325
3 Modelo3 0.5265265
4 Modelo4 0.5265265
5 Modelo5 0.5345345
6 Modelo6 0.5235235
7 Modelo7 0.5165165
8 Modelo8 0.5245245

Mejor Precisión: El Modelo2 (53.25%) y El Modelo5 (53.45%) tienen las mejores precisiones, siendo los más efectivos en la clasificación de rendimiento en matemáticas.

Peor Precisión: El Modelo7 (51.65%) muestra la menor precisión, sugiriendo que puede ser el menos efectivo para el objetivo de predicción.


1.4.3 Sugerencias

La precisión relativamente baja indica que el modelo actual puede no estar capturando toda la complejidad de los datos. Problemas como la multicolinealidad, el desequilibrio en las clases y la sensibilidad a outliers también pueden estar afectando el rendimiento, por ello se sugiere:

  • Crear nuevas variables y aplicar transformaciones si es necesario.
  • Balancear las clases si hay desequilibrio.
  • Eliminar variables no significativas y evaluar interacciones entre variables.