绘制多项逻辑回归模型的系数
Plot coefficients from a multinomial logistic regression model
我有一个多项式逻辑回归模型,使用 R 中 nnet
包中的 multinom()
函数构建。我有一个 7 class 目标变量,我想绘制系数模型中包含的变量对于我的因变量的每个 class 都有。
对于二元逻辑回归,我使用了 arm
包中的 coefplot()
函数,但我不知道如何针对多 class 问题执行此操作。
我希望我的绘图看起来像这样:
鉴于您能够像这样获取数据:
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()
结果应该是这样的:
您可以试验某些选项,使其看起来与您的示例相同
我不容易找到一个合理的 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))
我有一个多项式逻辑回归模型,使用 R 中 nnet
包中的 multinom()
函数构建。我有一个 7 class 目标变量,我想绘制系数模型中包含的变量对于我的因变量的每个 class 都有。
对于二元逻辑回归,我使用了 arm
包中的 coefplot()
函数,但我不知道如何针对多 class 问题执行此操作。
我希望我的绘图看起来像这样:
鉴于您能够像这样获取数据:
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()
结果应该是这样的:
您可以试验某些选项,使其看起来与您的示例相同
我不容易找到一个合理的 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))