propodds: Proportional Odds Model for Ordinal Regression

View source: R/family.categorical.R

propoddsR Documentation

Proportional Odds Model for Ordinal Regression


Fits the proportional odds model to a (preferably ordered) factor response.


propodds(reverse = TRUE, whitespace = FALSE,
         thresholds = c("unconstrained", "equidistant",
         "symmetric1", "symmetric0"), Treverse = reverse,
         Tref = if (Treverse) "M" else 1)


reverse, whitespace

Logical. Fed into arguments of the same name in cumulative.

thresholds, Treverse, Tref

Fed into arguments of the same name in cumulative.


The proportional odds model is a special case from the class of cumulative link models. It involves a logit link applied to cumulative probabilities and a strong parallelism assumption. A parallelism assumption means there is less chance of numerical problems because the fitted probabilities will remain between 0 and 1; however the parallelism assumption ought to be checked, e.g., via a likelihood ratio test. This VGAM family function is merely a shortcut for cumulative(reverse = reverse, link = "logit", parallel = TRUE). Please see cumulative for more details on this model.


An object of class "vglmff" (see vglmff-class). The object is used by modelling functions such as vglm, and vgam.


No check is made to verify that the response is ordinal if the response is a matrix; see ordered.


Thomas W. Yee


See cumulative.

See Also

cumulative, R2latvar.


# Fit the proportional odds model, McCullagh and Nelder (1989,p.179)
pneumo <- transform(pneumo, let = log(exposure.time))
(fit <- vglm(cbind(normal, mild, severe) ~ let, propodds, pneumo))
depvar(fit)  # Sample proportions
weights(fit, type = "prior")  # Number of observations
coef(fit, matrix = TRUE)
constraints(fit)  # Constraint matrices

# Check that the model is linear in let ----------------------
fit2 <- vgam(cbind(normal, mild, severe) ~ s(let, df = 2), propodds,
## Not run:  plot(fit2, se = TRUE, lcol = 2, scol = 2) 

# Check the proportional odds assumption with a LRT ----------
(fit3 <- vglm(cbind(normal, mild, severe) ~ let,
              cumulative(parallel = FALSE, reverse = TRUE), pneumo))
pchisq(deviance(fit) - deviance(fit3),
       df = df.residual(fit) - df.residual(fit3), lower.tail = FALSE)
lrtest(fit3, fit)  # Easier

VGAM documentation built on Sept. 19, 2023, 9:06 a.m.