[R] Test of Parallel Regression Assumption in R

Rune Haubo rhbc at imm.dtu.dk
Tue Mar 12 07:54:46 CET 2013


Dear Heather,

You can make this test using the ordinal package. Here the function
clm fits cumulative link models where the ordinal logistic regression
model is a special case (using the logit link).

Let me illustrate how to test the parallel regression assumption for a
particular variable using clm in the ordinal package. I am using the
wine dataset from the same package, I fit a model with two explanatory
variables; temp and contact, and I test the parallel regression
assumption for the contact variable in a likelihood ratio test:

> library(ordinal)
Loading required package: MASS
Loading required package: ucminf
Loading required package: Matrix
Loading required package: lattice
> head(wine)
  response rating temp contact bottle judge
1       36      2 cold      no      1     1
2       48      3 cold      no      2     1
3       47      3 cold     yes      3     1
4       67      4 cold     yes      4     1
5       77      4 warm      no      5     1
6       60      4 warm      no      6     1
> fm1 <- clm(rating ~ temp + contact, data=wine)
> fm2 <- clm(rating ~ temp, nominal=~ contact, data=wine)
> anova(fm1, fm2)
Likelihood ratio tests of cumulative link models:

    formula:                nominal: link: threshold:
fm1 rating ~ temp + contact ~1       logit flexible
fm2 rating ~ temp           ~contact logit flexible

    no.par    AIC  logLik LR.stat df Pr(>Chisq)
fm1      6 184.98 -86.492
fm2      9 190.42 -86.209  0.5667  3      0.904

The idea is to fit the model under the null hypothesis (parallel
effects - fm1) and under the alternative hypothesis (non-parallel
effects for contact - fm2) and compare these models with anova() which
performs the LR test. From the high p-value we see that the null
cannot be rejected and there is no evidence of non-parallel slopes in
this case. For additional information, I suggest that you take a look
at the following package vignette
(http://cran.r-project.org/web/packages/ordinal/vignettes/clm_tutorial.pdf)
where these kind of tests are more thoroughly described starting page
6.

I think you can also make similar tests with the VGAM package, but I
am not as well versed in that package.

Hope this helps,
Rune

Rune Haubo Bojesen Christensen
Postdoc
DTU Compute - Section for Statistics
---------------------------------------------------
Technical University of Denmark
Department of Applied Mathematics and Computer Science
Richard Petersens Plads
Building 324, Room 220
2800 Lyngby
Direct +45 45253363
Mobile +45 30264554
http://www.imm.dtu.dk


On 11 March 2013 22:52, Nicole Ford <nicole.ford at me.com> wrote:
> here's some code as an example....  hope it helps!
>
> mod<-polr(vote~age+demsat+eusup+lrself+male+retnat+union+urban, data=dat)
> summary(mod)
>
>
> mod<-polr(vote~age+demsat+eusup+lrself+male+retnat+union+urban, data=dat)
> levs<-levels(dat$vote)
> tmpdat<-list()
> for(i in 1:(nlevels(dat$vote)-1)){
> tmpdat[[i]] <- dat
> tmpdat[[i]]$z <- as.numeric(as.numeric(tmpdat[[1]]$vote) <= levs[i])
> }
> form<-as.formula("z~age+demsat+eusup+lrself+male+retnat+union+urban")
> mods<-lapply(tmpdat, function(x)glm(form, data=x, family=binomial))
> probs<-sapply(mods, predict, type="response")
> p.logits<-cbind(probs[,2], t(apply(probs, 1, diff)), 1-probs[,ncol(probs)])
> p.ologit<-predict(mod, type='probs')
> n<-nrow(p.logits)
> bin.ll <- p.logits[cbind(1:n, dat$vote)]
> ologit.ll <- p.ologit[cbind(1:n, dat$vote)]
> binom.test(sum(bin.ll > ologit.ll), n)
>
>
> dat$vote.fac<-factor(dat$vote, levels=1:6)
> mod<-polr(dat$vote.fac~age+demsat+eusup+lrself+male+retnat+union+urban, data=dat)
>
> source("http://www.quantoid.net/cat_pre.R ")
> catpre(mod)
>
> install.packages("rms")
> library(rms)
> olprobs<-predict(mod, type='probs')
> pred.cat<-apply(olprobs, 1, which.max)
> table(pred.cat, dat$vote)
>
> round(prop.table(table(pred.cat, dat$vote), 2), 3)
> On Mar 11, 2013, at 5:02 PM, Heather Kettrey wrote:
>
>> Hi,
>>
>> I am running an analysis with an ordinal outcome and I need to run a test
>> of the parallel regression assumption to determine if ordinal logistic
>> regression is appropriate. I cannot find a function to conduct such a test.
>>> From searching various message boards I have seen a few useRs ask this same
>> question without a definitive answer - and I came across a thread that
>> indicated there is no such function available in any R packages. I hope
>> this is incorrect.
>>
>> Does anyone know how to test the parallel regression assumption in R?
>>
>> Thanks for your help!
>>
>>
>> --
>> Heather Hensman Kettrey
>> PhD Candidate
>> Department of Sociology
>> Vanderbilt University
>>
>>       [[alternative HTML version deleted]]
>>
>> ______________________________________________
>> R-help at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>
>
>         [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list