≥ 10 cases per predictor per outcome-category boundary as a loose guide; sparse top/bottom categories may need merging.
Assumptions
Independence of observations.
Proportional odds (parallel lines): each predictor's effect is the same across all cumulative splits of the outcome — test it (Brant test / SPSS test of parallel lines).
No severe multicollinearity.
Adequate cell sizes across outcome categories.
Hypotheses
H₀ — A predictor's coefficient is zero: it does not shift the odds of being in higher outcome categories.
H₁ — The coefficient differs from zero.
The concept
The model stacks all cumulative splits of the ordered outcome (low vs rest; low+medium vs high; …) and fits one common slope per predictor across them, with separate intercepts (thresholds) per split. The exponentiated slope is a cumulative odds ratio: the multiplicative change in the odds of being in a higher (vs lower) category per unit of the predictor.
The proportional-odds assumption is what buys the single-coefficient elegance; when the Brant/parallel-lines test rejects it for a predictor, that predictor's effect differs across the scale and needs freeing (partial proportional odds) or a multinomial fallback. Thresholds themselves are rarely of substantive interest.
Worked example
Predicting engagement band (low/medium/high) from job autonomy and workload among 350 employees.
Result: autonomy OR = 1.86, 95% CI [1.48, 2.35] — each autonomy point nearly doubles the odds of a higher engagement band; workload OR = 0.71. Test of parallel lines: χ²(2) = 2.1, p = .35 — assumption holds.
from statsmodels.miscmodels.ordinal_model import OrderedModel
import numpy as np
model = OrderedModel(df["engage_band"], # ordered categorical
df[["autonomy", "workload"]],
distr="logit").fit(method="bfgs")
print(model.summary())
print(np.exp(model.params[:2])) # ORs for the predictors
Analyze → Regression → Ordinal.
DV into Dependent; continuous predictors into Covariate(s), categorical into Factor(s).
Output: tick 'Test of parallel lines'.
Report model fit χ², each Estimate with SE, Wald, p, and exp(Estimate) as the cumulative OR (compute by exponentiating), plus the parallel-lines result.
Not available natively and impractical via Solver (multiple thresholds).
Use R (MASS::polr), Python (statsmodels OrderedModel), SPSS, or jamovi.
Interpreting the output
OR per predictor: odds of being in a higher outcome category multiply by OR per unit increase.
Always report the parallel-lines/Brant test — the model's credibility rests on it.
Model-level fit: likelihood-ratio χ² and pseudo-R² (named).
Predicted category probabilities at illustrative predictor values communicate results best.
APA-style reporting
Ordinal logistic regression indicated that autonomy increased the odds of higher engagement, OR = 1.86, 95% CI [1.48, 2.35], p < .001, while workload decreased them, OR = 0.71, 95% CI [0.58, 0.87], p = .001; the proportional-odds assumption was satisfied, χ²(2) = 2.10, p = .350.
Common mistakes
Never testing proportional odds.
Treating the ordinal DV as nominal (information loss) or as interval without thought.
Interpreting threshold estimates as substantive effects.
Sparse extreme categories left unmerged, destabilizing estimates.