应用于选择模型的 mlogit logsum 函数的逆向工程值

问题描述 投票:0回答:1

我有一个观察到的选择数据集(N = 26 个备选方案)和相应的预测变量范围。数据已分为训练和测试子集:Data_Train 和 Data_Test。

我使用 Data_Train 来估计 mlogit 多项 Logit 模型 M1,以量化每个选择场合下每个备选方案的相对偏好。

我的总体目标是现在使用 M1 来计算预测的福利损失,方法是从 Data_Test 中删除一个特定的替代方案 A,并假设每当选择替代方案 A 时,选择者都会选择第二好的替代方案。

我的目的是使用

mlogit::logsum()
来计算每个选择场合下每个备选方案的预期效用,然后对 Data_Test 的两个版本(一个有备选方案 A,一个没有备选方案 A)的值向量求和;我将后者称为 Data_Test[-A]。我的期望是,Data_Test 的
logsum
向量之和将高于 Data_Test[-A],两者之间的差值将是福利损失。

为了计算 Data_Test[-A] 的

logsum
值,我认为我需要在每个选择场合计算每个替代方案特定的概率,然后手动计算第二最佳替代方案的
logsum
值,所以我'我们一直在尝试对
logsum
的工作原理进行逆向工程。

来自

mlogit::logsum
R 帮助页面,“包容值、包容效用或对数和是多项 Logit 模型概率的分母的对数。”我将此解释为
logsum
从每个选择场合计算的 26 中获取最大概率 (P_max),将 P_max 表示为分数,然后取分母的对数。但这样做与
logsum
返回的值不匹配,所以我显然做错了一些(或多件事)。

以下是由以下行生成的第一个选择场合(行)中每个备选方案的概率:

Probs <- fitted(M1, newdata = Data_Test.LongFormat, type = "probabilities")

print(Probs)

9.324656e-07 2.804257e-14 1.451469e-04 7.924634e-05 1.099780e-05 1.142550e-02 1.089842e-03 2.157007e-05 3.849436e-03 9.6 78074e-01 4.846874e-03 3.258943e-05 7.138557 e-04 9.775038e-03 1.842690e-04 5.789495e-06 5.373004e-35 1.105493e-05 3.140959e-07 7.864120e-08 3.632554e-09 6.768526e-08 4. 103485e-09 4.762275e-17 8.694194e- 25 6.025488e-14

这里的P_max就是Probs[10],即0.9678074。因此,为了转换为分数并得到分母,我使用 1/P_max = 1.033263,然后取其对数,得到 0.03272219。但是,当我将

logsum
应用于同一数据集时,该行数据返回结果 -0.1498398。事实上,因为这里的
logsum
结果是负数,所以输入值必须是<1 so the way I am calculating the denominator must be wrong because 1 divided by 任何概率>=1。

谁能告诉我我在这里做错了什么,或者建议一种替代方法来计算从选择集中删除一个替代方案所造成的福利损失?在此先感谢您的帮助。很明显,我不是经济学家,因此对损坏的术语和概念表示歉意。

r probability economics mlogit
1个回答
0
投票

我会逐点回答你的问题。

我有一个观察到的选择数据集(N = 26 个备选方案)和相应的预测变量范围。数据已分为训练和测试子集:Data_Train 和 Data_Test。

我知道您对选择情境有观察(我们不知道有多少),并且通过选择情境提出了总共 26 个备选方案(很多)。

数据已分为训练和测试子集:Data_Train 和 Data_Test。我使用 Data_Train 来估计 mlogit 多项 logit 模型 M1,以量化每个选择场合下每个替代方案的相对偏好。

您已将数据分成两组(我们真的不知道为什么,以便根据第一组的估计来预测第二组中的选择?)。

我的总体目标是现在使用 M1 来计算预测的福利损失,方法是从 Data_Test 中删除一个特定的替代方案 A,并假设每当选择替代方案 A 时,选择者都会选择第二好的替代方案。

这里似乎描述了两个目标。第一个是根据 M1 模型的估计来预测删除替代方案时的选择概率。这可以通过以下代码来完成:

#This 2 lines will give you the probability of choices predicted by your model
fit <- apply(fitted(M1, outcome = FALSE), 2, mean)
fit

#Here we will remove one alternative and predict the probability of choices accross the remaining alternatives
X <- model.matrix(M1)
X <- X[-which(X[alt == "A",]),] #We remove one alternative from the model matrix
chid <- idx(M1, 1)[which(idx(M1)$alt != "A")] #We extract alternative's indexes without the alternative removed
eX <- as.numeric(exp(X %*% coef(M1))) #We compute utility for each alternatives
SeX <- as.numeric(tapply(eX, sort(chid), sum)) #We sum over the choice situations
P <- eX / SeX[sort(chid)] #We compute the probability of choices 
P <- matrix(P, ncol = 25, byrow = TRUE) 
P
MS <- rbind(c(1:25), apply(P, 2, mean)) #Here you have the mean
MS
MS <- t(MS)
sum(as.numeric(MS[,2])) #Here the sum should be 1

第二个目标是将初始模型获得的福利与没有替代方案 A 的情况下预测的福利进行比较。这可以通过以下代码来完成:

#For the welfare of your initial model
W_M1 <- logsum(M1)
summary(W_M1)

#For the welfare of the predicted model without one alternative
W_wo_A <- log(SeX)
summary(W_wo_A)

#If we want to compare
summary(W_wo_A - W_M1)

#If we want to compute the surplus and the loss of surplus (in $)
summary(-W_M1/coef(M1)["Price"])
summary(-log(SeXb)/coef(M1)["Price"])
summary(-(W_wo_A - W_M1)/coef(M1)["Price"])

我希望它会有所帮助(下次尝试添加您的数据,以便我们更好地调整代码)。

© www.soinside.com 2019 - 2024. All rights reserved.