Multinomial Logit Regression 多类别逻辑回归

如果dependent variable有多个类别(大于两类)那么我们就需要用MNL来解决问题,这些类别中并逻辑关联,例如去判断我喜欢的冰淇淋口味是草莓还是巧克力还是抹茶。
假设pij为第i个人属于第j类,那么就会存在:pi1+pi2+····+pin = 1

还记得二元逻辑回归的公式吗?
image.png

多元逻辑回归能不能简单的表示为:In [ pi1/(1-pi1)] = βX呢?当然不行,会造成更大的标准误差。正确的公式如下:
image.png

在MNL中,会利用newton-raphson算法进行最大似然估计,接下来举一个例子
预测一辆车会选择4条车道的主干道(Va), 还是两车道的高速路(Vt),还是四条车道的高速路(Vf)
回归后得到公式:
Va = −0.942(Dista)
Vt = 1.65−1.135(Distt)+0.128(VehAge)
Vf = −3.20 − 0.69(Distf ) + 0.233(VehAge) + 0.766(Male)

  • 解释
    (1)从这三个式子中可以看出,Va是没有截距的,因为Va成为了baseline
    (2)当其余变量都想同时,通过对比三条道路的截距我们可以得出两车道高速路比四车道主干道更有可能被选择,四车道高速路比起四车道主干道更小概率的被选择。
    需要指出的是,在逻辑回归中,如果置信区间包含1,那么需要考虑显著性的准确程度。而在线性回归中这个值为0.

最后加上代码,

library(tidyverse)
library(ggplot2)
library(nnet)

setwd("~/Desktop/analysis ppt/hw6")
SV_data <- read.csv("Class_Survey_W20.csv", header = TRUE) 

Varname <- colnames(SV_data)

#dependent variable, predict which traffic mode are more likelt to be choosen(bus, walk, drive).
SV_data <- SV_data %>% rename(Method = Varname[1])       
#independent variable, categorical preditor, male or female.
SV_data <- SV_data %>% rename(Sex = Varname[42])
#independent variable, categorical preditor, traffic influence the time of people arriving school or not.
SV_data <- SV_data %>% rename(TraffInf = Varname[38]) 
#independent variable, countinous preditor, time from home to school.
SV_data <- SV_data %>% rename(TTime = Varname[2])
SV_data <- SV_data %>% filter(Method != " ", Sex != " ", TraffInf !=" ", TTime != " ")

#recoding variables
MNL_data <- SV_data %>% filter(Method == "Bus"|Method == "Drive"|Method == "Walk")
MNL_data <- MNL_data %>% filter(Sex == "Female"|Sex == "Male")
MNL_data <- MNL_data %>% mutate (TraffInf = ifelse(TraffInf == "Never","No","Yes"))
MNL_data$Sex <- factor(MNL_data$Sex)
MNL_data$Method <- factor(MNL_data$Method)
#check whether the sex only includes female and male 
levels(MNL_data$Sex)
#calculate the frequency of dependent variable 
as.data.frame(table(MNL_data$Method))

#use nnet build multinominal model
MNL_data$Method <- relevel(MNL_data$Method, ref = "Bus")
MNLogit <- multinom(Method ~ Sex + TraffInf + TTime, data = MNL_data)
summary(MNLogit)

#z-test
z <- summary(MNLogit)$coefficients/summary(MNLogit)$standard.errors
z
# 2-tailed Wald z tests to test significance of coefficients
p <- (1 - pnorm(abs(z), 0, 1)) * 2
p

#confidence intervals of parameter estimates
confint(MNLogit) 
#odds ratio
exp(coef(MNLogit)) 
#confidence intervals of the ORs
exp(confint(MNLogit)) 

BTW, 多元逻辑回归可以用vgam package做

library(xtable)
library(VGAM) 
wallet<-read.csv(file="wallet.csv")

#For reviewing data
names(wallet)
summary(wallet)

#Including labels for 0, 1, and 2
wallet$honestfac<-factor(wallet$wallet,labels=c("least","ethical","most"))

#Recoding
punish_el<-ifelse(wallet$punish==1,1,0)
table(punish_el)

#################################################
#Multinomial logit model using "vglm" function
mlogit<-vglm(honestfac~male+business+punish_el+explain,family=multinomial(), data=wallet)
summary(mlogit)

##To create table for exporting into latex
A<-coef(summary(mlogit))
xtable(A)

exp(coef(mlogit))  #odds ratios

lrtest(mlogit)  #to compare the initial and converged model

deviance(mlogit)  #see residual deviance

AIC(mlogit)  #AIC value

logLik(mlogit)  #loglikelihood

#using vglm - you need to compute confidence interval yourself as follows:
b <- coef(mlogit)
se <- sqrt(diag(vcov(mlogit)))
CIM<-cbind(LL = b-qnorm(0.975)*se, UL = b+qnorm(0.975)*se)
round(CIM,2)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容