Stata连享会 主页 || 视频 || 推文 || 知乎 || Bilibili 站
温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
New!
lianxh
命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc
,ihelp
,rdbalance
,gitee
,installpkg
⛳ Stata 系列推文:
江 鑫 (安徽大学),jiangxin199566@foxmail.com
徐云娇 (厦门大学),jilyo@stu.xmu.edu.cn
编者按:本文主要摘译自下文,特此致谢!
Source:Rios-Avila F. Estimation of marginal effects for models with alternative variable transformations[J]. The Stata Journal, 2021, 21(1): 81-96. -PDF-
目录
margins
是一个强大的后估计命令,它可以估计官方和社区贡献命令的边际效应,并具有明确定义的预测结果 (请参阅 predict
)。虽然使用 factor variable
表示法使我们能够在使用交互作用和多项式时轻松估计边际效应,但在使用其他类型的变换 (如样条、对数或分数多项式等) 时,估计边际效应仍然是一个挑战。本文介绍了如何使用命令 f_able
扩展 margins
功能以分析其他变量转换。
如前所述,假设其他协变量保持不变,边际效应是衡量自变量变化对因变量影响的有用统计数据。在大多数计量经济学入门课程开始时,很少强调理解这个概念,因为对于线性回归,边际效应通常等于与所分析变量相关的系数。考虑以下线性回归模型:
在外生性和正确模型规范的标准假设下 (Wooldridge,2016),可以使用普通最小二乘法 (OLS) 估计该模型的系数。在这个简单的模型中,
这意味着对于简单的线性回归 (如方程 1),其中每个变量只出现一次,并且没有任何变换,边际效应直接由估计系数确定。此外,非线性变换和因变量的相互作用也可以包含在线性回归模型中。由于模型在参数上仍然是线性的,因此可以使用 OLS 进行估计。但是,在估计边际效应时需要格外小心,以考虑变量转换的相互依赖性。例如,考虑以下模型:
在这个模型中,
因为这些影响不再是常数的,我们必须决定报告什么来呈现边际效应。虽然我们可以报告显示这些边际效应的所有可能值的图,但标准做法是呈现平均边际效应。对于上面的示例,它们都是相同的:
掌握了这些信息,并假设
大多数软件 (包括 Stata) 的问题在于,除非提供额外信息,否则它可能无法认识到某些变量通过构造相互关联,并且 “其他一切都保持不变” 的假设是不正确的。 在 Stata 的情况下,除非考虑进一步的步骤,否则在因子变量出现之前,它无法自动调整这些相互关系,从而提供对边际效应的错误估计。当我们超越简单的相互作用或多项式时,Stata 仍然无法掌握这些相互关系。
下面,我们使用在线提供的数据集 “每月酒后驾驶引证的虚构数据” 为小伙伴们举个栗子。现在考虑以下模型:
在 Stata 11 和因子表示法之前,如果我们想估计这样的模型,我们需要在将它们包含在模型中之前创建所有变量。例如,创建一个名为
. webuse dui, clear
(Fictional data on monthly drunk driving citations)
. gen fines2=fines^2
. regress citations fines fines2
Source | SS df MS Number of obs = 500
----------+--------------------------------- F(2, 497) = 189.57
Model | 20750.38 2 10375.19 Prob > F = 0.0000
Residual | 27200.458 497 54.7292917 R-squared = 0.4327
----------+--------------------------------- Adj R-squared = 0.4305
Total | 47950.838 499 96.0938637 Root MSE = 7.3979
--------------------------------------------------------------------------
citations | Coef. Std. Err. t P>|t| [95% Conf. Interval]
----------+---------------------------------------------------------------
fines | -47.109 7.692 -6.12 0.000 -62.221 -31.997
fines2 | 1.981 0.389 5.10 0.000 1.217 2.744
_cons | 293.007 37.943 7.72 0.000 218.459 367.555
--------------------------------------------------------------------------
因为 Stata 无法知道 margins
来计算 fines
对 citations
的边际影响会得到错误的答案,因为
. margins, dydx(fines)
Average marginal effects Number of obs = 500
Model VCE : OLS
Expression : Linear prediction, predict()
dy/dx w.r.t. : fines
---------------------------------------------------------------------
| Delta-method
| dy/dx Std. Err. t P>|t| [95% Conf. Interval]
-------+-------------------------------------------------------------
fines | -47.109 7.692 -6.12 0.000 -62.221 -31.997
---------------------------------------------------------------------
然而,使用微积分,可以很容易地手工推导出平均边际效应,方法是取式 (3) 对罚款的导数,估计平均值作为参考点,并使用类似 lincom
的命令来计算边际效应和标准误差。
. sum fines, meanonly
. lincom _b[fines]+2*_b[fines2]*`r(mean)'
(1) fines + 19.7904*fines2 = 0
---------------------------------------------------------------------
citations | Coef. Std. Err. t P>|t| [95% Conf. Interval]
----------+----------------------------------------------------------
(1) | -7.907 0.424 -18.66 0.000 -8.740 -7.075
---------------------------------------------------------------------
当然,自 Stata 11 以来,估计这样的模型的边际效应要容易得多。使用因子表示法,我们只需添加平方参数,让 margins
自行处理交互。
. qui: regress citations fines c.fines#c.fines
. margins, dydx(fines)
Average marginal effects Number of obs = 500
Model VCE : OLS
Expression : Linear prediction, predict()
dy/dx w.r.t. : fines
-----------------------------------------------------------------
| Delta-method
| dy/dx Std. Err. t P>|t| [95% Conf. Interval]
-------+---------------------------------------------------------
fines | -7.907 0.424 -18.66 0.000 -8.740 -7.075
-----------------------------------------------------------------
对其工作原理的理解是,无论谁在 margins
和因子表示法背后进行编码,都能够 “教” Stata 如何获取多项式的导数。换句话说,Stata 认识到当存在像 c.var1#c.var1
这样的表达式时,它在内部 “知道” 解析导数是 2*c.var1
。因此,在提供结果之前,margins
只是使用此信息来处理平方参数 c.fines#c.fines
。
虽然这对于更好地理解边际效应来说是一个很大的进步,但它确实有其局限性。例如,margins
将无法估计以下模型的边际效应:
虽然在数学上,平均边际效应 (AME) 和均值边际效应 (MEM) 可以直接推导出,见下表:
AME | MEM | |
---|---|---|
Model1 | ||
Model2 | ||
Model3 |
可用于手动估计平均边际效应。为简单起见,我将专注于平均边际效应的估计:
. gen i_fines=1/fines
. gen ni_fines2=-1/fines^2
. gen fines05=fines^.5
. gen i_fines05=0.5*fines^-.5
. gen fines_99=max((fines-9.9),0)
. gen dfines_99=fines>9.9
. * model 1
. qui:regress citations i_fines
. sum ni_fines2, meanonly
. lincom _b[i_fines]*`r(mean)'
(1) - .0104108*i_fines = 0
------------------------------------------------------------------------------
citations | Coef. Std. Err. t P>|t| [95% Conf. Interval]
-------------+----------------------------------------------------------------
(1) | -8.091099 .4224389 -19.15 0.000 -8.921081 -7.261117
------------------------------------------------------------------------------
. * model 2
. qui:regress citations fines05
. sum i_fines05, meanonly
. lincom _b[fines05]*`r(mean)'
(1) 1593264*fines05 = 0
------------------------------------------------------------------------------
citations | Coef. Std. Err. t P>|t| [95% Conf. Interval]
-------------+----------------------------------------------------------------
(1) | -8.010351 .4314167 -18.57 0.000 -8.857972 -7.162729
------------------------------------------------------------------------------
. * model 3
. qui:regress citations fines fines_99
. sum dfines_99, meanonly
. lincom _b[fines]+_b[fines_99]*`r(mean)'
(1) fines + .5*fines_99 = 0
------------------------------------------------------------------------------
citations | Coef. Std. Err. t P>|t| [95% Conf. Interval]
-------------+----------------------------------------------------------------
(1) | -7.926694 .4271729 -18.56 0.000 -8.765981 -7.087407
------------------------------------------------------------------------------
当然,对于这些模型,我们也可以选择使用 nl
来估计边际效应,这需要较少的工作:
. qui:nl (citations = {b0}+{b1}/fines), variable(fines)
. margins, dydx(fines)
---------------------------------------------------------------------
| Delta-method
| dy/dx Std. Err. z P>|z| [95% Conf. Interval]
-------+-------------------------------------------------------------
fines | -8.091 0.422 -19.15 0.000 -8.919 -7.263
---------------------------------------------------------------------
. qui:nl (citations = {b0}+{b1}*fines^.5), variable(fines)
. margins, dydx(fines)
---------------------------------------------------------------------
| Delta-method
| dy/dx Std. Err. z P>|z| [95% Conf. Interval]
-------+-------------------------------------------------------------
fines | -8.010 0.431 -18.57 0.000 -8.856 -7.165
---------------------------------------------------------------------
. qui:nl (citations = {b0}+{b1}*fines+{b2}*max((fines-9.9),0)), variable(fines)
. margins, dydx(fines)
---------------------------------------------------------------------
| Delta-method
| dy/dx Std. Err. z P>|z| [95% Conf. Interval]
-------+-------------------------------------------------------------
fines | -7.927 0.427 -18.56 0.000 -8.764 -7.089
---------------------------------------------------------------------
nl
用非标准变换估计边际效应的这种灵活性引发了以下问题:为什么 nl
可以 “正确” 估计边际效应,而 regress
不能?答案相当简单,我们没有在模型中使用构造变量,而是使用原始变量并让 nl
处理新变量的构造。这意味着,虽然我们看到这个模型正在被估计:
但程序后台中可能发生的事情是,Stata 在拟合模型之前识别出此代码的哪些元素是要估计的参数 (括号内的那些),以及需要创建哪些元素 (
其中 nl
知道
但是,nl
怎么知道 nl
不知道。 Stata 可能知道的唯一类型的分析导数是什么时候有交互作用 (同样是因子表示法)。然而,因为它 “记住” 了一个变量是如何构造的,所以它可以使用数值导数来对解析导数进行合理的近似。对于上面的简化情况,变换
其中,margins
不需要知道如何获得解析导数,因为它可以使用数值导数来代替,并使用此信息来估计适当的边际效应。
免费公开课
最新课程-直播课
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 | 文本分析、机器学习、效率专题、生存分析等 | |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
⛳ 课程主页
⛳ 课程主页
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会-常见问题解答:
✨ https://gitee.com/lianxh/Course/wikis
New!
lianxh
命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh