Skip to content
Statistical RethinkingStatistical Rethinking

11.1 Resultados categóricos ordinales

Los resultados categóricos ordenados, como las escalas de Likert, tienen un orden natural pero no un espaciado fijo. Los modelos de enlace acumulativo asumen que una variable latente continua se divide en categorías mediante umbrales.

11.1.1 El modelo de enlace acumulativo

La idea: existe una variable latente continua ϕi\phi_i que determina la respuesta. La categoría observada yiy_i se determina por dónde cae ϕi\phi_i relativo a los puntos de corte α1<α2<⋯<αK−1\alpha_1 < \alpha_2 < \cdots < \alpha_{K-1}:

log⁡Pr⁡(yi≤k)1−Pr⁡(yi≤k)=αk−ϕi\log\frac{\Pr(y_i \leq k)}{1 - \Pr(y_i \leq k)} = \alpha_k - \phi_i

donde ϕi=βxi\phi_i = \beta x_i es el predictor lineal. Los puntos de corte αk\alpha_k se estiman a partir de los datos.

# Ordered categorical (cumulative link) model
# Simulate Likert-scale data (1-7 response)

set.seed(42)
n <- 300

# Latent continuous variable

x <- runif(n, 0, 10)
phi <- -1 + 0.3 * x + rnorm(n, sd = 1)

# Cutpoints for 7 categories (6 cutpoints)

cutpoints <- c(-2, -1, 0, 1, 2, 3)

# Convert to ordered categories

y <- cut(phi, breaks = c(-Inf, cutpoints, Inf), labels = 1:7)
y <- as.numeric(as.character(y))

cat("Ordered categorical data:\n")
cat(" Categories:", paste(sort(unique(y)), collapse = ", "), "\n")
cat(" Distribution:", paste(table(y), collapse = ", "), "\n")

# Fit ordered logistic regression using MASS::polr

library(MASS)
m <- polr(factor(y) ~ x, method = "logistic")

cat("\nOrdered logistic regression:\n")
cat(" Coefficient:", round(coef(m)[1], 3), "\n")
cat(" Cutpoints:", round(m$zeta, 3), "\n")

# Predicted probabilities at x = 2, 5, 8

cat("\nPredicted probabilities:\n")
for (x_val in c(2, 5, 8)) {
pred <- predict(m, data.frame(x = x_val), type = "prob")
cat(sprintf(" x = %d: P(y=1)=%.3f P(y=4)=%.3f P(y=7)=%.3f\n",
x_val, pred[1], pred[4], pred[7]))
}
Click Run to execute this code in your browser with WebR

11.1.2 Interpretación del modelo

El coeficiente β\beta nos dice cómo se desplaza la variable latente por unidad de aumento en xx. Un β\beta positivo significa que mayor xx desplaza la distribución hacia categorías más altas.

# Visualize the cumulative link model
set.seed(42)
n <- 300
x <- runif(n, 0, 10)
phi <- -1 + 0.3 * x + rnorm(n, sd = 1)
cutpoints <- c(-2, -1, 0, 1, 2, 3)
y <- as.numeric(cut(phi, breaks = c(-Inf, cutpoints, Inf), labels = 1:7))

library(MASS)
m <- polr(factor(y) ~ x, method = "logistic")

# Plot predicted category probabilities vs x

x_seq <- seq(0, 10, length.out = 200)
pred_matrix <- predict(m, data.frame(x = x_seq), type = "prob")

# Stacked area plot

par(mfrow = c(1, 1))
colors <- rainbow(7)
plot(NULL, xlim = c(0, 10), ylim = c(0, 1),
xlab = "x", ylab = "Probability",
main = "Cumulative link: category probabilities vs x")

for (k in 1:7) {
if (k == 1) {
polygon(c(x_seq, rev(x_seq)), c(pred_matrix[, k], rep(0, length(x_seq))),
col = adjustcolor(colors[k], 0.7), border = NA)
} else {
polygon(c(x_seq, rev(x_seq)),
c(rowSums(pred_matrix[, 1:k]), rev(rowSums(pred_matrix[, 1:(k-1)]))),
col = adjustcolor(colors[k], 0.7), border = NA)
}
}
legend("topright", legend = paste("y =", 1:7), fill = adjustcolor(colors, 0.7),
ncol = 4, cex = 0.8)

cat("As x increases, probability shifts toward higher categories.\n")
cat("The cutpoints determine where the shifts occur.\n")
Click Run to execute this code in your browser with WebR
Rethinking

Las categorías ordenadas no son intervalos. Una escala de Likert de 1 a 7 parece números, pero la distancia entre 1 y 2 no es necesariamente la misma que entre 6 y 7. El modelo de enlace acumulativo respeta esto: asume solo el orden, no el espaciado. Los puntos de corte se estiman a partir de los datos, así que el modelo aprende dónde están las fronteras. Esto es más honesto que tratar las categorías ordenadas como números continuos, lo que asume espaciado igual — un supuesto rara vez justificado.

Resumen de la Sección 11.1

  • Los resultados categóricos ordenados tienen orden pero no espaciado fijo.
  • Modelo de enlace acumulativo: una variable latente se divide en categorías mediante umbrales.
  • log⁡Pr⁡(y≤k)1−Pr⁡(y≤k)=αk−ϕi\log\frac{\Pr(y \leq k)}{1 - \Pr(y \leq k)} = \alpha_k - \phi_i donde ϕi=βxi\phi_i = \beta x_i.
  • El coeficiente β\beta desplaza la variable latente; los puntos de corte αk\alpha_k se estiman.
  • Use MASS::polr() para regresión logística ordenada en R.