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

mlogit::logsum函数逆向工程及移除备选方案的福利损失计算问题

问题分析与解决方案

一、你的计算错误根源

你误解了mlogit::logsum()的定义:

  • 该函数返回的是所有备选方案系统效用指数的对数和,即log(sum(exp(V_j))),其中V_j是模型对备选方案j预测的线性系统效用(也就是predict(M1)返回的结果)。
  • MNL模型中,备选方案j的选择概率是exp(V_j) / sum(exp(V_k)),所以sum(exp(V_k))是概率的分母,logsum()就是这个分母的对数,和“最大概率的倒数取对数”没有任何关系。
  • 你的例子中,计算log(1/0.9678074)得到的是log(S) - V_max(其中S是sum(exp(V_k)),V_max是最优方案的系统效用),这和logsum()返回的log(S)自然不符。

二、移除备选方案A后的福利损失计算方法

步骤1:准备数据与计算系统效用

先获取测试集所有备选方案的系统效用:

# 得到每个观测-备选方案的系统效用V
V_all <- predict(M1, newdata = Data_Test)

步骤2:计算含A场景的logsum总和

直接用logsum()函数计算每个观测的期望效用对数,再求和:

logsum_all <- logsum(M1, newdata = Data_Test)
total_logsum_all <- sum(logsum_all)

步骤3:构造移除A后的测试集

注意mlogit的长格式数据中,每个观测对应多个备选方案行,需要筛选掉备选方案为A的行:

# 假设你的数据中标识备选方案的列名为"alt"
Data_Test_noA <- Data_Test[Data_Test$alt != "A", ]
# 重新整理为mlogit要求的数据格式,确保每个观测的备选方案集合正确
Data_Test_noA <- mlogit.data(Data_Test_noA, choice = "choice", alt.var = "alt", chid.var = "chid")

步骤4:计算不含A场景的logsum总和

logsum_noA <- logsum(M1, newdata = Data_Test_noA)
total_logsum_noA <- sum(logsum_noA)

步骤5:计算福利损失

MNL模型中,logsum()的值代表决策者的期望最大效用的对数,因此移除A后的福利损失为:

welfare_loss <- total_logsum_all - total_logsum_noA

这个值表示所有决策者因失去备选方案A而损失的期望效用总和。如果你的模型包含货币类变量(如价格),可以将福利损失除以该变量的系数,转换为货币化的福利损失。

补充:针对“原选A的决策者改选次优”的验证

如果你想单独验证原选择A的观测的福利变化,可以筛选出这些观测:

# 假设选择变量名为"choice",1表示选中
chid_A <- unique(Data_Test[Data_Test$choice == 1 & Data_Test$alt == "A", "chid"])
logsum_all_A <- logsum_all[names(logsum_all) %in% chid_A]
logsum_noA_A <- logsum_noA[names(logsum_noA) %in% chid_A]
welfare_loss_A <- sum(logsum_all_A - logsum_noA_A)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:35:24