如何在R中计算mlogit拟合的MNL模型的指定预测概率?
解决mlogit模型结合marginaleffects计算预测概率的问题
问题背景
已用mlogit包拟合多项Logit模型,需要复现Stata margins命令的功能:计算当var1取1-10、var2取特定值、var3取均值时,选择备选方案"A"的预测概率。使用marginaleffects::predictions()时触发错误:
The
newdataargument formlogitmodels 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
相关产品推荐
相关产品推荐

