1 Presentación

La regresión ordinal es apropiada cuando la variable dependiente está formada por categorías que tienen un orden sustantivo, pero cuya distancia no puede suponerse igual. En el mercado laboral, este tipo de respuesta aparece, por ejemplo, al clasificar el nivel de ingreso laboral como bajo, medio o alto; el grado de satisfacción con el empleo; o la intensidad de las dificultades para conseguir trabajo.

Esta guía desarrolla una aplicación sobre los factores asociados al nivel de ingreso laboral de las personas ocupadas. Se utilizará una base simulada y se estimará un modelo logit ordinal de odds proporcionales en R. Las categorías de ingreso se forman con los terciles de la muestra simulada: sirven para el ejercicio y no constituyen umbrales oficiales ni una clasificación normativa de ingresos.

2 Objetivos de aprendizaje

Al finalizar la guía, podrás:

  1. Distinguir una respuesta ordinal de una variable nominal o dicotómica.
  2. Explicar la lógica del modelo logit ordinal de odds proporcionales.
  3. Reconocer los umbrales y los coeficientes de las variables explicativas.
  4. Estimar e interpretar un modelo ordinal en R.
  5. Contrastar la significancia individual y global de las variables.
  6. Evaluar el supuesto de odds proporcionales.
  7. Interpretar los resultados mediante razones de odds y probabilidades predichas.
  8. Comparar perfiles de trabajadores sin atribuir causalidad a las asociaciones observadas.

3 Contexto analítico: nivel de ingreso laboral

El ingreso que recibe una persona ocupada puede variar según sus características individuales y las condiciones de su inserción laboral. En esta aplicación se examina si la edad, el sexo, la educación, la formalidad y la rama de actividad se asocian con la probabilidad de ubicarse en un nivel de ingreso laboral bajo, medio o alto.

La población del ejemplo está compuesta por personas ocupadas de 18 a 64 años. Para fines didácticos, el ingreso continuo simulado se divide en tres grupos mediante los terciles de la propia muestra. Este procedimiento genera niveles ordenados y facilita la estimación. En una investigación, los puntos de corte deberían definirse según el objetivo analítico y justificarse con criterios teórico.

El análisis es asociativo. Una relación estimada entre educación, formalidad u otra covariable y el nivel de ingreso no demuestra por sí sola un efecto causal.

3.1 Pregunta de investigación

¿Cómo se asocian la edad, el sexo, el nivel educativo, la formalidad y la rama de actividad con la probabilidad de que una persona ocupada se ubique en un nivel de ingreso laboral más alto?

3.2 Hipótesis de trabajo

  • Una mayor escolaridad se asocia con mayores probabilidades de ubicarse en niveles de ingreso superiores.
  • La formalidad laboral se asocia con una mayor probabilidad de pertenecer a las categorías media o alta.
  • La asociación de la edad con el nivel de ingreso puede no ser lineal; en esta especificación se modela inicialmente como lineal para mantener un ejercicio introductorio.
  • Las diferencias por sexo y rama se evalúan de manera condicionada por las demás variables incluidas.

4 Estructura del modelo ordinal

4.1 ¿Qué hace ordinal a la variable dependiente?

La variable respuesta tiene tres categorías con orden conocido:

Código Categoría Orden
1 Bajo Menor nivel de ingreso
2 Medio Nivel intermedio
3 Alto Mayor nivel de ingreso

El orden aporta información, pero no permite afirmar que la distancia entre bajo y medio sea igual a la distancia entre medio y alto. Por esa razón, no corresponde tratar estas categorías como una variable cuantitativa continua sin una justificación adicional. Tampoco se recomienda dicotomizarlas automáticamente, pues se perdería información.

4.2 Modelo logit ordinal de odds proporcionales

Sea \(Y_i\) el nivel de ingreso laboral de la persona \(i\), con categorías ordenadas \(1, 2, \ldots, J\). El modelo logit acumulativo puede expresarse como:

\[ \log\left[\frac{P(Y_i \leq j \mid \mathbf{x}_i)}{P(Y_i > j \mid \mathbf{x}_i)}\right] = \theta_j - \mathbf{x}_i^\top\boldsymbol{\beta}, \qquad j=1,\ldots,J-1. \]

En esta expresión, \(P(Y_i \leq j \mid \mathbf{x}_i)\) es la probabilidad acumulada de ubicarse en la categoría \(j\) o en una inferior; \(\theta_j\) es el umbral que separa las categorías hasta \(j\) de las superiores; \(\mathbf{x}_i\) es el vector de variables explicativas; y \(\boldsymbol{\beta}\) contiene los coeficientes comunes a los distintos cortes acumulativos.

El signo menos en esta formulación es importante para la interpretación: con esta parametrización, un coeficiente positivo desplaza la distribución hacia categorías superiores. Por ejemplo, aumenta las odds de superar cada punto de corte, manteniendo constantes las demás variables.

4.2.1 Supuesto de odds proporcionales

El modelo impone que los coeficientes de las variables explicativas sean iguales en cada corte acumulativo. Para tres categorías, se consideran los cortes bajo frente a medio/alto y bajo/medio frente a alto. La igualdad de pendientes en ambos cortes es el supuesto de odds proporcionales (también llamado supuesto de regresiones paralelas).

Si el supuesto no resulta razonable, el modelo de odds proporcionales puede resumir de forma inadecuada algunas asociaciones. En ese caso se debe considerar una especificación alternativa —por ejemplo, un modelo de odds parciales proporcionales o un modelo multinomial— y justificar la elección. No debe seleccionarse una alternativa únicamente porque produzca valores-p más convenientes.

4.3 Interpretación de los coeficientes y de las razones de odds

Para un predictor cuantitativo, \(\exp(\beta_k)\) representa el cambio multiplicativo en las odds de ubicarse por encima de cualquier punto de corte ordinal, por cada unidad adicional de \(X_k\), bajo el supuesto de odds proporcionales.

Para un predictor categórico, la razón de odds compara una categoría con la categoría de referencia, manteniendo constantes las demás covariables. En esta parametrización:

  • \(\exp(\beta_k)>1\): mayores odds de ubicarse en categorías superiores;
  • \(\exp(\beta_k)<1\): menores odds de ubicarse en categorías superiores;
  • \(\exp(\beta_k)=1\): las odds no cambian.

Una razón de odds no es una razón de probabilidades ni una diferencia en puntos porcentuales. Para comunicar cambios en probabilidades, se deben examinar probabilidades predichas para perfiles comparables.

5 Variables y número de parámetros

5.1 Variable dependiente

nivel_ingreso: factor ordenado con tres niveles, de menor a mayor ingreso: Bajo, Medio y Alto.

5.2 Variables explicativas

Variable Tipo Categorías o unidad Referencia
edad Cuantitativa Años cumplidos —
sexo Cualitativa dicotómica Hombre; Mujer Hombre
educacion Cualitativa incorporada como factor Primaria; Secundaria; Terciaria Primaria
formalidad Cualitativa dicotómica Informal; Formal Informal
rama Cualitativa nominal Industria; Comercio; Servicios Industria

La educación se incorpora como un factor, no como un puntaje numérico. Así, no se impone que el salto de primaria a secundaria sea igual al de secundaria a terciaria.

5.3 Conteo de parámetros

Con tres categorías de la respuesta se estiman dos umbrales (\(J-1=2\)). Las variables explicativas aportan: edad, 1 coeficiente; sexo, 1; educación con tres niveles, 2; formalidad, 1; y rama con tres niveles, 2. En total se estiman 7 coeficientes de pendiente y 2 umbrales, es decir, 9 parámetros. Los umbrales no son categorías de referencia de las variables explicativas y no se interpretan como sus efectos.

6 Ejercicio de aplicación en R

6.1 Paquetes

Se utiliza ordinal, que estima modelos ordinales mediante clm(). dplyr se usa para organizar los datos y knitr para presentar tablas. Instale una sola vez los paquetes que no estén disponibles; no es necesario incluir install.packages() en cada compilación.

library(ordinal)
library(dplyr)
library(knitr)

Si el paquete no está instalado, ejecutar en la consola de R:

install.packages(c("ordinal", "dplyr", "knitr"))

6.2 Simulación de datos

La simulación representa 1.500 personas ocupadas. Se genera primero un ingreso laboral continuo con asociaciones plausibles para el ejemplo; luego, el ingreso se clasifica en terciles. La semilla permite reproducir los mismos resultados en cada ejecución.

set.seed(2026)
n <- 1500

trabajadores <- data.frame(
  edad = round(runif(n, min = 18, max = 64)),
  sexo = sample(c("Hombre", "Mujer"), n, replace = TRUE,
                prob = c(0.52, 0.48)),
  educacion = sample(c("Primaria", "Secundaria", "Terciaria"), n,
                     replace = TRUE, prob = c(0.35, 0.45, 0.20)),
  formalidad = sample(c("Informal", "Formal"), n, replace = TRUE,
                      prob = c(0.55, 0.45)),
  rama = sample(c("Industria", "Comercio", "Servicios"), n,
                replace = TRUE, prob = c(0.20, 0.40, 0.40))
)

# El ingreso continuo es simulado y solo se utiliza para construir la respuesta.
eta_ingreso <- 0.018 * (trabajadores$edad - 40) +
  ifelse(trabajadores$sexo == "Mujer", -0.10, 0) +
  ifelse(trabajadores$educacion == "Secundaria", 0.20,
         ifelse(trabajadores$educacion == "Terciaria", 0.48, 0)) +
  ifelse(trabajadores$formalidad == "Formal", 0.42, 0) +
  ifelse(trabajadores$rama == "Comercio", -0.06,
         ifelse(trabajadores$rama == "Servicios", 0.08, 0))

trabajadores$ingreso_simulado <- exp(log(3500000) + eta_ingreso +
                                       rnorm(n, mean = 0, sd = 0.48))

cortes <- quantile(trabajadores$ingreso_simulado,
                   probs = c(1/3, 2/3), na.rm = TRUE)

trabajadores$nivel_ingreso <- cut(
  trabajadores$ingreso_simulado,
  breaks = c(-Inf, cortes[1], cortes[2], Inf),
  labels = c("Bajo", "Medio", "Alto"),
  ordered_result = TRUE,
  right = TRUE
)

# Definir explícitamente categorías y referencias
trabajadores$sexo <- factor(trabajadores$sexo,
                            levels = c("Hombre", "Mujer"))
trabajadores$educacion <- factor(trabajadores$educacion,
                                 levels = c("Primaria", "Secundaria", "Terciaria"))
trabajadores$formalidad <- factor(trabajadores$formalidad,
                                  levels = c("Informal", "Formal"))
trabajadores$rama <- factor(trabajadores$rama,
                            levels = c("Industria", "Comercio", "Servicios"))
trabajadores$nivel_ingreso <- ordered(trabajadores$nivel_ingreso,
                                      levels = c("Bajo", "Medio", "Alto"))

Nota: los terciles se calculan en la muestra simulada; por construcción, el número de casos de cada categoría será aproximadamente similar. No interprete estos cortes como salario mínimo, línea de pobreza ni clasificación oficial.

6.3 Exploración inicial

str(trabajadores)
## 'data.frame':    1500 obs. of  7 variables:
##  $ edad            : num  50 44 24 31 44 19 39 58 30 45 ...
##  $ sexo            : Factor w/ 2 levels "Hombre","Mujer": 2 1 2 1 2 1 1 1 1 2 ...
##  $ educacion       : Factor w/ 3 levels "Primaria","Secundaria",..: 2 3 2 2 2 1 1 3 1 1 ...
##  $ formalidad      : Factor w/ 2 levels "Informal","Formal": 2 1 2 1 2 2 1 1 1 1 ...
##  $ rama            : Factor w/ 3 levels "Industria","Comercio",..: 2 2 3 2 1 2 2 1 3 2 ...
##  $ ingreso_simulado: num  8351302 7359319 2469134 3634310 7743973 ...
##  $ nivel_ingreso   : Ord.factor w/ 3 levels "Bajo"<"Medio"<..: 3 3 1 1 3 1 2 2 1 3 ...
tabla_nivel <- trabajadores %>%
  count(nivel_ingreso) %>%
  mutate(porcentaje = 100 * n / sum(n))

kable(tabla_nivel, digits = 1,
      caption = "Distribución del nivel de ingreso laboral simulado")
Distribución del nivel de ingreso laboral simulado
nivel_ingreso n porcentaje
Bajo 500 33.3
Medio 500 33.3
Alto 500 33.3
summary(trabajadores[, c("edad", "ingreso_simulado")])
##       edad       ingreso_simulado  
##  Min.   :18.00   Min.   :  564647  
##  1st Qu.:29.00   1st Qu.: 3297585  
##  Median :41.00   Median : 4932633  
##  Mean   :40.91   Mean   : 5884482  
##  3rd Qu.:52.00   3rd Qu.: 7306673  
##  Max.   :64.00   Max.   :39293055

La distribución permite comprobar que la respuesta tiene las tres categorías previstas. También conviene revisar faltantes, valores atípicos, frecuencias pequeñas y codificación antes de estimar cualquier modelo.

6.4 Especificación y estimación

La categoría más baja de nivel_ingreso aparece primero y la más alta al final. clm() estima el modelo ordinal con enlace logit. La referencia de cada predictor categórico es su primer nivel, definido en el código anterior.

modelo_ordinal <- clm(
  nivel_ingreso ~ edad + sexo + educacion + formalidad + rama,
  data = trabajadores,
  link = "logit",
  Hess = TRUE
)
summary(modelo_ordinal)
## formula: nivel_ingreso ~ edad + sexo + educacion + formalidad + rama
## data:    trabajadores
## 
##  link  threshold nobs logLik   AIC     niter max.grad cond.H 
##  logit flexible  1500 -1390.72 2799.45 5(0)  4.48e-12 9.0e+04
## 
## Coefficients:
##                      Estimate Std. Error z value Pr(>|z|)    
## edad                 0.065923   0.004253  15.501  < 2e-16 ***
## sexoMujer           -0.102293   0.102616  -0.997  0.31883    
## educacionSecundaria  0.537876   0.114859   4.683 2.83e-06 ***
## educacionTerciaria   1.495452   0.150886   9.911  < 2e-16 ***
## formalidadFormal     1.435692   0.107984  13.295  < 2e-16 ***
## ramaComercio        -0.057714   0.135393  -0.426  0.66991    
## ramaServicios        0.400942   0.137935   2.907  0.00365 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Threshold coefficients:
##            Estimate Std. Error z value
## Bajo|Medio   3.0084     0.2305   13.05
## Medio|Alto   4.8370     0.2528   19.13

La salida presenta umbrales (threshold coefficients) y coeficientes de las variables (location coefficients). Para responder la pregunta sustantiva, se interpretan principalmente los coeficientes de ubicación y sus razones de odds; los umbrales delimitan las categorías acumuladas.

7 Pruebas de hipótesis

7.1 Pruebas individuales de Wald

Para cada pendiente se contrasta \(H_0: \beta_k=0\) frente a \(H_1: \beta_k\ne 0\). El estadístico de Wald es el cociente entre el coeficiente estimado y su error estándar. La tabla siguiente extrae solo las pendientes, no los umbrales:

tabla_coef <- coef(summary(modelo_ordinal))
tabla_wald <- as.data.frame(tabla_coef)
tabla_wald$variable <- rownames(tabla_wald)

tabla_wald <- tabla_wald %>%
  filter(!grepl("\\|", variable)) %>%
  transmute(
    Variable = variable,
    Coeficiente = Estimate,
    Error_estandar = `Std. Error`,
    Estadistico_Wald = `z value`,
    Valor_p = `Pr(>|z|)`
  )

kable(tabla_wald, digits = 4,
      caption = "Pruebas individuales de Wald para los coeficientes de ubicación")
Pruebas individuales de Wald para los coeficientes de ubicación
Variable Coeficiente Error_estandar Estadistico_Wald Valor_p
edad edad 0.0659 0.0043 15.5005 0.0000
sexoMujer sexoMujer -0.1023 0.1026 -0.9969 0.3188
educacionSecundaria educacionSecundaria 0.5379 0.1149 4.6829 0.0000
educacionTerciaria educacionTerciaria 1.4955 0.1509 9.9111 0.0000
formalidadFormal formalidadFormal 1.4357 0.1080 13.2954 0.0000
ramaComercio ramaComercio -0.0577 0.1354 -0.4263 0.6699
ramaServicios ramaServicios 0.4009 0.1379 2.9067 0.0037

Con un nivel de significancia previamente elegido (por ejemplo, 5%), un valor-p menor que dicho nivel aporta evidencia contra la hipótesis nula para ese coeficiente, condicionado a las otras variables y a los supuestos del modelo. La significancia estadística no mide por sí sola la importancia sustantiva.

7.2 Prueba global de razón de verosimilitudes

Se compara el modelo completo con un modelo que contiene únicamente umbrales y no incluye predictores. La hipótesis nula es que todas las pendientes son simultáneamente iguales a cero.

modelo_nulo <- clm(nivel_ingreso ~ 1, data = trabajadores,
                   link = "logit", Hess = TRUE)
anova(modelo_nulo, modelo_ordinal)
## Likelihood ratio tests of cumulative link models:
##  
##                formula:                                                   
## modelo_nulo    nivel_ingreso ~ 1                                          
## modelo_ordinal nivel_ingreso ~ edad + sexo + educacion + formalidad + rama
##                link: threshold:
## modelo_nulo    logit flexible  
## modelo_ordinal logit flexible  
## 
##                no.par    AIC  logLik LR.stat df Pr(>Chisq)    
## modelo_nulo         2 3299.8 -1647.9                          
## modelo_ordinal      9 2799.4 -1390.7  514.39  7  < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Un valor-p pequeño indica que el conjunto de predictores mejora el ajuste respecto del modelo nulo. Esta prueba no establece que cada predictor sea individualmente significativo ni que el modelo esté correctamente especificado.

7.3 Supuesto de odds proporcionales

nominal_test() evalúa si permitir efectos nominales (pendientes que cambian entre cortes) mejora el ajuste de cada variable frente al modelo de odds proporcionales. La hipótesis nula corresponde a que no se requiere esa variación de efectos.

nominal_test(modelo_ordinal)
## Tests of nominal effects
## 
## formula: nivel_ingreso ~ edad + sexo + educacion + formalidad + rama
##            Df  logLik    AIC    LRT Pr(>Chi)  
## <none>        -1390.7 2799.4                  
## edad        1 -1390.2 2800.4 1.0793  0.29885  
## sexo        1 -1390.6 2801.1 0.3269  0.56750  
## educacion   2 -1390.2 2802.4 0.9928  0.60872  
## formalidad  1 -1390.0 2800.0 1.4482  0.22881  
## rama        2 -1388.1 2798.2 5.2597  0.07209 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

La interpretación debe considerar el patrón de resultados y el tamaño muestral, no solo un umbral de valor-p. Un resultado no significativo indica que la prueba no detecta evidencia suficiente de violación; no demuestra que el supuesto sea verdadero. Si se observa una señal de incumplimiento, se deben explorar alternativas y explicar por qué se eligen.

7.4 Comparación del ajuste y pseudo-\(R^2\)

El AIC permite comparar modelos estimados sobre la misma respuesta y la misma muestra; valores menores indican un mejor equilibrio relativo entre ajuste y complejidad. El pseudo-\(R^2\) de McFadden es una medida descriptiva respecto del modelo nulo, pero no se interpreta como la proporción de varianza explicada de una regresión lineal.

logLik_completo <- as.numeric(logLik(modelo_ordinal))
logLik_nulo <- as.numeric(logLik(modelo_nulo))
medidas_ajuste <- data.frame(
  Modelo = c("Nulo", "Ordinal completo"),
  LogLik = c(logLik_nulo, logLik_completo),
  AIC = c(AIC(modelo_nulo), AIC(modelo_ordinal))
)
pseudo_r2_mcfadden <- 1 - logLik_completo / logLik_nulo
kable(medidas_ajuste, digits = 3, caption = "Medidas de ajuste")
Medidas de ajuste
Modelo LogLik AIC
Nulo -1647.918 3299.837
Ordinal completo -1390.723 2799.445
cat("Pseudo-R² de McFadden:", round(pseudo_r2_mcfadden, 4), "\n")
## Pseudo-R² de McFadden: 0.1561

8 Interpretación de resultados

8.1 Según el signo

Con la parametrización empleada por clm() y las categorías ordenadas de Bajo a Alto:

  • un coeficiente positivo se asocia con mayores odds de estar por encima de cada corte, es decir, con una distribución desplazada hacia niveles de ingreso superiores;
  • un coeficiente negativo se asocia con menores odds de superar los cortes y con una distribución desplazada hacia categorías inferiores;
  • el signo describe la dirección de la asociación condicional, no el cambio en puntos porcentuales.

En predictores categóricos, la comparación siempre se realiza frente a la referencia. Por ejemplo, el coeficiente de formalidadFormal compara personas formales con informales de igual valor en las demás variables incluidas.

8.2 Mediante razones de odds

beta <- coef(modelo_ordinal)
se <- sqrt(diag(vcov(modelo_ordinal)))
es_pendiente <- !grepl("\\|", names(beta))
tabla_or <- data.frame(
  Variable = names(beta)[es_pendiente],
  Coeficiente = beta[es_pendiente],
  OR = exp(beta[es_pendiente]),
  IC95_inferior = exp(beta[es_pendiente] - 1.96 * se[es_pendiente]),
  IC95_superior = exp(beta[es_pendiente] + 1.96 * se[es_pendiente])
)
kable(tabla_or, digits = 3,
      caption = "Razones de odds e intervalos aproximados al 95%")
Razones de odds e intervalos aproximados al 95%
Variable Coeficiente OR IC95_inferior IC95_superior
edad edad 0.066 1.068 1.059 1.077
sexoMujer sexoMujer -0.102 0.903 0.738 1.104
educacionSecundaria educacionSecundaria 0.538 1.712 1.367 2.145
educacionTerciaria educacionTerciaria 1.495 4.461 3.319 5.997
formalidadFormal formalidadFormal 1.436 4.203 3.401 5.193
ramaComercio ramaComercio -0.058 0.944 0.724 1.231
ramaServicios ramaServicios 0.401 1.493 1.139 1.957

Ejemplo de redacción para completar con la salida: “Manteniendo constantes las demás características, la razón de odds asociada a educación terciaria frente a primaria es [OR]. Esto representa odds de ubicarse por encima de cada corte [mayores/menores] en aproximadamente [porcentaje]%. La interpretación supone que se sostiene el supuesto de odds proporcionales.”

Para convertir la razón de odds en variación porcentual de las odds: si OR > 1, \((OR-1)\times100\%\) de aumento; si OR < 1, \((1-OR)\times100\%\) de reducción. Esta transformación se refiere a odds, no a probabilidades.

9 Probabilidades predichas y diferencias de probabilidades

El modelo estima una probabilidad para cada nivel de la respuesta. Para un perfil, las probabilidades de Bajo, Medio y Alto deben sumar 1. La probabilidad de la categoría intermedia no tiene necesariamente que aumentar o disminuir de forma monótona ante el cambio de un predictor; puede subir en un tramo y bajar en otro.

9.1 Función para obtener probabilidades

probabilidades <- function(modelo, nuevos_datos) {
  pred <- predict(modelo, newdata = nuevos_datos, type = "prob")$fit
  as.data.frame(pred)
}

9.2 Perfiles comparables

Se construyen dos perfiles que difieren únicamente en la formalidad. La edad, sexo, educación y rama se mantienen iguales.

perfil_informal <- data.frame(
  edad = 35,
  sexo = factor("Hombre", levels = levels(trabajadores$sexo)),
  educacion = factor("Secundaria", levels = levels(trabajadores$educacion)),
  formalidad = factor("Informal", levels = levels(trabajadores$formalidad)),
  rama = factor("Comercio", levels = levels(trabajadores$rama))
)
perfil_formal <- perfil_informal
perfil_formal$formalidad <- factor("Formal", levels = levels(trabajadores$formalidad))

pred_informal <- probabilidades(modelo_ordinal, perfil_informal)
pred_formal <- probabilidades(modelo_ordinal, perfil_formal)
comparacion_perfiles <- rbind(
  cbind(Perfil = "Informal", pred_informal),
  cbind(Perfil = "Formal", pred_formal)
)
kable(comparacion_perfiles, digits = 3,
      caption = "Probabilidades predichas para dos perfiles comparables")
Probabilidades predichas para dos perfiles comparables
Perfil Bajo Medio Alto
1 Informal 0.555 0.331 0.114
11 Formal 0.229 0.420 0.351

La diferencia entre las probabilidades de cada fila cuantifica cómo cambia la distribución estimada entre ambos perfiles. Si aumenta la probabilidad de nivel alto, las probabilidades de uno o más de los otros niveles deben reducirse, porque la suma se mantiene en 1. La comparación es condicional al perfil especificado y no equivale a un efecto causal.

9.3 Efecto marginal promedio discreto para formalidad

Para una variable binaria, se calcula la probabilidad de cada resultado bajo los dos estados de interés y luego se promedian las diferencias individuales. Esto evita interpretar directamente el coeficiente como cambio de probabilidad.

datos_informal <- trabajadores
datos_formal <- trabajadores
datos_informal$formalidad <- factor("Informal", levels = levels(trabajadores$formalidad))
datos_formal$formalidad <- factor("Formal", levels = levels(trabajadores$formalidad))

p_informal <- probabilidades(modelo_ordinal, datos_informal)
p_formal <- probabilidades(modelo_ordinal, datos_formal)
ame_formalidad <- colMeans(p_formal - p_informal)
tabla_ame_formalidad <- data.frame(
  Nivel_ingreso = names(ame_formalidad),
  Diferencia_promedio = as.numeric(ame_formalidad),
  Puntos_porcentuales = 100 * as.numeric(ame_formalidad)
)
kable(tabla_ame_formalidad, digits = 3,
      caption = "Diferencias promedio de probabilidad: formal frente a informal")
Diferencias promedio de probabilidad: formal frente a informal
Nivel_ingreso Diferencia_promedio Puntos_porcentuales
pred 0.001 0.053

La suma de las diferencias promedio entre categorías debe ser aproximadamente cero, salvo pequeñas diferencias numéricas. Una diferencia positiva para Alto indica una probabilidad promedio predicha mayor de esa categoría bajo formalidad en esta comparación del modelo; no significa que toda persona experimente el mismo cambio.

9.4 Cambio discreto promedio para edad

Para comunicar el cambio asociado a un año de edad, se compara la probabilidad predicha con la edad observada y con la edad incrementada en un año. Es una diferencia discreta promedio, no una razón de odds.

datos_edad <- trabajadores
datos_edad_mas1 <- trabajadores
datos_edad_mas1$edad <- datos_edad_mas1$edad + 1
p_edad <- probabilidades(modelo_ordinal, datos_edad)
p_edad_mas1 <- probabilidades(modelo_ordinal, datos_edad_mas1)
dif_edad <- colMeans(p_edad_mas1 - p_edad)
tabla_edad <- data.frame(
  Nivel_ingreso = names(dif_edad),
  Diferencia_promedio = as.numeric(dif_edad),
  Puntos_porcentuales = 100 * as.numeric(dif_edad)
)
kable(tabla_edad, digits = 3,
      caption = "Cambio promedio de probabilidad por un año adicional de edad")
Cambio promedio de probabilidad por un año adicional de edad
Nivel_ingreso Diferencia_promedio Puntos_porcentuales
pred 0 0.018

El signo y la magnitud pueden variar por categoría. La probabilidad de ingreso medio puede comportarse de forma distinta a la de ingreso bajo o alto, por lo que se deben comentar las tres estimaciones y sus intervalos de incertidumbre si se calculan.

10 Predicción para nuevos casos

La siguiente función estima la probabilidad de cada nivel para un trabajador con características definidas. Los niveles de los factores deben coincidir con los utilizados para ajustar el modelo.

