R 基于nnet::multinom()模型,如何使用{ggeffects}获得预测概率图的置信区间?

R 基于nnet::multinom()模型,如何使用{ggeffects}获得预测概率图的置信区间?,r,data-visualization,confidence-interval,multinomial,nnet,R,Data Visualization,Confidence Interval,Multinomial,Nnet,我想绘制R中多项式模型的预测概率,该模型配有nnet::multinom()函数。我有对数标度的数值预测 即使{ggeeffects}应与multinom()兼容,绘图显示的置信区间与线性模型显示的置信区间不同 我对R和这个社区还不熟悉,所以如果这个问题很基本或者遗漏了一些重要的东西,我深表歉意。下面是一个小例子: library(tidyverse) library(nnet) library(effects) library(ggeffects) df <- data.frame(

我想绘制R中多项式模型的预测概率,该模型配有
nnet::multinom()
函数。我有对数标度的数值预测

即使
{ggeeffects}
应与
multinom()
兼容,绘图显示的置信区间与线性模型显示的置信区间不同

我对R和这个社区还不熟悉,所以如果这个问题很基本或者遗漏了一些重要的东西,我深表歉意。下面是一个小例子:

library(tidyverse)
library(nnet)
library(effects)
library(ggeffects)


df <- data.frame(response = c("1 Better", "1 Better", "1 Better", "2 Medium", "2 Medium", "2 Medium", "3 Worse", "3 Worse", "3 Worse"),
                 count = c(1000, 2000, 4000, 6000, 10000, 3000, 6000, 5000, 11000))

mod1 <- multinom(response ~ log(count), data = df)
summary(mod1)

effects::effect(mod1, term="log(count)", se=TRUE, confidence.level=.95) %>% plot() # Produces CIs.

ggeffects::ggpredict(mod1, terms = "count") %>% plot() + theme_bw() # No confidence intervals.
但它对那个人起了作用

使用
{MNLpred}
包及其:对我来说不起作用,我想是因为我的预测值在对数范围内。我得到了以下错误:

Error in eval(parse(text = paste0("data$", xvari))) : attempt to apply non-function

使用
{DAMisc}
中的
mnlaveffplot()
函数:工作正常,但绘图并不像我希望的那样可自定义。

您可以使用
ggeffects::GGEMeans()
完成此操作

库(tidyverse)
图书馆(主题)
图书馆(nnet)
库(ggeffects)#使用的包版本:v0.16.0

dfMNLpred
package无法处理回归函数中的
log()
,但在您事先计算对数刻度时,它会起作用

# Packages
library(tidyverse)
library(nnet)
library(MASS)
library(MNLpred)
library(scales)
library(ggeffects)
library(ggthemes)

df <- data.frame(response = c("1 Better", "1 Better", "1 Better", 
                              "2 Medium", "2 Medium", "2 Medium", 
                              "3 Worse", "3 Worse", "3 Worse"),
                 count = c(1000, 2000, 4000, 
                           6000, 10000, 3000, 
                           6000, 5000, 11000))

mod1 <- multinom(response ~ log(count), data = df)
summary(mod1)

# Log-scaled
df$count_log <- log(df$count)

# Regression
mod2 <- multinom(response ~ count_log,
                 data = df,
                 Hess = TRUE)

# The models are identical:
coef(mod1) == coef(mod2)

或预测的边际效应:

pred_fd <- mnl_fd2_ova(model = mod2,
                       x = "count_log",
                       value1 = min(df$count_log),
                       value2 = max(df$count_log),
                       data = df)

pred_fd$plotdata_fd %>%
  ggplot(aes(x = categories,
             y = mean,
             ymin = lower,
             ymax = upper)) +
  geom_pointrange() +
  scale_y_continuous(labels = percent_format()) +
  labs(title = "Predicted effect of Count on responses",
       x = "Categories",
       y = "Predicted marginal effect") +
  theme_bw()
pred\u fd%
ggplot(aes(x=类别,
y=平均值,
ymin=较低,
ymax=上)+
geom_pointrange()+
连续缩放(标签=百分比格式())+
实验室(title=“计数对响应的预测影响”,
x=“类别”,
y=“预测边际效应”)+
主题_bw()

请考虑对问题稍加修改和简化,以便它专门针对一个特定命令的一个问题。到目前为止,您似乎已经尝试了三种或三种以上不同的方法,所有这些方法都会产生错误消息或出现问题,但您只为
ggeffects::ggpredict()
命令提供了代码。如果你的问题完全是这样,考虑编辑其他事情。非常感谢-我已经编辑了我的问题,请让我知道如果可以进一步改进。这是非常有帮助的,谢谢!非常感谢。
# Packages
library(tidyverse)
library(nnet)
library(MASS)
library(MNLpred)
library(scales)
library(ggeffects)
library(ggthemes)

df <- data.frame(response = c("1 Better", "1 Better", "1 Better", 
                              "2 Medium", "2 Medium", "2 Medium", 
                              "3 Worse", "3 Worse", "3 Worse"),
                 count = c(1000, 2000, 4000, 
                           6000, 10000, 3000, 
                           6000, 5000, 11000))

mod1 <- multinom(response ~ log(count), data = df)
summary(mod1)

# Log-scaled
df$count_log <- log(df$count)

# Regression
mod2 <- multinom(response ~ count_log,
                 data = df,
                 Hess = TRUE)

# The models are identical:
coef(mod1) == coef(mod2)
# 10 steps for predictions
steps <- (max(df$count_log) - min(df$count_log))/9

pred1 <- mnl_pred_ova(mod2,
                      data = df,
                      by = steps,
                      x = "count_log")

x_breaks <- seq(from = min(df$count_log),
                to = max(df$count_log), 
                length.out = 5)

x_labels <- seq(from = min(df$count),
                to = max(df$count),
                length.out = 5)

pred1$plotdata %>%
  ggplot(aes(x = count_log,
             y = mean,
             ymin = lower,
             ymax = upper)) +
  facet_wrap(. ~ response) +
  geom_line() +
  geom_ribbon(alpha = 0.2) +
  scale_y_continuous(labels = percent_format()) +
  scale_x_continuous(breaks = x_breaks,
                     labels = x_labels) +
  theme_bw()
pred_fd <- mnl_fd2_ova(model = mod2,
                       x = "count_log",
                       value1 = min(df$count_log),
                       value2 = max(df$count_log),
                       data = df)

pred_fd$plotdata_fd %>%
  ggplot(aes(x = categories,
             y = mean,
             ymin = lower,
             ymax = upper)) +
  geom_pointrange() +
  scale_y_continuous(labels = percent_format()) +
  labs(title = "Predicted effect of Count on responses",
       x = "Categories",
       y = "Predicted marginal effect") +
  theme_bw()