Regresión Logística Ordinal

Author

Josselyn Flores

Published

August 11, 2024

La regresión ordinal permite dar forma a la dependencia de una respuesta ordinal politómica sobre un conjunto de predictores, que pueden ser factores o covariables.

El análisis de regresión lineal ordinario implica minimizar las diferencias de la suma de los cuadrados entre una variable de respuesta (la dependiente) y una combinación ponderada de las variables predictoras (las independientes). Los coeficientes estimados reflejan cómo los cambios en los predictores afectan a la respuesta. Se considera que la respuesta es numérica, en el sentido en que los cambios en el nivel de la respuesta son equivalentes en todo el rango de la respuesta.

Por ejemplo la regresión ordinal podría utilizarse para estudiar la reacción de los pacientes con respecto a una dosis de un fármaco. Las reacciones posibles podrían clasificarse como ningunaligeramoderada o grave. La diferencia entre una reacción ligera y una moderada es difícil o imposible de cuantificar y se basa en la apreciación. Además, la diferencia entre una respuesta ligera y una moderada podría ser superior o inferior a la diferencia entre una respuesta moderada y una grave.

Caracteristícas del modelo logístico

  • Los modelos logístico ordinales trabajan con las probabilidades acumuladas de \(Y\) cuando tiene \(k=n\) categorías.

  • Estos modelos buscan identificar cuál es la probabilidad acumulada de estar en diferentes combinaciones de categorías para la variable explicada (\(Y\)).

    \[ FK_k=P(Y_ki) \]

  • Estas probabilidades están condicionadas por la influencia de \(X\).

    \[ F_k(X)=P(Y_ki|X) \]

  • Las probabilidades son calculadas a partir de la razón de momios (odds).

    \[ \dfrac{F_k(X)}{1-F_k(X)} \]

  • Transformación de los odds a unidades logarítmicas para el cálculo de probabilidades.

    \[ logit(F_k(X)=\dfrac{log(F_k(X))}{1-F_k(X)} \]

Ecuación del modelo de regresión logistística ordinal

\(L_k(X)=log⁡\left(\dfrac{Fk(X)}{1−Fk(X)}\right)=αk−β_1X_1−β_2X_2...β_kX_k\)

  • Los signos negativos entre coeficientes son importantes en este tipo de modelos.

  • Se construirán \(k−1\) ecuaciones en total, por tanto hay \(αk\) interceptos.

  • Para todas las \(k−1\) ecuaciones, todos los coeficientes adoptan los mismos valores.

Razón del signo negativo en la ecuación:

  • Una vez que se inserta el signo negativo, una pendiente positiva \(β\) implica que mayores valores de X está asociado con un incremento en los odds de una categoría de respuesta mayor de \(Y\), en vez de una categoría de respuesta menos de \(Y\).

  • Esto facilita la interpretación de \(β\).

Consideraciones para los datos.

Datos. Se asume que la variable dependiente es ordinal y puede ser numérica o de cadena. El orden se determina al clasificar los valores de la variable dependiente en orden ascendente. El valor inferior define la primera categoría. Se asume que las variables de factor son categóricas. Las covariables deben ser numéricas.

Supuestos. Sólo se permite una variable de respuesta y debe especificarse. Además, para cada patrón distinto de valores en las variables independientes, se supone que las respuestas son variables multinomiales independientes.

Ejemplo aplicado

Para ejemplificar la aplicación del modelo de regresión logistica ordinal, se cuenta con una base de una encuesta realizada en un restaruante, en donde se les cosnulta los niveles de aceptacion de cada persona con la atencion en dicho restaurante y la satisfaccion en ciertas caracteristicas del mismo.

Importación de librería

En primer paso se tiene que importar la librería necesaria para el tratamiento de los datos

library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.2     ✔ readr     2.1.4
✔ forcats   1.0.0     ✔ stringr   1.5.0
✔ ggplot2   3.4.2     ✔ tibble    3.2.1
✔ lubridate 1.9.2     ✔ tidyr     1.3.0
✔ purrr     1.0.1     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(MASS)

Attaching package: 'MASS'

The following object is masked from 'package:dplyr':

    select
library(haven)
library(descr)
Warning: package 'descr' was built under R version 4.3.3
library (brant)
Warning: package 'brant' was built under R version 4.3.3
library(VGAM)
Warning: package 'VGAM' was built under R version 4.3.3
Loading required package: stats4
Loading required package: splines

Exploración de la base

datos <- read.csv("C:\\Users\\DELL\\Documents\\seminario 1\\Base Formulario.csv",sep = ";")
head(datos)
  Genero edad economia ubicacion instalaciones tiempo atencion calidad precio
1      1   24        2         7             9      5        5       4      4
2      1   24        2         8             8     30        4       4      4
3      1   22        2         5             7     40        4       4      4
4      1   32        2         5             5     20        3       3      3
5      2   26        1         9             8     20        4       4      4
6      1   31        2         9             5     15        3       3      4
  expectativa satisfaccion
1           4            4
2           4            4
3           4            4
4           3            3
5           4            4
6           3            3
str(datos)
'data.frame':   78 obs. of  11 variables:
 $ Genero       : int  1 1 1 1 2 1 2 1 1 1 ...
 $ edad         : int  24 24 22 32 26 31 23 20 23 20 ...
 $ economia     : int  2 2 2 2 1 2 2 2 2 2 ...
 $ ubicacion    : int  7 8 5 5 9 9 8 7 4 10 ...
 $ instalaciones: int  9 8 7 5 8 5 9 7 4 8 ...
 $ tiempo       : int  5 30 40 20 20 15 20 10 20 10 ...
 $ atencion     : int  5 4 4 3 4 3 5 4 4 4 ...
 $ calidad      : int  4 4 4 3 4 3 4 4 3 4 ...
 $ precio       : int  4 4 4 3 4 4 2 4 4 4 ...
 $ expectativa  : int  4 4 4 3 4 3 1 4 3 4 ...
 $ satisfaccion : int  4 4 4 3 4 3 1 4 3 4 ...

Las variables estan codificadas con escala likert y tienen una codificación numérica la cual estará asignada de la siguiente manera:

  • Femenino (0), Masculino (1)

  • Si (1), No (2)

  • Excelente (5), Muy Bueno (4), Bueno (3), Regular (2) y malo (1).

Como se ve al principio las variables estan identificadas como una variable entera, entonces se tomaran las variables de interes (satisfaccion, tiempo, atencion, calidad, presio y expectativa)y se convertirán a factores.

datos$satisfaccion= as.factor(datos $ satisfaccion)
datos$atencion= as.factor(datos $ atencion)
datos$calidad= as.factor(datos $ calidad)
datos$precio= as.factor(datos $ precio)
datos$expectativa= as.factor(datos $ expectativa)

También se requiere indicarle a R que la variable Y es de tipo ordinal, o que sus categorías están ordenadas. Para ello se usa el comando as.ordered()

datos$satisfaccion= as.ordered((datos$satisfaccion))
datos$atencion= as.ordered(datos $ atencion)
datos$calidad= as.ordered(datos $ calidad)
datos$precio= as.ordered(datos $ precio)
datos$expectativa= as.ordered(datos $ expectativa)

Tras la ordenación, se identifica que el orden reconocido es “1”<“2”<“3”<“4”, pero se debe invertir de manera que quede “4”<“3”<“2”<“1”. Para ello se usa el argumento rev dentro del comando levels()

datos$satisfaccion <- factor(datos $ satisfaccion, levels = rev(levels(datos $ satisfaccion)))
datos$atencion= factor(datos $ atencion, levels = rev(levels(datos $ atencion)))
datos$calidad= factor(datos $ calidad, levels = rev(levels(datos $ calidad)))
datos$precio= factor(datos $ precio, levels = rev(levels(datos $ precio)))
datos$expectativa= factor(datos $ expectativa, levels = rev(levels(datos $ expectativa)))

Una vez creadas y ordenadas las variables se procede a hacer el modelo para aplicar el modelo, se predecirá la satisfacción que sera la variable dependiente, con la variables de precio, atención, calidad, expectativa

Prueba de independiencia

Para al aplicación correcta del modelose revisa la asociación entre ambas variables mediante una tabla de contigencia de cada variable independiente con la variable dependiente, y realizar una prueba de independencia, la cual en el caso se estará aplicando la prueba de chi-cuadrado

tabla0=table(datos $ satisfaccion, datos $calidad) 
tabla1 <- table(datos $ satisfaccion, datos $precio) 
tabla2=table (datos $ satisfaccion, datos $calidad) 
tabla3= table(datos $ satisfaccion, datos $expectativa) 

chisq.test(tabla0)
Warning in chisq.test(tabla0): Chi-squared approximation may be incorrect

    Pearson's Chi-squared test

data:  tabla0
X-squared = 75.77, df = 12, p-value = 2.627e-11
chisq.test(tabla1)
Warning in chisq.test(tabla1): Chi-squared approximation may be incorrect

    Pearson's Chi-squared test

data:  tabla1
X-squared = 69.902, df = 16, p-value = 1.038e-08
chisq.test(tabla2)
Warning in chisq.test(tabla2): Chi-squared approximation may be incorrect

    Pearson's Chi-squared test

data:  tabla2
X-squared = 75.77, df = 12, p-value = 2.627e-11
chisq.test(tabla3)
Warning in chisq.test(tabla3): Chi-squared approximation may be incorrect

    Pearson's Chi-squared test

data:  tabla3
X-squared = 164.25, df = 16, p-value < 2.2e-16

A partir de los resultados y el “p-value” se puede rechazar la \(H0\) (las variables son independientes), y se acepta que existe asociación estadística entre ambas variables.

Generación del modelo

polr() es una función de la librería MASS que ajusta modelos de regresión para variables respuesta con distribución ordinal, con funciones enlace logit o probit. Es importante tener en cuenta que esta función usa una parametrización que implica que los odds ratio son de estar en una categoría superior.

modelo1 <- polr(satisfaccion ~ atencion +precio+calidad+expectativa, data = datos, Hess = TRUE, na.action = na.omit, method = "logistic")
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
summary(modelo1)
Call:
polr(formula = satisfaccion ~ atencion + precio + calidad + expectativa, 
    data = datos, na.action = na.omit, Hess = TRUE, method = "logistic")

Coefficients:
                Value Std. Error t value
atencion.L     2.8206     1.2916  2.1838
atencion.Q    -0.2979     0.9458 -0.3149
atencion.C     0.9298     0.7901  1.1768
precio.L       7.6911     2.2724  3.3846
precio.Q       6.5695     2.1164  3.1042
precio.C       3.0773     1.6840  1.8273
precio^4      -0.8304     1.0141 -0.8189
calidad.L     -1.6150     2.1884 -0.7380
calidad.Q     -1.1141     1.2828 -0.8685
calidad.C      0.1020     0.8300  0.1228
expectativa.L 13.3714     2.6207  5.1022
expectativa.Q -1.9991     1.3924 -1.4358
expectativa.C -1.5637     1.3893 -1.1256
expectativa^4 -0.1287     0.8061 -0.1597

Intercepts:
    Value   Std. Error t value
5|4 -9.0511  1.5854    -5.7089
4|3 -3.4259  1.1247    -3.0462
3|2  1.2453  0.9467     1.3154
2|1  3.7683  0.9869     3.8184

Residual Deviance: 86.59954 
AIC: 122.5995 

Una de las limitaciones del comando polr() es que no arroja los valores del “p-value”, para ello se deben calcular aparte

tabla_c <- coef(summary(modelo1))
p <- pnorm(abs(tabla_c[, "t value"]), lower.tail = FALSE) * 2
tabla_c <- cbind(tabla_c, "p value" = p)
tabla_c
                   Value Std. Error    t value      p value
atencion.L     2.8206094  1.2916338  2.1837531 2.898039e-02
atencion.Q    -0.2978686  0.9458051 -0.3149365 7.528098e-01
atencion.C     0.9297607  0.7900911  1.1767766 2.392847e-01
precio.L       7.6911135  2.2723701  3.3846218 7.127639e-04
precio.Q       6.5695362  2.1163547  3.1041754 1.908102e-03
precio.C       3.0772625  1.6840119  1.8273401 6.764864e-02
precio^4      -0.8303771  1.0140606 -0.8188634 4.128643e-01
calidad.L     -1.6149858  2.1884073 -0.7379731 4.605308e-01
calidad.Q     -1.1141264  1.2827702 -0.8685315 3.851034e-01
calidad.C      0.1019574  0.8300116  0.1228385 9.022350e-01
expectativa.L 13.3714160  2.6207322  5.1021681 3.357843e-07
expectativa.Q -1.9991079  1.3923636 -1.4357658 1.510690e-01
expectativa.C -1.5636730  1.3892508 -1.1255512 2.603555e-01
expectativa^4 -0.1287342  0.8061397 -0.1596922 8.731236e-01
5|4           -9.0510751  1.5854334 -5.7088965 1.137110e-08
4|3           -3.4259047  1.1246561 -3.0461798 2.317692e-03
3|2            1.2452639  0.9466531  1.3154386 1.883626e-01
2|1            3.7683348  0.9868920  3.8183863 1.343275e-04

Intervalos de confianza

ci <- confint(modelo1)
Waiting for profiling to be done...
ci
                   2.5 %     97.5 %
atencion.L     0.3462795  5.5041087
atencion.Q    -2.2297051  1.5528483
atencion.C    -0.5821010  2.5534334
precio.L       3.4938801 12.5673605
precio.Q       2.6373140 11.0815590
precio.C      -0.2101772  6.5735701
precio^4      -2.9736938  1.1878810
calidad.L     -5.9846884  2.7198065
calidad.Q     -3.6943164  1.4405346
calidad.C     -1.5293895  1.7527010
expectativa.L  8.7458235 19.2827727
expectativa.Q -4.8951930  0.7231114
expectativa.C -4.3838880  1.1448335
expectativa^4 -1.7597741  1.4624556

A partir de los resultados anteriores se observan las siguientes caracteristicas:

  • Se obtienen 4 interceptos para los cuales se tendrá los \(α\) para las ecuaciones, como han resultado 4 interceptos se tendran 4 ecuaciones en cuestión

  • En los resultados podemos identificar las categoria de referencia para cada variable, por ejemplo se tiene que la variable de referencia para la categoria 5 de la variable atención es la de referencia, y del mismo modo es para la variable precio, calidad y expectativa.

  • Tambien se observa que en la salidas hay categorias que no se toman en cuenta debido a que no hay respuestas de esa indole, por ejemplo la categoria 1, de la atención, que corresponde a la respuesta de atención mala, no tiene salida en el codigo, por la misma razón que no hay respuestas registradas.

  • Los coeficientes de regresión \(β\) son estadísticamente significativos para las 5 categorías evaluadas

Ecuaciones de Regresión del modelo

Es importante recordar que estos modelos crearán varias ecuaciones de regresión, según la cantidad de \(k−1\) categorías.

Ecuaciones:

\[logit(\bar P(Y<5))=-9.05-2.82(X1_{k=4})+0.30(X1_{k=3})-0.93(X1_{k=2}) -7.69(X2_{k=4})−6.57(X2_{k=3})−3.08(X2_{k=2})+0.83(X2_{k=1})+ 1.61(X3_{k=4})+1.11(X3_{k=3})−0.10(X3_{k=2}) -13.37(X4_{k=4})+2.0(X4_{k=3})+1.56(X4_{k=2})+0.13(X4_{k=1})\]

\[logit(\bar P(Y<4))=-3.43-2.82(X1_{k=4})+0.30(X1_{k=3})-0.93(X1_{k=2}) -7.69(X2_{k=4})−6.57(X2_{k=3})−3.08(X2_{k=2})+0.83(X2_{k=1})+ 1.61(X3_{k=4})+1.11(X3_{k=3})−0.10(X3_{k=2}) -13.37(X4_{k=4})+2.0(X4_{k=3})+1.56(X4_{k=2})+0.13(X4_{k=1})\]

\[logit(\bar P(Y<3))=1.24-2.82(X1_{k=4})+0.30(X1_{K=3})-0.93(X1_{k=2})-7.69(X2_{k=4})−6.57(X2\_{k=3})−3.08(X2_{k=2})+0.83(X2_{k=1})+ 1.61(X3_{k=4})+1.11(X3_{k=3})−0.10(X3_{k=2})-13.37(X4_{k=4})+2.0(X4_{k=3})+1.56(X4_{k=2})+0.13(X4_{k=1})\]

\[logit(\bar P(Y<2))=3.77-2.82(X1_{k=4})+0.30(X1_{K=3})-0.93(X1_{K=2})-7.69(X2_{k=4})−6.57(X2_{k=3})−3.08(X2_{k=2})+0.83(X2_{k=1})+ 1.61(X3_{k=4})+1.11(X3_{k=3})−0.10(X3_{k=2}) -13.37(X4_{k=4})+2.0(X4_{k=3})+1.56(X4_{k=2})+0.13(X4_{k=1})\]

Interpretación de los coeficientes de regresión \(β\)en unidades logarítmicas.

Para la variable de Atención en el restaurante \(X1\)

Con un nivel de confianza del 95%, se espera un aumento de 2.82 unidades de log odds en la satisfacción, para aquellas personas que están opinan que la atención muy buena en comparación con las personas que opinan que la atencíon es excelente.

Con un nivel de confianza del 95%, se espera una disminucion de 0.30 unidades de log odds en la satisfacción, para aquellas personas que están opinan que la atención buena en comparación con las personas que opinan que la atencíon es excelente.

Con un nivel de confianza del 95%, se espera un aumento de 0.93 unidades de log odds en la satisfacción, para aquellas personas que están opinan que la atención regular en comparación con las personas que opinan que la atencíon es excelente.

Para la variable de Precio en el restaurante \(X2\)

Con un nivel de confianza del 95%, se espera un aumento de 7.69 unidades de log odds en la satisfacción, para aquellas personas que están opinan que el precio es muy bueno en comparación con las personas que opinan que la precio es excelente

Con un nivel de confianza del 95%, se espera un aumento de 6.57 unidades de log odds en la satisfacción, para aquellas personas que están opinan que el precio es bueno en comparación con las personas que opinan que la precio es excelente.

Con un nivel de confianza del 95%, se espera un aumento de 3.08 unidades de log odds en la satisfacción, para aquellas personas que están opinan que el precio es regular en comparación con las personas que opinan que la precio es excelente.

Con un nivel de confianza del 95%, se espera una disminución de 0.83 unidades de log odds en la satisfacción, para aquellas personas que están opinan que el precio es malo en comparación con las personas que opinan que la precio es excelente.

Del mismo modo se analizan las variables para la calidad y la expectativa

Predicción del modelo

Para realizar una prediccion utilizamos el comando predict() con los parametros del modelo que hemos encontrado, de esta forma tambien le especificaremos el tipo, que en este caso utilizaremos el tipo de probabilidad

pred <- predict(modelo1, datos[1:5, ], type = "prob")
pred
            5         4          3            2            1
1 0.210408686 0.7762401 0.01322456 0.0001164993 1.016097e-05
2 0.023814676 0.8474088 0.12739473 0.0012708168 1.109789e-04
3 0.023814676 0.8474088 0.12739473 0.0012708168 1.109789e-04
4 0.002017756 0.3572418 0.62431865 0.0150843289 1.337439e-03
5 0.023814676 0.8474088 0.12739473 0.0012708168 1.109789e-04

Matriz de Confusión

Una vez realizado el modelo, claculamos la matriz de confusion para observar la presición del modelo obtenido.

pred1 <- predict(modelo1, datos)
tabla_conf <- table(pred1, datos $ satisfaccion)
tabla_conf
     
pred1  5  4  3  2  1
    5 16  1  0  0  0
    4  1 21  2  0  1
    3  0  2 19  2  0
    2  0  0  1  4  0
    1  0  0  0  2  6
sum(diag(tabla_conf)) / sum(tabla_conf)
[1] 0.8461538

Como se puede observar ne la tabla de confucsion tenemos solo 10 datos de 78 que no se han ubicado en la categoría que corresponde, por tanto tenemos un modelo de \(84.61\%\) de presicíon lo que indica que es un buen modelo y se puede utilizar para las investigaciones pertinentes en el restaurante con dichos datos.