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

Stata中asclogit后estat mfx的选择概率与边际效应复现问题

用clogit复现asclogit中estat mfx的备选方案选中概率

我明白你遇到的问题——已经用clogit复现了asclogit的系数,但就是搞不定estat mfx输出的选中概率。核心问题出在你对estat mfx计算概率时的协变量取值逻辑理解有误,尤其是个案变量和备选方案虚拟变量的处理方式。

先明确estat mfx的计算规则

asclogit的estat mfx在计算备选方案选中概率时,是在协变量均值处评估,但这里的均值有明确的区分:

  • 备选方案特定变量(比如你的t):取该变量在所有备选方案-个案观测中的整体均值
  • 个案特定变量(比如Medicaid):取个案层面的均值(即每个个案只算一次值,再求平均,而不是所有观测的平均——不过如果每个个案的备选方案数固定,这两个均值可能相同,但逻辑上必须用个案层面的)
  • 备选方案虚拟变量(你创建的Valpha_j):计算某个备选方案j的效用时,该变量直接取1(因为我们要计算的是"选中j"的概率,此时j的标识变量为1),而不是取变量的均值

你的代码中的核心错误

你之前尝试用Valpha_j的均值代入计算,这完全搞错了——Valpha_j是用来标识当前观测属于备选方案j的虚拟变量,在计算j的选中概率时,这个变量的取值就是1,不是均值。另外,Medicaid的均值应该取个案层面的,而不是你创建的VMedicaid_j这类衍生变量的均值。

修正后的代码

下面是可以复现estat mfx概率结果的clogit后处理代码:

// 1. 先获取正确的均值:个案层面的Medicaid均值(和asclogit的casevars逻辑一致)
bysort ID: egen Medicaid_case = mean(Medicaid)
summarize Medicaid_case
scalar Medicaid_MN = r(mean)

// 2. 获取备选方案特定变量t的整体均值
summarize t
scalar t_MN = r(mean)

// 3. 计算各备选方案的效用(XB)
// Base alternative(1)的效用:截距为0,只包含t的贡献
scalar XB1 = exp(_b[t] * t_MN)

// 其他备选方案(2-5)的效用:t的贡献 + 备选方案截距 + Medicaid的贡献
foreach j of numlist 2/5 {
    scalar XB`j' = exp(_b[t] * t_MN + _b[Valpha_`j'] + _b[1.VMedicaid_`j'] * Medicaid_MN)
}

// 4. 计算分母(所有备选方案效用的和)
scalar DNM = XB1 + XB2 + XB3 + XB4 + XB5

// 5. 计算并输出每个备选方案的选中概率
foreach j of numlist 1/5 {
    scalar PRB`j' = XB`j' / DNM
    di "The probability of choosing hospital `j' is: " PRB`j'
}

验证逻辑的关键点

  • 为什么用Medicaid_case?因为asclogit的casevars(Medicaid)是绑定到个案的变量,每个个案的所有备选方案观测中Medicaid值相同,estat mfx会用个案层面的平均取值来计算基准概率。
  • 为什么Valpha_j直接用系数?因为当计算备选方案j的选中概率时,我们是假设该备选方案存在(即Valpha_j=1),所以直接加上该备选方案的截距系数即可,不需要乘均值——均值是针对连续变量的处理方式,虚拟变量在这里是标识身份,不是协变量。

运行这段代码后,你得到的概率应该和estat mfx输出的baseline矩阵完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:59:45