What “Proportional Odds” Really Means - Substantively and Mathematically

Imagine you have an ordinal outcome with \(\textit{J}\) ordered categories, for example:

1 = Low satisfaction
2 = Medium satisfaction
3 = High satisfaction

The ordered logit model (proportional odds model) does not predict the probability of being in category 2, 3, etc. directly. Instead, it models the cumulative logits - that is, the log-odds of being in a higher category or better.

The Core Equations

Let \(\textit{Y}\) be the ordinal response (1, 2, …, \(\textit{J}\)).

The proportional odds model says:

\[\begin{equation*} \log\left(\frac{P(Y \leq j \mid X)}{P(Y > j \mid X)}\right) = \alpha_j - (X\beta) \quad \text{for } j = 1, 2, \dots, J-1 \end{equation*}\]

or, more commonly written as the log-odds of being greater than category \(\textit{j}\):

\[\begin{equation*} \log\left(\frac{P(Y > j \mid X)}{P(Y \leq j \mid X)}\right) = \alpha_j + X\beta \quad \text{(note the sign flip)} \end{equation*}\]

Key points:

\(\alpha_1\), \(\alpha_2\), …, \(\alpha_{J-1}\) are the thresholds/intercepts (different for each cumulative split).
\(\beta\) is the same vector of coefficients for every single cumulative logit (\(\textit{j}\) = 1, 2, …, \(\textit{J}\)−1).

This is the \(\textbf{proportional odds}\) assumption: the effect of each predictor \(\textit{X}\) (the \(\beta\) coefficients) is identical no matter where you cut the ordinal scale!

Substantive Interpretation

The odds ratio for a one-unit increase in \(\textit{X}\) is:

\(\text{OR} = \exp(\beta)\)

and this odds ratio is \(\textbf{the same}\) whether you are comparing:

Low vs. (Medium or High)
(Low or Medium) vs. High
or any other cumulative split

So, if \(\beta\) for “high income” = 0.80 \(\rightarrow\) OR = exp(0.80) \(\approx\) 2.2. In words, people with high income have \(\textbf{2.2 times greater odds}\) of being in a higher satisfaction category than lower, regardless of whether “higher” means Medium-or-High vs Low, or High vs Medium-or-Low.

What Happens When the Assumption is Violated?

If the true effect of income is very strong when moving from Low \(\rightarrow\) Medium, but almost zero when moving from Medium \(\rightarrow\) High, then \(\beta\) would need to be different for different cuts. The single \(\beta\) in the proportional odds model would be a misleading average, and some diagnostic tests (such as nominal_test in \(\textsf{R}\)’s \(\textsf{ordinal}\) package or the user-written \(\textsf{brant}\) command in \(\textsf{Stata}\)) would usually reject the assumption.

Only the intercepts (\(\alpha_1\), \(\alpha_2\)) change; the slope \(\beta\) stays identical \(\rightarrow\) parallel cumulative logit lines \(\rightarrow\) “parallel regression” = “proportional odds”. So, to make an analogy: Proportional odds means “the predictors push you up (or down) the ordinal scale with \(\textbf{the same relative force}\) at \(\textbf{every rung}\) of the ladder.”

R example

Let’s work out an example in \(\textsf{R}\).

# install.packages(c("ordinal", "MASS"))

# Load libraries
library(ordinal)
library(MASS)

# Load the built-in housing dataset
data(housing)

# View the summary of the data
summary(housing)
##      Sat         Infl           Type      Cont         Freq      
##  Low   :24   Low   :24   Tower    :18   Low :36   Min.   : 3.00  
##  Medium:24   Medium:24   Apartment:18   High:36   1st Qu.:10.00  
##  High  :24   High  :24   Atrium   :18             Median :19.50  
##                          Terrace  :18             Mean   :23.35  
##                                                   3rd Qu.:31.75  
##                                                   Max.   :86.00
# Fit an ordered logit model (proportional odds)
model <- clm(Sat ~ Infl + Type + Cont, data = housing, link = "logit")

# Summary of the model
summary(model)
## formula: Sat ~ Infl + Type + Cont
## data:    housing
## 
##  link  threshold nobs logLik AIC    niter max.grad cond.H 
##  logit flexible  72   -79.10 174.20 0(0)  0.00e+00 3.9e+01
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)
## InflMedium      0.0000     0.5303       0        1
## InflHigh        0.0000     0.5303       0        1
## TypeApartment   0.0000     0.6124       0        1
## TypeAtrium      0.0000     0.6124       0        1
## TypeTerrace     0.0000     0.6124       0        1
## ContHigh        0.0000     0.4330       0        1
## 
## Threshold coefficients:
##             Estimate Std. Error z value
## Low|Medium   -0.6931     0.5863  -1.182
## Medium|High   0.6931     0.5863   1.182
# Test the proportional odds assumption using nominal_test()
# It tests if effects are constant across thresholds
po_test <- nominal_test(model)

# Print the test results
print(po_test)
## Tests of nominal effects
## 
## formula: Sat ~ Infl + Type + Cont
##        Df logLik   AIC LRT Pr(>Chi)
## <none>     -79.1 174.2             
## Infl    2  -79.1 178.2   0        1
## Type    3  -79.1 180.2   0        1
## Cont    1  -79.1 176.2   0        1
# Interpretation: Check p-values in po_test.
# If p > 0.05 for the predictors (x), the proportional odds assumption holds.

It looks like all p-values > 0.05, so the proportional odds assumption holds–no evidence of violation!