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
相关产品推荐
相关产品推荐

