【发布时间】:2019-12-20 01:06:43
【问题描述】:
我有一个使用 R 中 nnet 包中的 multinom() 函数构建的多项逻辑回归模型。我有一个 7 类目标变量,我想绘制模型中包含的变量对每一类的系数我的因变量。
对于二元逻辑回归,我使用了 arm 包中的 coefplot() 函数,但我不知道如何解决多类问题。
【问题讨论】:
标签: r plot logistic-regression coefficients multinomial
我有一个使用 R 中 nnet 包中的 multinom() 函数构建的多项逻辑回归模型。我有一个 7 类目标变量,我想绘制模型中包含的变量对每一类的系数我的因变量。
对于二元逻辑回归,我使用了 arm 包中的 coefplot() 函数,但我不知道如何解决多类问题。
【问题讨论】:
标签: r plot logistic-regression coefficients multinomial
我无法轻易找到一个合理的multinom() 示例:下面的示例给出了荒谬的值,但代码的结构无论如何都应该有效。基本思想是使用broom::tidy() 提取系数并使用ggplot/ggstance 绘制它们。 ggstance 专门用于绘制水平点范围并将它们相互替换适当的量;这也可以通过coord_flip() 完成,但coord_flip() 会导致一定程度的灵活性不足(例如,它不能轻易地与分面结合)。
library(nnet)
library(broom)
library(ggplot2); theme_set(theme_bw())
library(ggstance)
创建示例multinom()fit:
nvars <- c("mpg","disp","hp")
mtcars_sc <- mtcars
mtcars[nvars] <- scale(mtcars[nvars])
m <- multinom(cyl~mpg+hp+disp,mtcars_sc,
maxit=1e4)
提取系数并删除截距项:
tt <- broom::tidy(m,conf.int=TRUE)
tt <- dplyr::filter(tt, term!="(Intercept)")
剧情:
ggplot(tt, aes(x=estimate,y=term,colour=y.level))+
geom_pointrangeh(aes(xmin=conf.low,
xmax=conf.high),
position=position_dodgev(height=0.75))
【讨论】:
鉴于您能够像这样获取数据:
coeff <- factor(1:7,labels=c("inc", "lwg", "hcyes", "wcyes","age", "k618", "k5"))
values <- c(-0.1,0.6,0.15,0.8,-0.05,-0.05,-1.5)
upper <- c(-0.1,1,.6,1.3,-.05,.1,-1)
lower <- c(-0.1,.2,-.2,.3,-.05,-.2,-2)
df <- data.frame(coeff,values,upper,lower)
那么你所要做的就是运行:
library(ggplot2)
ggplot(df, aes(x=coeff, y=values, ymin=lower, ymax=upper)) +
geom_pointrange() +
geom_hline(yintercept=0, linetype=2)+
coord_flip()
结果应该是这样的:
您可以尝试某些选项以使其看起来与您的示例相同
【讨论】: