我有一个使用R中multinom()
包中的nnet
函数构建的多项式逻辑回归模型。我有一个7类目标变量,并且我想绘制模型中包含的变量具有的系数对于我的因变量的每个类别。
对于二进制逻辑回归,我使用了coefplot()
软件包中的arm
函数,但是我不知道如何解决多类问题。
答案 0 :(得分:2)
我很难找到一个明智的multinom()
示例:下面的示例给出了荒谬的值,但是代码的结构仍然可以工作。基本思想是使用broom::tidy()
提取系数并使用ggplot/ggstance
绘制系数。 ggstance
专门用于绘制水平点范围并将它们彼此移位适当的数量;也可以通过coord_flip()
完成此操作,但是coord_flip()
会导致一定程度的灵活性不足(例如,无法轻松地与构面结合使用)。
library(nnet)
library(broom)
library(ggplot2); theme_set(theme_bw())
library(ggstance)
创建合适的示例multinom()
:
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))
答案 1 :(得分:1)
鉴于您能够像这样获取数据:
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()
结果应如下所示:
您可以尝试使用某些选项来使其与示例相同