Stata:不同函数形式的半弹性计算
👇 连享会 · 推文导航 | www.lianxh.cn
🍎 Stata:Stata基础 | Stata绘图 | Stata程序 | Stata新命令 📘 论文:数据处理 | 结果输出 | 论文写作 | 数据分享 💹 计量:回归分析 | 交乘项-调节 | IV-GMM | 时间序列 | 面板数据 | 空间计量 | Probit-Logit | 分位数回归 ⛳ 专题:SFA-DEA | 生存分析 | 爬虫 | 机器学习 | 文本分析 🔃 因果:DID | RDD | 因果推断 | 合成控制法 | PSM-Matching 🔨 工具:工具软件 | Markdown | Python-R-Stata 🎧 课程:公开课-直播 | 计量专题 | 关于连享会
连享会 · 效率分析专题
作者:文海铭 (广西大学)
邮箱:hming_wen@sina.com
温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:
编者按:本文主要摘译自下文,特此致谢!
Source:Using the margins command with different functional forms: Proportional versus natural logarithm changes. -Link-
目录
1. 命令简介
2. 二元变量的线性模型
3. 分类变量的线性模型
4. 非线性模型
5. expression 选项
6. 相关推文
1. 命令简介
margins
命令可以进行边际预测,以及边际效应计算,并且通过 expression()
选项,margins
可以用于任何函数形式。在本文中,我们将展示在线性模型和非线性模型中,如何计算协变量变化导致的结果变量的变化比例 (半弹性)。
2. 二元变量的线性模型
二元变量的线性模型回归后:
我们可以使用 margins, eydx(x)
命令来估计 变化导致 的变化比例 (也称为半弹性)。估计半弹性的公式取决于 是连续变量还是离散变量。如果 是连续变量,则计算公式为:
如果 是离散变量,我们可能会认为计算公式如下:
然而,这并不是 margins, eydx(x)
的计算公式。相反,margins
命令以自然对数的形式得到 的相对变化值。
例如,我们将婴儿出生体重 (bw) 对母亲年龄 (age) 和是否存在 uterine irritability (ui) 进行回归,其中 age 是连续变量,ui 是二元变量。
. webuse lbw, clear
. regress bwt age i.ui
Source | SS df MS Number of obs = 189
-------------+---------------------------------- F(2, 186) = 8.63
Model | 8484309.72 2 4242154.86 Prob > F = 0.0003
Residual | 91430988.9 186 491564.456 R-squared = 0.0849
-------------+---------------------------------- Adj R-squared = 0.0751
Total | 99915298.6 188 531464.354 Root MSE = 701.12
------------------------------------------------------------------------------
bwt | Coefficient Std. err. t P>|t| [95% conf. interval]
-------------+----------------------------------------------------------------
age | 9.439 9.678 0.98 0.331 -9.653 28.531
1.ui | -569.193 143.966 -3.95 0.000 -853.208 -285.177
_cons | 2809.271 233.138 12.05 0.000 2349.337 3269.205
------------------------------------------------------------------------------
. margins, eydx(age ui)
Average marginal effects Number of obs = 189
Model VCE: OLS
Expression: Linear prediction, predict()
ey/dx wrt: age 1.ui
------------------------------------------------------------------------------
| Delta-method
| ey/dx std. err. t P>|t| [95% conf. interval]
-------------+----------------------------------------------------------------
age | 0.003 0.003 0.97 0.331 -0.003 0.010
1.ui | -0.208 0.057 -3.65 0.000 -0.321 -0.096
------------------------------------------------------------------------------
Note: ey/dx for factor levels is the discrete change from the base level.
当然,我们也可以手动计算 age 导致 bwt 的变化程度,具体代码如下:
. gen propage = _b[age]/(_b[_cons] + _b[age]*age + _b[1.ui]*ui)
. sum propage
Variable | Obs Mean Std. dev. Min Max
-------------+---------------------------------------------------------
propage | 189 .003225 .0002682 .0029186 .0039631
ui 导致 bw 的变化程度计算代码如下:
. preserve
. replace ui = 0
. predict bwthat0
. replace ui = 1
. predict bwthat1
. gen propui = (bwthat1 - bwthat0)/bwthat0 // 错误的计算
. gen lnbwt0 = ln(bwthat0)
. gen lnbwt1 = ln(bwthat1)
. gen propui2 = lnbwt1 - lnbwt0 // 正确的计算
. sum propui propui2
. restore
Variable | Obs Mean Std. dev. Min Max
-------------+---------------------------------------------------------
propui | 189 -.187989 .0030706 -.1935099 -.1760018
propui2 | 189 -.2082484 .0037771 -.2150636 -.1935868
margins, eydx()
命令使用对数的方法,因为该方法具有更好的数值特性。如果结果变量本身就是以对数形式存在,例如:
则 。
3. 分类变量的线性模型
现在,我将在模型中的 ui 替换为种族变量 race,其中 race = 1 代表白人,race = 2 代表黑人,race = 3 代表其他人种。
. reg bwt age i.race
Source | SS df MS Number of obs = 189
-------------+---------------------------------- F(3, 185) = 3.41
Model | 5239114.38 3 1746371.46 Prob > F = 0.0186
Residual | 94676184.2 185 511763.158 R-squared = 0.0524
-------------+---------------------------------- Adj R-squared = 0.0371
Total | 99915298.6 188 531464.354 Root MSE = 715.38
------------------------------------------------------------------------------
bwt | Coefficient Std. err. t P>|t| [95% conf. interval]
-------------+----------------------------------------------------------------
age | 6.147 10.069 0.61 0.542 -13.717 26.011
race |
Black | -366.394 160.569 -2.28 0.024 -683.176 -49.612
Other | -287.294 115.484 -2.49 0.014 -515.128 -59.460
_cons | 2953.688 255.247 11.57 0.000 2450.119 3457.257
------------------------------------------------------------------------------
. margins, expression((_b[2.race]*2.race + _b[3.race]*3.race)/(_b[_cons]+_b[age]*age)) dydx(race)
Average marginal effects Number of obs = 189
Model VCE: OLS
Expression: (_b[2.race]*2.race + _b[3.race]*3.race)/(_b[_cons]+_b[age]*age)
dy/dx wrt: 2.race 3.race
------------------------------------------------------------------------------
| Delta-method
| dy/dx std. err. z P>|z| [95% conf. interval]
-------------+----------------------------------------------------------------
race |
Black | -0.118 0.051 -2.34 0.019 -0.217 -0.019
Other | -0.093 0.036 -2.58 0.010 -0.163 -0.022
------------------------------------------------------------------------------
Note: dy/dx for factor levels is the discrete change from the base level.
当然,我们可以通过如下公式进行手工计算,具体如下:
. gen double propblack = _b[2.race]/(_b[_cons] + _b[age]*age)
. gen double propother = _b[3.race]/(_b[_cons] + _b[age]*age)
. sum propblack propother
Variable | Obs Mean Std. dev. Min Max
-------------+---------------------------------------------------------
propblack | 189 -.1183368 .0012359 -.1205344 -.1134239
propother | 189 -.0927893 .0009691 -.0945124 -.0889371
4. 非线性模型
该计算可推广到非线性模型,主要区别是回归命令。在下文中,我们使用 probit
和 poisson
进行回归。
. probit low age i.race
Probit regression Number of obs = 189
LR chi2(3) = 6.62
Prob > chi2 = 0.0850
Log likelihood = -114.02581 Pseudo R2 = 0.0282
------------------------------------------------------------------------------
low | Coefficient Std. err. z P>|z| [95% conf. interval]
-------------+----------------------------------------------------------------
age | -0.025 0.020 -1.26 0.209 -0.063 0.014
race |
Black | 0.454 0.288 1.58 0.114 -0.110 1.019
Other | 0.343 0.213 1.61 0.107 -0.074 0.760
_cons | -0.120 0.486 -0.25 0.805 -1.072 0.832
------------------------------------------------------------------------------
. margins, expression((normal(_b[_cons]+_b[age]*age+_b[2.race]*2.race + _b[3.race]*3.race) ///
> -normal(_b[_cons] + _b[age]*age))/normal(_b[_cons] + _b[age]*age)) dydx(race)
Average marginal effects Number of obs = 189
Model VCE: OIM
Expression: (normal(_b[_cons]+_b[age]*age+_b[2.race]*2.race + _b[3.race]*3.race)
-normal(_b[_cons] + _b[age]*age))/normal(_b[_cons] + _b[age]*age)
dy/dx wrt: 2.race 3.race
------------------------------------------------------------------------------
| Delta-method
| dy/dx std. err. z P>|z| [95% conf. interval]
-------------+----------------------------------------------------------------
race |
Black | 0.663 0.502 1.32 0.187 -0.321 1.646
Other | 0.487 0.365 1.33 0.182 -0.229 1.203
------------------------------------------------------------------------------
Note: dy/dx for factor levels is the discrete change from the base level.
在 probit 回归中,我们通过使用母亲年龄和种族类别来计算低出生体重婴儿的概率。我们得到了黑人母亲与白人母亲、其他母亲与白人母亲的预测概率的比例变化。
. webuse dollhill3, clear
. poisson deaths smokes i.agecat, exposure(pyears)
Poisson regression Number of obs = 10
LR chi2(5) = 922.93
Prob > chi2 = 0.0000
Log likelihood = -33.600153 Pseudo R2 = 0.9321
------------------------------------------------------------------------------
deaths | Coefficient Std. err. z P>|z| [95% conf. interval]
-------------+----------------------------------------------------------------
smokes | 0.355 0.107 3.30 0.001 0.144 0.565
agecat |
45–54 | 1.484 0.195 7.61 0.000 1.102 1.866
55–64 | 2.628 0.184 14.30 0.000 2.267 2.988
65–74 | 3.350 0.185 18.13 0.000 2.988 3.713
75–84 | 3.700 0.192 19.25 0.000 3.323 4.077
_cons | -7.919 0.192 -41.30 0.000 -8.295 -7.543
ln(pyears) | 1.000 (exposure)
------------------------------------------------------------------------------
. margins, expression((exp(_b[smokes]*smokes+_b[2.agecat]*2.agecat+_b[3.agecat]*3.agecat ///
> +_b[4.agecat]*4.agecat+_b[5.agecat]*5.agecat+_ b[_cons])*pyears ///
> -exp(_b[smokes]*smokes+_ b[_cons])*pyears)/(exp(_b[smokes]*smokes+_b[_cons])*pyears)) ///
> dydx(agecat)
Average marginal effects Number of obs = 10
Model VCE: OIM
Expression: (exp(_b[smokes]*smokes+_b[2.agecat]*2.agecat+_b[3.agecat]*3.agecat
+_b[4.agecat]*4.agecat+_b[5.agecat]*5.agecat+_ b[_cons])*pyears
-exp(_b[smokes]*smokes+_ b[_cons])*pyears)/(exp(_b[smokes]*smokes+_b[_cons])*pyears)
dy/dx wrt: 2.agecat 3.agecat 4.agecat 5.agecat
------------------------------------------------------------------------------
| Delta-method
| dy/dx std. err. z P>|z| [95% conf. interval]
-------------+----------------------------------------------------------------
agecat |
45–54 | 3.411 0.861 3.96 0.000 1.724 5.097
55–64 | 12.839 2.543 5.05 0.000 7.856 17.823
65–74 | 27.517 5.270 5.22 0.000 17.188 37.846
75–84 | 39.451 7.776 5.07 0.000 24.211 54.691
------------------------------------------------------------------------------
Note: dy/dx for factor levels is the discrete change from the base level.
在 poisson 回归中,死亡人数由吸烟状况和年龄类别解释。预测死亡人数的比例变化是通过比较每个年龄组与基数计算出来的。margins
作用于结果的边际预测,其中预测在 ols 回归中等于 ,在 probit 回归中等于 ,在 poisson 回归中等于 。此外,margins
计算每个观察的预测,并报告平均值作为预测边际。
5. expression 选项
margins, expression()
中的函数形式可以根据需要灵活设定。让我们回到 probit 回归。
. webuse lbw, clear
. probit low c.age##i.race
Probit regression Number of obs = 189
LR chi2(5) = 8.16
Prob > chi2 = 0.1475
Log likelihood = -113.25455 Pseudo R2 = 0.0348
------------------------------------------------------------------------------
low | Coefficient Std. err. z P>|z| [95% conf. interval]
-------------+----------------------------------------------------------------
age | -0.033 0.027 -1.24 0.215 -0.086 0.019
race |
Black | -0.971 1.282 -0.76 0.449 -3.483 1.541
Other | 0.433 1.044 0.41 0.678 -1.613 2.478
race#c.age |
Black | 0.065 0.056 1.15 0.249 -0.046 0.176
Other | -0.005 0.045 -0.10 0.917 -0.093 0.083
_cons | 0.090 0.652 0.14 0.891 -1.189 1.368
------------------------------------------------------------------------------
. margins, eydx(age)
Average marginal effects Number of obs = 189
Model VCE: OIM
Expression: Pr(low), predict()
ey/dx wrt: age
------------------------------------------------------------------------------
| Delta-method
| ey/dx std. err. z P>|z| [95% conf. interval]
-------------+----------------------------------------------------------------
age | -0.032 0.023 -1.36 0.174 -0.078 0.014
------------------------------------------------------------------------------
下面是获得 margin, eydx(age)
的函数形式:
在 expression()
选项中,对于像线性预测这样的事情,不需要写出表达式。因此,上述比例变化可以通过如下方式计算得到:
. margins, expression((_b[age] + _b[2.race#c.age]*2.race + _b[3.race#c.age]* ///
> 3.race)*normalden(predict(xb)) / normal(predict(xb)))
Predictive margins Number of obs = 189
Model VCE: OIM
Expression: (_b[age] + _b[2.race#c.age]*2.race + _b[3.race#c.age]*
3.race)*normalden(predict(xb))/normal(predict(xb))
------------------------------------------------------------------------------
| Delta-method
| Margin std. err. z P>|z| [95% conf. interval]
-------------+----------------------------------------------------------------
_cons | -0.032 0.023 -1.36 0.174 -0.078 0.014
------------------------------------------------------------------------------
其中 predict(xb)
为快捷式,表示线性预测。此外,normal(predict(xb))
可以用 predict(pr)
代替,pr
代表阳性结果的概率。margins
中的 expression()
选项允许我们构造任何带有估计参数的函数,并将它们返回给 margins
。然后,我们可以使用所有的计算和图形工具 marginsplot
来可视化结果。
. quietly margins r.race, expression((_b[age] + _b[2.race#c.age]*2.race ///
> + _b[3.race#c.age]*3.race)*normalden(predict(xb))/normal(predict(xb))) ///
> at(age=(14(5)50))
. quietly marginsplot, noci ytitle("expression in -margins-")
6. 相关推文
Note:产生如下推文列表的 Stata 命令为:
lianxh 边际效应, m
安装最新版lianxh
命令:
ssc install lianxh, replace
专题:Stata教程 Stata-Python交互-5:边际效应三维立体图示 专题:回归分析 Stata:边际效应知多少?f_able命令(上) Stata:边际效应知多少?f_able命令(下) Stata: 手动计算和图示边际效应 Stata: 边际效应分析 专题:交乘项-调节 Logit-Probit中的交乘项及边际效应图示 Stata:图示连续变量的连续边际效应 专题:Probit-Logit Logit-Probit:非线性模型中交互项的边际效应解读 专题:分位数回归 Stata分位数回归I:理解边际效应和条件边际效应
课程推荐:因果推断实用计量方法
主讲老师:丘嘉平教授
🍓 课程主页:https://gitee.com/lianxh/YGqjp
New! Stata 搜索神器:
lianxh
和songbl
GIF 动图介绍
搜: 推文、数据分享、期刊论文、重现代码 ……
👉 安装:
. ssc install lianxh
. ssc install songbl
👉 使用:
. lianxh DID 倍分法
. songbl all
🍏 关于我们
连享会 ( www.lianxh.cn,推文列表) 由中山大学连玉君老师团队创办,定期分享实证分析经验。 直通车: 👉【**百度一下:**连享会】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。