You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中计算mlogit拟合的MNL模型的指定预测概率?

解决mlogit模型结合marginaleffects计算预测概率的问题

问题背景

已用mlogit包拟合多项Logit模型,需要复现Stata margins命令的功能:计算当var1取1-10、var2取特定值、var3取均值时,选择备选方案"A"的预测概率。使用marginaleffects::predictions()时触发错误:

The newdata argument for mlogit models must be a data frame with a number of rows equal to a multiple of the number of choices: 6.

解决方案

mlogit模型要求输入数据为长格式,每个原始观测需对应所有备选方案的行(共6行/观测)。因此需要先构造符合要求的新数据集,再传入predictions()函数。

步骤1:构造宽格式基准数据

先生成包含目标变量取值的宽格式数据,其他变量按需求设置(var2取特定值,var3取均值):

library(marginaleffects)

# 基于原始宽数据集生成基准数据
new_wide <- datagrid(
  var1 = 1:10,          # var1取1到10
  var2 = 1,             # var2取特定值1
  var3 = mean(df_wide$var3, na.rm = TRUE), # var3取均值
  data = df_wide        # 用于自动填充其他变量的默认值(如因子水平)
)

步骤2:转换为mlogit兼容的长格式

将宽格式数据转换为mlogit要求的长格式,明确指定6个备选方案:

new_long <- mlogit::mlogit.data(
  data = new_wide,
  choice = "vote",
  shape = "wide",
  alt = c("A", "B", "C", "D", "E", "F") # 替换为你的实际备选方案名称
)

步骤3:计算预测概率并筛选目标方案

使用predictions()计算概率,再筛选出备选方案"A"的结果:

# 计算所有备选方案的预测概率
preds <- predictions(
  mnl_model,
  newdata = new_long,
  type = "response"
)

# 筛选出选择"A"的预测概率
preds_A <- subset(preds, group == "A")

简化版:仅复现margins, at(var1=(1(1)10))功能

若只需要var1取1-10、其他变量取均值的结果,可简化为:

# 生成宽格式数据,其他变量自动取均值
new_wide_simple <- datagrid(var1 = 1:10, data = df_wide)
# 转长格式
new_long_simple <- mlogit::mlogit.data(new_wide_simple, choice = "vote", shape = "wide", alt = LETTERS[1:6])
# 计算并筛选
preds_A_simple <- subset(predictions(mnl_model, newdata = new_long_simple), group == "A")

关键说明

  • mlogit的长格式数据要求每个观测对应所有备选方案,因此newdata的行数必须是备选方案数的倍数(此处为6)。
  • datagrid函数会自动基于原始数据集的变量属性生成合理的基准值,无需手动设置所有变量。

内容的提问来源于stack exchange,提问作者fabian_h

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 14:03:25