R数据分析:多分类逻辑回归
上篇文章给大家写了二分类逻辑回归,今天扩展到多分类:
Multinomial logistic regression is used to model nominal outcome variables, in which the log odds of the outcomes are modeled as a linear combination of the predictor variables.
多分类和二分类唯一的区别就是因变量的水平不一样。
今天依然给大家写一个实际分析例子:
实例描述
一群大学生现在需要选择学习项目program,我们想要探讨学生学习项目的选择和他们的写作分数write和社会经济地位ses有没有关系。在这个例子中项目有三个水平,分别是:general program, vocational program and academic program,然后写作分数是一个连续变量,而社会经济地位是一个分类变量。我们来做一个多分类逻辑回归。(数据请关注后私信“数据链接”获取)
ml <- read.dta('C:/Users/hrd/Desktop/bootcamp/dataset/hsbdemo.dta')
数据读入之后我们就可以开始做我们的多分类逻辑回归
多分类逻辑回归
我们需要用到的方法为nnet包的multinom,在分析之前我们可以指定一个因变量的参考水平:
ml$prog2 <- relevel(ml$prog, ref = "academic")
test <- multinom(prog2 ~ ses + write, data = ml)
summary(test)
可以看到我们默认的输出结果中是没有p值的,此时我们需要自己计算z统计量从而得到p值:
z <- summary(test)$coefficients/summary(test)$standard.errors
p <- (1 - pnorm(abs(z), 0, 1)) * 2
那么输出的结果如何解释呢?我们看到每一个因变量的水平其实都有所有自变量的系数,那么多分类逻辑回归做出来的结果其实可以参照二分类逻辑回归一样的解释,相当于有很多个相同参照水平的二元逻辑回归,比如我们的例子中就有2个,我们可以写出回归方程:
从输出的结果中看b13这个系数为-0.058,那么我们就可以解释为:学生的写作分数每增加一个单位,其选择general program vs. academic program的风险减少exp0.058倍。
到现在我们就做好了我们的多分类逻辑回归,我们可以用我们这个模型来预测原始数据,当然我们通常是在新数据上做预测:
head(pp <- fitted(test))
看,我们模型预测出的前6个选择项目的概率如上图,其和我们原始数据的实际项目选择都是吻合的。
有可能我们还会想看看某个变量的在模型中的预测能力,比如我想看不同的社会经济地位是如何影响学生项目的选择的,此时我们将写作分数全部固定:
dses <- data.frame(ses = c("low", "middle", "high"), write = mean(ml$write))
predict(test, newdata = dses, "probs")
上面的代码就可以得出在写作分数一样的情况下,不同的社会经济地位对应的不同项目的选择概率。
有可能我们还会想看一看写作分数对选择概率的影响,这个时候我们就可以画图。
要画图我们就需要足够的数据,我们进行模拟:
dwrite <- data.frame(ses = rep(c("low", "middle", "high"), each = 41),
write = rep(c(30:70),3))
pp.write <- cbind(dwrite, predict(test, newdata = dwrite, type = "probs", se = TRUE))
上面的代码给不同的社会经济地位水平都模拟出来了30到70分的写作水平的学生,并给每个学生进行了项目选择的概率预测,那么我们现在就可以在每一个社会经济地位的水平中画出学生选择不同项目的概率与其写作分数的关系:
lpp <- melt(pp.write, id.vars = c("ses", "write"), value.name = "probability")
ggplot(lpp, aes(x = write, y = probability, colour = ses)) + geom_line() +
facet_grid(variable ~., scales = "free")