如何从 xtlogit 模型中重现平均边际效应
How to reproduce average marginal effects from xtlogit model
我有兴趣从随机效应 logit 模型中再现平均边际效应(运行 在 Stata 中使用 xtlogit
)。我了解如何使用 Delta 方法从 logit
模型重现平均边际效应。例如,在下面的代码中,我成功地重现了 margins
.
中报告的 age
的平均边际效应
*** Stata code
* download data
webuse union, clear
* calculate delta and copy variable of interest - age
sum age
gen xdelta = r(sd)/1000
clonevar age_ = age
* run logit model and calculate average marginal effect using margins
logit union age_
margins,dydx(age_)
* calculate average marginal effect by hand - mean of xme equals result from margins above
predict p1
replace age_ = age_+xdelta
predict p2
gen xme = (p2 - p1) / xdelta
sum xme
* calculate average marginal effect at fixed value of age using margins
margins,at(age=(16))
* calculate average marginal effect by hand - mean of p3 equals result from margins above
replace age_ = 16
predict p3
sum p3
我遇到困难的地方是重现 xtlogit
模型的平均边际效应。
*** Stata code
* download data and designate panel variables
webuse union, clear
xtset idcode year
* run xtlogit model
xtlogit union age
* calculate average marginal effects - can't figure out how to reproduce these estimates :(
margins, dydx(*)
margins, at(age=(16))
非常感谢您提供有关如何重现 xtlogit
边际效应的任何帮助。谢谢!
----- 编辑以更清楚地表明我有兴趣重现 margins
报告的估计
有几种方法可以做到这一点,但问题本质上归结为事实
$$\Pr(y_{it}=1 \vert x_{it})=\int\Lambda(u_i + x_{it}'\beta)\cdot \varphi(0 ,\sigma_u^2) du_i$$
其中 $\varphi()$ 是正态密度。在您的代码中,您有效地将随机效应 $u_i$ 设置为零(这就是 predict(pu0)
所做的)。这会将 RE 设置为其平均值,这可能不是您想要的。当然,$u_i$并没有被xtlogit, re
观察到,甚至没有被估计,所以如果你想复制predict(pr)
所做的事情,你需要将随机效应整合出来以获得无条件概率使用估计方差。
在 Stata 中执行此操作的一种方法是使用 user-written integrate
命令进行一维数值积分,如下所示:
webuse union, clear
xtset idcode year
xtlogit union age, nolog
margins, at(age=(16)) predict(pr)
margins, dydx(*) at(age=16) predict(pr)
capture ssc install integrate
/* phat at age 16 */
integrate, f(invlogit(x - 3.0079682 + .01929225*16)*normalden(x,0,2.477537654945496)) l(-10) u(10) vectorise quadpts(1000)
/* ME at age 16 */
integrate, f(invlogit(x - 3.0079682 + .01929225*16)*(1-invlogit(x - 3.0079682 + .01929225*16))*(.01929225)*normalden(x,0,2.477537654945496)) l(-10) u(10) vectorise quadpts(1000)
如果您使用实际系数(如 _b[_cons] 和 e(sigma_u))而不是将值粘贴到其中,您可能会获得更好的精度。
使用 Mata、Python 或什至使用模拟方法可能有更有效的方法,但我会把它留给您来解决。您还可以使用 xtmelogit
.
获得 RE 的后验模态估计
我有兴趣从随机效应 logit 模型中再现平均边际效应(运行 在 Stata 中使用 xtlogit
)。我了解如何使用 Delta 方法从 logit
模型重现平均边际效应。例如,在下面的代码中,我成功地重现了 margins
.
age
的平均边际效应
*** Stata code
* download data
webuse union, clear
* calculate delta and copy variable of interest - age
sum age
gen xdelta = r(sd)/1000
clonevar age_ = age
* run logit model and calculate average marginal effect using margins
logit union age_
margins,dydx(age_)
* calculate average marginal effect by hand - mean of xme equals result from margins above
predict p1
replace age_ = age_+xdelta
predict p2
gen xme = (p2 - p1) / xdelta
sum xme
* calculate average marginal effect at fixed value of age using margins
margins,at(age=(16))
* calculate average marginal effect by hand - mean of p3 equals result from margins above
replace age_ = 16
predict p3
sum p3
我遇到困难的地方是重现 xtlogit
模型的平均边际效应。
*** Stata code
* download data and designate panel variables
webuse union, clear
xtset idcode year
* run xtlogit model
xtlogit union age
* calculate average marginal effects - can't figure out how to reproduce these estimates :(
margins, dydx(*)
margins, at(age=(16))
非常感谢您提供有关如何重现 xtlogit
边际效应的任何帮助。谢谢!
----- 编辑以更清楚地表明我有兴趣重现 margins
有几种方法可以做到这一点,但问题本质上归结为事实
$$\Pr(y_{it}=1 \vert x_{it})=\int\Lambda(u_i + x_{it}'\beta)\cdot \varphi(0 ,\sigma_u^2) du_i$$
其中 $\varphi()$ 是正态密度。在您的代码中,您有效地将随机效应 $u_i$ 设置为零(这就是 predict(pu0)
所做的)。这会将 RE 设置为其平均值,这可能不是您想要的。当然,$u_i$并没有被xtlogit, re
观察到,甚至没有被估计,所以如果你想复制predict(pr)
所做的事情,你需要将随机效应整合出来以获得无条件概率使用估计方差。
在 Stata 中执行此操作的一种方法是使用 user-written integrate
命令进行一维数值积分,如下所示:
webuse union, clear
xtset idcode year
xtlogit union age, nolog
margins, at(age=(16)) predict(pr)
margins, dydx(*) at(age=16) predict(pr)
capture ssc install integrate
/* phat at age 16 */
integrate, f(invlogit(x - 3.0079682 + .01929225*16)*normalden(x,0,2.477537654945496)) l(-10) u(10) vectorise quadpts(1000)
/* ME at age 16 */
integrate, f(invlogit(x - 3.0079682 + .01929225*16)*(1-invlogit(x - 3.0079682 + .01929225*16))*(.01929225)*normalden(x,0,2.477537654945496)) l(-10) u(10) vectorise quadpts(1000)
如果您使用实际系数(如 _b[_cons] 和 e(sigma_u))而不是将值粘贴到其中,您可能会获得更好的精度。
使用 Mata、Python 或什至使用模拟方法可能有更有效的方法,但我会把它留给您来解决。您还可以使用 xtmelogit
.