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

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

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
陈波 (深圳大学),1900123011@email.szu.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-


目录


4. f_able:任意变量变换的边际效应

在前面的部分中,我概述了应该如何估计边际效应,以及如何使用该信息来获得平均边际效应,并将逐步计算程序与 margins 进行比较。我还描述了 nl 能够估计除交互作用之外的变量变换的边际效应,使用数值导数来近似解析导数。事实上,在估计非线性模型时,已经使用数值导数来估计边际效应。

换句话说,当模型中使用交互和多项式以外的变换时,Stata 已经具有估计边际效应的能力。但是,还有一个方面需要解决,即如何告诉 Stata 一个变量 Z 是基于模型规范中的另一个变量 X 构造的?我们在本文中建议的一种可能的解决方案是使用变量标签来 “存储” 用于创建感兴趣变量的转换。为了自动化这个过程,我们提出了两个小程序,它们 “包装” 了 Stata 的内置命令 generatereplace

program fgen  
   syntax newvarname =/exp [if] [in]  
   gen `typelist' `varlist'=`exp'  
   label var `varlist' "`exp'" 
end 
   
program frep  
   syntax varname =/exp [if] [in]  
   replace `varlist'=`exp'  
   label var `varlist' "`exp'" 
end

这两个命令只做一件事。当一个新变量被创建时,Stata 会用创建它的表达式来标记它,如果值被替换,它会将标签更改为使用的新表达式。

考虑方程 (4) 中的模型 3,我们可以使用上面定义的命令创建感兴趣的变量。由于我在创建此代码时犯了一个错误,我将使用第二个命令纠正它,并将值 fines2 替换为正确的内容。

· webuse dui,clear (重新调用数据集)
. fgen fines2=max(fines-9,0)  
. describe fines2 

              storage   display    value
variable name   type    format     label      variable label
---------------------------------------------------------------
fines2          float   %9.0g                 max(fines-9,0)

 
. frep fines2=max(fines-9.9,0) (420 real changes made)  
. describe fines2   

              storage   display    value
variable name   type    format     label      variable label
---------------------------------------------------------------
fines2          float   %9.0g                 max(fines-9.9, 0)

除了为下一步边际效应估计设置数据外,这些命令还可用于跟踪变量是如何创建或修改的。最后一步是明确告诉 Stata 某个特定变量是基于模型中的其他变量构建的,并且在估计边际效应时,每次原始变量发生变化时都需要更新构建的变量。 这可以通过以下两个程序来完成:

program f_able, eclass
  syntax, [* NLvar(varlist)]  
  _ms_dydx_parse `nlvar'  
  if "`e(predict_old)'"=="" { 
  ereturn local predict_old `e(predict)'  
  ereturn local predict f_able_p  
  }  
  foreach i of varlist `nlvar' {  
     local fnc:variable label `i'  
	 ereturn hidden local _`i' `fnc'  
  }  
  ereturn local nldepvar `nlvar' 
end  

program f_able_p
  syntax newvarname [if] [in], [*]
  local idepvar `e(nldepvar)'
  foreach i of local idepvar {
               tempvar _`i'
			   qui:clonevar `_`i''=`i'
			   qui:recast double `i'
			   qui:replace `i'=`e(_`i')'  
  }  
  `e(predict_old)' `0'
  foreach i of local idepvar {
      if "`i'"!="_cons" {
	        qui:replace `i'=`_`i''
		}
  } 
end 

第一个程序 f_able 做了三件事。首先,它向任何先前估计的模型添加信息,指示哪些变量是使用 e(nldepvar) 构造的变量。它还添加了包含有关所用数据转换信息的隐藏宏。最后,它将预测从原始 e(predict) 命令重定向到我在下面定义为 f_able_p 的命令,但将原始信息保留在 e(predict_old) 中。

第二个程序 f_able_p 的唯一目的是更新在 e(nldepvar) 中标识的构造变量,然后使用先前存储在隐藏宏中的信息继续获得适合估计命令 e(predict_old) 的预测值。

有了这两段代码,最后一步是简单地调用 margins 来估计边际效应,使用选项 nochainrule。这是使用官方 Stata 命令时经常被忽略的选项。但是,正如其帮助文件所示:nochainrule 更安全,因为它不假设参数和协变量如何连接以形成响应。这意味着当估计如下模型时:

. regress citations fines fines2 
. f_able, nl(fines2) 

如果将 fines2 识别为构造变量,则将使用 fines 系数计算有关的边际效应,并且 fines2 乘以 fines2 相对于罚款的数值导数。让我们看看这是如何工作的 (方法 1)。

. qui: regress citations fines fines2 
. f_able, nlvar(fines2) 
. margins, dydx(fines) nochainrule 

Average marginal effects                           Number of obs =  500
Model VCE    : OLS
Expression   : Fitted values, predict()
dy/dx w.r.t. : fines
-----------------------------------------------------------------------
       |           Delta-method
       |     dy/dx   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------+---------------------------------------------------------------
 fines | -7.926694   .4271729   -18.56   0.000    -8.763937   -7.089451
-----------------------------------------------------------------------

第一行以 citations 为因变量,以 finesfines2 为自变量来估计模型。 fines2 是我们之前定义为 max(fines9.9,0) ;第二行调用 f_able 来识别 fines2 是一个构造变量;最后一步使用 nochainrule 估计边际效应。结果与手工或使用 nl 命令的结果相同。

它们也可以使用 npregress series 系列进行复制 (方法 2)。

. npregress series citations fines, spline(1) knots(1) 

Computing approximating function
Computing average derivatives
Linear-spline estimation                   Number of obs      =     500
                                           Number of knots    =       1
------------------------------------------------------------------------
           |              Robust                                        
 citations |    Effect   Std. Err.      z    P>|z|  [95% Conf. Interval]
-----------+------------------------------------------------------------
     fines | -7.926694   .4772213   -16.61   0.000  -8.86203   -6.991357
------------------------------------------------------------------------
Note: Effect estimates are averages of derivatives.

值得注意,虽然点估计相同,但 npregress series 产生的标准误差比使用 nl或建议策略产生的标准误差稍大。

我们还可以将 f_able 与使用因子表示法的输出进行比较:

. *方法 1
. qui:regress citations c.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.928817   .4226225   -18.76   0.000  -8.759168   -7.098465
---------------------------------------------------------------------

. *方法 2
. frep fines2 = (fines)^2
. fgen fines3=fines^3 
. qui:regress citations fines fines2 fines3 
. f_able, nlvar(fines2 fines3) 
. margins, dydx(fines) nochainrule

Average marginal effects                       Number of obs   =  500
Model VCE    : OLS
Expression   : Fitted values, predict()
dy/dx w.r.t. : fines

---------------------------------------------------------------------
       |           Delta-method                                      
       |     dy/dx   Std. Err.      z    P>|z|   [95% Conf. Interval]
-------+-------------------------------------------------------------
 fines | -7.928819   .4226228   -18.76   0.000  -8.757144   -7.100493
---------------------------------------------------------------------

可以看出,当使用因子表示法时,该方法复制了最多 5 个小数位的结果,但由于强制使用数值导数,会损失一定程度的精度。

最后,我们做了一个更具挑战性的估计,将因子符号的使用与 f_able 结合起来,并将其与 npregress series 的输出进行比较。

. *这里为啥是连续交互项呢?各位可以help一下
. npregress series citations fines i.csize, spline(2) knots(1) 

Computing approximating function
Computing average derivatives
Quadratic-spline estimation                            Number of obs      =   500
                                                       Number of knots    =     1
---------------------------------------------------------------------------------
                   |              Robust                                          
         citations |    Effect   Std. Err.      z    P>|z|   [95% Conf. Interval]
-------------------+-------------------------------------------------------------
             fines | -7.590817   .3533786   -21.48   0.000  -8.283427   -6.898208
                   |                                                             
             csize |                                                             
(medium vs small)  |   5.48074   .5827045     9.41   0.000    4.33866    6.622819
 (large vs small)  |  10.69879   .6043375    17.70   0.000   9.514311    11.88327
---------------------------------------------------------------------------------
Note: Effect estimates are averages of derivatives for continuous covariates 
      and averages of contrasts for factor covariates.

同样,也可以通过 regressf_able 实现。

. webuse dui,clear 
. fgen double fines2=fines^2 
. fgen double fines3=max(fines-9.9,0)^2 
. qui:regress citations c.(fines fines2 fines3)##i.csize 
. f_able, nlvar(fines2 fines3) 
. margins, dydx(fines csize) nochainrule 

Average marginal effects                        Number of obs     =        500
Model VCE    : OLS
Expression   : Fitted values, predict()
dy/dx w.r.t. : fines 2.csize 3.csize

------------------------------------------------------------------------------
             |            Delta-method
             |      dy/dx   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
       fines |  -7.590817   .3350831   -22.65   0.000    -8.247568   -6.934066
             |
       csize |
     medium  |   5.480738   .6522748     8.40   0.000     4.202303    6.759174
      large  |   10.69879   .6171921    17.33   0.000     9.489118    11.90847
------------------------------------------------------------------------------
Note: dy/dx for factor levels is the discrete change from the base level.

再一次,我们可以在点估计中以非常小的差异复制输出,但在标准误方面存在一些差异,这可能是由于在 npregress 中如何使用自由度造成的。

我们也可以将此策略用于 OLS 以外的模型。与命令 mkspline 的帮助文件中提供的示例类似,我创建了 4 个变量以允许具有 4 个节点的线性样条,并根据 dosage 和构建的变量估计结果的 logit 模型。边际需要包括选项 nochainnumeric。我们实践了预测概率和各种 dosage 值的边际效应。

webuse mksp2, clear 
fgen dos1=max(dosage-17.5,0) 
fgen dos2=max(dosage-36.5,0) 
fgen dos3=max(dosage-55.5,0) 
fgen dos4=max(dosage-81.5,0)
qui: logit outcome dosage dos1 dos2 dos3 dos4 
f_able, nl(dos1 dos2 dos3 dos4) 
qui: margins , nochain numerical at(dosage=(0(2)100)) 
marginsplot, name(m1) 
qui: margins , dydx(dosage) nochain numerical at(dosage=(0(2)100)) 
marginsplot, name(m2) 
graph combine m1 m2, xsize(8) scale(1.5) 

Figure 1. Predicted probabilities and Marginal effects
Figure 1. Predicted probabilities and Marginal effects

5.结论

在本文中,我描述了如何使用解析导数和数值导数来估计边际效应。我们还介绍了 2 个小程序,当使用变量交互和多项式之外的转换时,这些小程序可以使 marginal 估计边际效应。

这些命令可用于估计其他官方 Stata 命令以及其他社区贡献的命令的边际效应,并可以产生合理的预测结果。该策略确实有四个限制:

  • 第一,估计的边际效应取决于强制数值导数的精度;
  • 第二,它要求模型规范中存在原始变量,以便可以使用边际效应;
  • 第三,由于变量标签长度的限制,变量构造的信息限制为 80 个字符;
  • 第四,因为 f_able 迫使 margins 做一些它不应该做的事情,当请求特别复杂时,人们可能会遇到估计边际效应和标准误差的困难。

虽然估计精度的限制是不可避免的,但可以在一定程度上规避其他限制。

  • 首先,可以使用 o. 将原始变量添加到解释变量列表中。这从估计中省略了原始变量,但将其保留在解释变量列表中,从而允许估计边际;
  • 其次,可以修改程序来存储和收集转换信息作为变量 note。这对存储信息的长度有较少的限制;
  • 最后一个限制可以通过仔细的故障排除来解决。虽然选项 nochain 强制大多数命令使用数值导数来估计边际效应,但一些命令 (如 probitlogitPoisson) 要求使用选项 nochain numeric。如果点估计出现缺失,选项 noestimcheck 可用于绕过产生此错误的 margins 中的一些安全检查。最后,如果在估计多个兴趣点的边际效应时缺少标准误差,仍然可以通过使用较少的兴趣点甚至一次使用一个兴趣点来估计它们。

6. 参考资料

  • Poi B P. Stata tip 58: nl is not just for nonlinear models[J]. Stata Journal, 2008, 8(199-2016-2518): 139-141. -PDF-
  • Royston P. marginscontplot: Plotting the marginal effects of continuous predictors[J]. The Stata Journal, 2013, 13(3): 510-527. -PDF-
  • Williams R. Using the margins command to estimate and interpret adjusted predictions and marginal effects[J]. The Stata Journal, 2012, 12(2): 308-331. -PDF- Wooldridge, Jeffrey M. 2016. Introductory econometrics: A modern approach: Nelson Education. -Link-

7. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh 边际, m
安装最新版 lianxh 命令:
ssc install lianxh, replace

相关课程

免费公开课

最新课程-直播课

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

课程主页

课程主页

关于我们

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

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

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

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

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