nuevo_trabajador <- data.frame(
  edad = 45,
  sexo = factor("Mujer", levels = levels(trabajadores$sexo)),
  educacion = factor("Terciaria", levels = levels(trabajadores$educacion)),
  formalidad = factor("Formal", levels = levels(trabajadores$formalidad)),
  rama = factor("Servicios", levels = levels(trabajadores$rama))
)
probabilidades(modelo_ordinal, nuevo_trabajador)
##         Bajo    Medio      Alto
## 1 0.03962265 0.164734 0.7956433

La predicción no tiene por qué reducirse a asignar una sola categoría. Es preferible comunicar el perfil completo de probabilidades. Si se decide clasificar, una regla frecuente asigna la categoría con mayor probabilidad, pero esta decisión debe responder al objetivo práctico y reconocer que confundir categorías vecinas no tiene el mismo sentido que confundir Bajo con Alto.

11 Evaluación de predicciones

Puede construirse una tabla entre la categoría observada y la categoría con mayor probabilidad predicha. La exactitud global describe el porcentaje de clasificaciones coincidentes, pero ignora el orden de las categorías y puede ocultar errores de distinta gravedad. Por ello, debe presentarse como medida descriptiva complementaria, no como única evidencia de calidad.

prob_muestra <- probabilidades(modelo_ordinal, trabajadores)
clase_predicha <- factor(
  names(prob_muestra)[max.col(as.matrix(prob_muestra), ties.method = "first")],
  levels = levels(trabajadores$nivel_ingreso),
  ordered = TRUE
)
matriz_clasificacion <- table(
  Observado = trabajadores$nivel_ingreso,
  Predicho = clase_predicha
)
matriz_clasificacion
##          Predicho
## Observado Bajo Medio Alto
##     Bajo     0     0    0
##     Medio    0     0    0
##     Alto     0     0    0
exactitud <- sum(diag(matriz_clasificacion)) / sum(matriz_clasificacion)
cat("Exactitud de clasificación:", round(100 * exactitud, 1), "%\n")
## Exactitud de clasificación: NaN %

En un análisis predictivo, el desempeño debe medirse en datos que no se hayan utilizado para estimar el modelo (por ejemplo, mediante partición de entrenamiento y prueba o validación cruzada). En una explicación inferencial, el interés puede estar en los parámetros y sus incertidumbres, no en maximizar la exactitud. La curva ROC binaria no es una evaluación directa del resultado ordinal de tres categorías.

12 Mensaje metodológico final

Para aplicar una regresión ordinal al mercado laboral:

  1. Defina una pregunta sustantiva y una población de análisis.
  2. Verifique que las categorías de la respuesta tengan un orden justificable.
  3. Justifique los puntos de corte de la respuesta y evite presentarlos como oficiales si son arbitrarios o muestrales.
  4. Declare la categoría de referencia de cada predictor categórico.
  5. Estime el modelo y separe los umbrales de los coeficientes de ubicación.
  6. Evalúe la significancia individual y global junto con la incertidumbre de las estimaciones.
  7. Compruebe el supuesto de odds proporcionales y analice alternativas si no es razonable.
  8. Interprete las razones de odds como cambios en odds, no en probabilidades.
  9. Use probabilidades predichas y diferencias promedio para expresar resultados en términos más intuitivos.
  10. Considere el diseño muestral, los factores de confusión, la representatividad y las limitaciones de datos antes de formular conclusiones.

Los modelos ordinales permiten aprovechar el orden de una respuesta categórica sin suponer distancias iguales entre niveles. Su utilidad depende de una definición cuidadosa de las categorías y de la revisión explícita de los supuestos.

13 Bibliografía

  • Agresti, A. (2010). Analysis of Ordinal Categorical Data (2.ª ed.). Wiley.
  • Agresti, A. (2018). An Introduction to Categorical Data Analysis (3.ª ed.). Wiley.
  • Christensen, R. H. B. (2023). ordinal: Regression Models for Ordinal Data. Paquete de R.
  • McCullagh, P. (1980). Regression models for ordinal data. Journal of the Royal Statistical Society: Series B, 42(2), 109–142.
  • R Core Team. R: A language and environment for statistical computing. R Foundation for Statistical Computing.

Nota docente: esta guía fue estructurada con asistencia de herramientas de inteligencia artificial generativa. La selección del enfoque, la validación estadística y la revisión final del material corresponden al docente.