Multinomial Logistic Regression - R Data Analysis Examples - IDRE Stats
Multinomial Logistic Regression - R Data Analysis Examples - IDRE Stats
EXAMPLES
Version info: Code for this page was tested in R version 3.1.0
(2014-04-10)
On: 2014-06-13
With: reshape2 1.2.2; ggplot2 0.9.3.1; nnet 7.3-8; foreign 0.8-61;
knitr 1.5
Please note: The purpose of this page is to show how to use various data analysis
commands. It does not cover all aspects of the research process which researchers
are expected to do. In particular, it does not cover data cleaning and checking,
verification of assumptions, model diagnostics or potential follow-up analyses.
Examples of multinomial logistic regression
Example 1. People’s occupational choices might be influenced by their parents’
occupations and their own education level. We can study the relationship of one’s
occupation choice with education level and father’s occupation. The occupational
choices will be the outcome variable which consists of categories of occupations.
Example 2. A biologist may be interested in food choices that alligators make. Adult
alligators might have different preferences from young ones. The outcome variable
here will be the types of food, and the predictor variables might be size of the
alligators and other environmental variables.
Example 3. Entering high school students make program choices among general
program, vocational program and academic program. Their choice might be modeled
using their writing score and their social economic status.
Description of the data
For our data analysis example, we will expand the third example using the hsbdemo
data set. Let’s first read in the data.
ml <- read.dta("https://stats.idre.ucla.edu/stat/data/hsbdemo.dta")
The data set contains variables on 200 students. The outcome variable is prog,
program type. The predictor variables are social economic status, ses, a three-level
categorical variable and writing score, write, a continuous variable. Let’s start with
getting some descriptive statistics of the variables of interest.
with(ml, table(ses, prog))
## prog
## ses general academic vocation
## low 16 19 12
## middle 20 44 31
## high 9 42 7
## M SD
## general 51.33 9.398
## academic 56.26 7.943
## vocation 46.76 9.319
## # weights: 15 (8 variable)
## initial value 219.722458
## iter 10 value 179.982880
## final value 179.981726
## converged
summary(test)
## Call:
## multinom(formula = prog2 ~ ses + write, data = ml)
##
## Coefficients:
## (Intercept) sesmiddle seshigh write
## general 2.852 -0.5333 -1.1628 -0.05793
## vocation 5.218 0.2914 -0.9827 -0.11360
##
## Std. Errors:
## (Intercept) sesmiddle seshigh write
## general 1.166 0.4437 0.5142 0.02141
## vocation 1.164 0.4764 0.5956 0.02222
##
## Residual Deviance: 360
## AIC: 376
z <- summary(test)$coefficients/summary(test)$standard.errors
z
# 2-tailed z test
p <- (1 - pnorm(abs(z), 0, 1)) * 2
p
We first see that some output is generated by running the model, even though
we are assigning the model to a new R object. This model-running output
includes some iteration history and includes the final negative log-likelihood
179.981726. This value multiplied by two is then seen in the model summary as
the Residual Deviance and it can be used in comparisons of nested models,
but we won’t show an example of comparing models on this page.
The model summary output has a block of coefficients and a block of standard
errors. Each of these blocks has one row of values corresponding to a model
equation. Focusing on the block of coefficients, we can look at the first row
comparing prog = "general" to our baseline prog = "academic" and the
second row comparing prog = "vocation" to our baseline prog =
"academic". If we consider our coefficients from the first row to be \(b_1\) and
our coefficients from the second row to be \(b_2\), we can write our model
equations:
$$ln\left(\frac{P(prog=general)}{P(prog=academic)}\right) = b_{10} + b_{11}
(ses=2) + b_{12}(ses=3) + b_{13}write$$ $$ln\left(\frac{P(prog=vocation)}
{P(prog=academic)}\right) = b_{20} + b_{21}(ses=2) + b_{22}(ses=3) +
b_{23}write$$
The ratio of the probability of choosing one outcome category over the probability of
choosing the baseline category is often referred as relative risk (and it is also
sometimes referred as odds as we have just used to described the regression
parameters above). The relative risk is the right-hand side linear equation
exponentiated, leading to the fact that the exponentiated regression coefficients are
relative risk ratios for a unit change in the predictor variable. We can exponentiate
the coefficients from our model to see these risk ratios.
## extract the coefficients from the model and exponentiate
exp(coef(test))
The relative risk ratio for a one-unit increase in the variable write is .9437 for
being in general program vs. academic program.
The relative risk ratio switching from ses = 1 to 3 is .3126 for being in general
program vs. academic program.
You can also use predicted probabilities to help you understand the model. You can
calculate predicted probabilities for each of our outcome levels using the fitted
function. We can start by generating the predicted probabilities for the observations
in our dataset and viewing the first few rows
head(pp <- fitted(test))
Next, if we want to examine the changes in predicted probability associated with one
of our two variables, we can create small datasets varying one variable while holding
the other constant. We will first do this holding write at its mean and examining the
predicted probabilities for each level of ses.
dses <- data.frame(ses = c("low", "middle", "high"), write = mean(ml$write))
predict(test, newdata = dses, "probs")
Another way to understand the model using the predicted probabilities is to look at
the averaged predicted probabilities for different values of the continuous predictor
variable write within each level of ses.
dwrite <- data.frame(ses = rep(c("low", "middle", "high"), each = 41), write = rep(c(30:70),
3))
## store the predicted probabilities for each value of ses and write
pp.write <- cbind(dwrite, predict(test, newdata = dwrite, type = "probs", se = TRUE))
## pp.write$ses: high
## academic general vocation
## 0.6164 0.1808 0.2028
## --------------------------------------------------------
## pp.write$ses: low
## academic general vocation
## 0.3973 0.3278 0.2749
## --------------------------------------------------------
## pp.write$ses: middle
## academic general vocation
## 0.4256 0.2011 0.3733
Sometimes, a couple of plots can convey a good deal amount of information. Using
the predictions we generated for the pp.write object above, we can plot the
predicted probabilities against the writing score by the level of ses for different
levels of the outcome variable.
## melt data set to long for ggplot2
lpp <- melt(pp.write, id.vars = c("ses", "write"), value.name = "probability")
head(lpp) # view first few rows
## plot predicted probabilities across write values for each level of ses
## facetted by program type
ggplot(lpp, aes(x = write, y = probability, colour = ses)) + geom_line() + facet_grid(variable ~
., scales = "free")
Things to consider
See also
Click here to report an error on this page or leave a comment Your Name (required)
© 2017 UC REGENTS TERMS OF USE & PRIVACY POLICY (http://www.ucla.edu/terms-of-use/) HOME (/) CONTACT (/contact)