Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

R How to get confidence interval for multinominal logit?

Let me use UCLA example on multinominal logit as a running example---

library(nnet)
library(foreign)

ml <- read.dta("http://www.ats.ucla.edu/stat/data/hsbdemo.dta")
ml$prog2 <- relevel(ml$prog, ref = "academic")
test <- multinom(prog2 ~ ses + write, data = ml)

dses <- data.frame(ses = c("low", "middle", "high"), write = mean(ml$write))
predict(test, newdata = dses, "probs")

I wonder how can I get 95% confidence interval?

like image 473
user2966726 Avatar asked Nov 07 '13 21:11

user2966726


2 Answers

This can be accomplished with the effects package, which I showcased for another question at Cross Validated here.

Let's look at your example.

library(nnet)
library(foreign)

ml <- read.dta("http://www.ats.ucla.edu/stat/data/hsbdemo.dta")
ml$prog2 <- relevel(ml$prog, ref = "academic")
test <- multinom(prog2 ~ ses + write, data = ml)

Instead of using the predict() from base, we use Effect() from effects

require(effects)

fit.eff <- Effect("ses", test, given.values = c("write" = mean(ml$write)))

data.frame(fit.eff$prob, fit.eff$lower.prob, fit.eff$upper.prob)

  prob.academic prob.general prob.vocation L.prob.academic L.prob.general L.prob.vocation U.prob.academic
1     0.4396845    0.3581917     0.2021238       0.2967292     0.23102295      0.10891758       0.5933996
2     0.4777488    0.2283353     0.2939159       0.3721163     0.15192359      0.20553211       0.5854098
3     0.7009007    0.1784939     0.1206054       0.5576661     0.09543391      0.05495437       0.8132831
  U.prob.general U.prob.vocation
1      0.5090244       0.3442749
2      0.3283014       0.4011175
3      0.3091388       0.2444031

If we want to, we can also plot the predicted probabilities with their respective confidence intervals using the facilities in effects.

plot(fit.eff)

Imgur

like image 193
Johan Larsson Avatar answered Sep 30 '22 14:09

Johan Larsson


Simply use the confint function on your model object.

ci <- confint(test, level=0.95)

Note that confint is a generic function and a specific version is run for multinom, as you can see by running

> methods(confint)
[1] confint.default   confint.glm*      confint.lm*       confint.multinom*
[5] confint.nls* 

EDIT:

as for the matter of calculating confidence interval for the predicted probabilities, I quote from: https://stat.ethz.ch/pipermail/r-help/2004-April/048917.html

Is there any possibility to estimate confidence intervalls for the probabilties with the multinom function?

No, as confidence intervals (sic) apply to single parameters not probabilities (sic). The prediction is a probability distribution, so the uncertainty would have to be some region in Kd space, not an interval. Why do you want uncertainty statements about predictions (often called tolerance intervals/regions)? In this case you have an event which happens or not and the meaningful uncertainty is the probability distribution. If you really have need of a confidence region, you could simulate from the uncertainty in the fitted parameters, predict and summarize somehow the resulting empirical distribution.

like image 40
nico Avatar answered Sep 30 '22 13:09

nico