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.
Al finalizar la guía, podrás:
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.
¿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?
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.
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.
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.
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:
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.
nivel_ingreso: factor ordenado con tres niveles, de
menor a mayor ingreso: Bajo, Medio y
Alto.
| 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.
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.
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"))
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.
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")
| 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.
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.
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")
| 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.
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.
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.
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")
| 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
Con la parametrización empleada por clm() y las
categorías ordenadas de Bajo a Alto:
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.
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%")
| 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.
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.
probabilidades <- function(modelo, nuevos_datos) {
pred <- predict(modelo, newdata = nuevos_datos, type = "prob")$fit
as.data.frame(pred)
}
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")
| 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.
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")
| 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.
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")
| 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.
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.
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.
Para aplicar una regresión ordinal al mercado laboral:
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.
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.