Stata:边际效应知多少?f_able命令(上)

发布时间:2021-07-20 阅读 2739

Stata连享会   主页 || 视频 || 推文 || 知乎 || Bilibili 站

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

New! lianxh 命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc, ihelp, rdbalance, gitee, installpkg

课程详情 https://gitee.com/lianxh/Course

课程主页 https://gitee.com/lianxh/Course

⛳ Stata 系列推文:

PDF下载 - 推文合集

江  鑫 (安徽大学),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-


目录


1. 背景介绍

margins 是一个强大的后估计命令,它可以估计官方和社区贡献命令的边际效应,并具有明确定义的预测结果 (请参阅 predict)。虽然使用 factor variable 表示法使我们能够在使用交互作用和多项式时轻松估计边际效应,但在使用其他类型的变换 (如样条、对数或分数多项式等) 时,估计边际效应仍然是一个挑战。本文介绍了如何使用命令 f_able 扩展 margins 功能以分析其他变量转换。

2. 边际效应:理论方法

如前所述,假设其他协变量保持不变,边际效应是衡量自变量变化对因变量影响的有用统计数据。在大多数计量经济学入门课程开始时,很少强调理解这个概念,因为对于线性回归,边际效应通常等于与所分析变量相关的系数。考虑以下线性回归模型:

在外生性和正确模型规范的标准假设下 (Wooldridge,2016),可以使用普通最小二乘法 (OLS) 估计该模型的系数。在这个简单的模型中,x1 对 y 和 x2 对 y 的边际效应将分别由 b1 和 b2 给出。其数学表示形式如下:

这意味着对于简单的线性回归 (如方程 1),其中每个变量只出现一次,并且没有任何变换,边际效应直接由估计系数确定。此外,非线性变换和因变量的相互作用也可以包含在线性回归模型中。由于模型在参数上仍然是线性的,因此可以使用 OLS 进行估计。但是,在估计边际效应时需要格外小心,以考虑变量转换的相互依赖性。例如,考虑以下模型:

在这个模型中,x1 对 y 的边际效应不再是一个常数,它现在取决于 x1 和 x2 的值。然而,使用微积分,很容易从这个模型中推导出边际效应:

因为这些影响不再是常数的,我们必须决定报告什么来呈现边际效应。虽然我们可以报告显示这些边际效应的所有可能值的图,但标准做法是呈现平均边际效应。对于上面的示例,它们都是相同的:

掌握了这些信息,并假设 x1 和 x2 是非随机的,可以立即估计与平均边际效应相关的标准误差,并且将完成分析的技术部分。

大多数软件 (包括 Stata) 的问题在于,除非提供额外信息,否则它可能无法认识到某些变量通过构造相互关联,并且 “其他一切都保持不变” 的假设是不正确的。 在 Stata 的情况下,除非考虑进一步的步骤,否则在因子变量出现之前,它无法自动调整这些相互关系,从而提供对边际效应的错误估计。当我们超越简单的相互作用或多项式时,Stata 仍然无法掌握这些相互关系。

3. 边际效应:实证方法

下面,我们使用在线提供的数据集 “每月酒后驾驶引证的虚构数据” 为小伙伴们举个栗子。现在考虑以下模型:

在 Stata 11 和因子表示法之前,如果我们想估计这样的模型,我们需要在将它们包含在模型中之前创建所有变量。例如,创建一个名为 fines2 的变量等于 fines2

. 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 无法知道 fines2=fines2,所以使用 margins 来计算 finescitations 的边际影响会得到错误的答案,因为 fines2 不能被正确处理。

. 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 b1E(1finesi2) b11E(finesi)2
Model2 0.5b1E(finesi0.5) 0.5b1E(finesi)0.5
Model3 b1+b2E(1(finesi>9.9)) b1+b21(E(finesi)>9.9)

可用于手动估计平均边际效应。为简单起见,我将专注于平均边际效应的估计:

. 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 在拟合模型之前识别出此代码的哪些元素是要估计的参数 (括号内的那些),以及需要创建哪些元素 (fines0.5)。换句话说,Stata 只是在估算以下内容:

其中 __000000 是一个临时变量,你永远不会看到,它被构造为 fines0.5。不同之处在于 nl 知道 __000000=fines0.5

但是,nl 怎么知道 fines0.5 的导数是 0.5fines0.5。答案是 nl 不知道。 Stata 可能知道的唯一类型的分析导数是什么时候有交互作用 (同样是因子表示法)。然而,因为它 “记住” 了一个变量是如何构造的,所以它可以使用数值导数来对解析导数进行合理的近似。对于上面的简化情况,变换 fines0.5 的数值导数可以近似如下:

其中,h 足够小。这个表达式非常准确。对于这个例子,当 h=1 时,数值导数和解析导数之间的最大绝对差为 0.000423,而当 h=1/2^16 时,最大差为 6.58e-09。这只是意味着 margins 不需要知道如何获得解析导数,因为它可以使用数值导数来代替,并使用此信息来估计适当的边际效应。

相关课程

免费公开课

最新课程-直播课

专题 嘉宾 直播/回看视频
最新专题 文本分析、机器学习、效率专题、生存分析等
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]
  • Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。

课程主页

课程主页

关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 连享会-主页知乎专栏,400+ 推文,实证分析不再抓狂。直播间 有很多视频课程,可以随时观看。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会-常见问题解答:
https://gitee.com/lianxh/Course/wikis

New! lianxh 命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh