Stata连享会 主页 || 视频 || 推文 || 知乎 || Bilibili 站
温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
New!
lianxh
命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc
,ihelp
,rdbalance
,gitee
,installpkg
⛳ Stata 系列推文:
江鑫 (安徽大学),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-
目录
在前面的部分中,我概述了应该如何估计边际效应,以及如何使用该信息来获得平均边际效应,并将逐步计算程序与 margins
进行比较。我还描述了 nl
能够估计除交互作用之外的变量变换的边际效应,使用数值导数来近似解析导数。事实上,在估计非线性模型时,已经使用数值导数来估计边际效应。
换句话说,当模型中使用交互和多项式以外的变换时,Stata 已经具有估计边际效应的能力。但是,还有一个方面需要解决,即如何告诉 Stata 一个变量 Z 是基于模型规范中的另一个变量 X 构造的?我们在本文中建议的一种可能的解决方案是使用变量标签来 “存储” 用于创建感兴趣变量的转换。为了自动化这个过程,我们提出了两个小程序,它们 “包装” 了 Stata 的内置命令 generate
和 replace
。
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 为因变量,以 fines 和 fines2 为自变量来估计模型。 fines2 是我们之前定义为 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.
同样,也可以通过 regress
和 f_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 模型。边际需要包括选项 nochain
和 numeric
。我们实践了预测概率和各种 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)
在本文中,我描述了如何使用解析导数和数值导数来估计边际效应。我们还介绍了 2 个小程序,当使用变量交互和多项式之外的转换时,这些小程序可以使 marginal
估计边际效应。
这些命令可用于估计其他官方 Stata 命令以及其他社区贡献的命令的边际效应,并可以产生合理的预测结果。该策略确实有四个限制:
f_able
迫使 margins
做一些它不应该做的事情,当请求特别复杂时,人们可能会遇到估计边际效应和标准误差的困难。虽然估计精度的限制是不可避免的,但可以在一定程度上规避其他限制。
o.
将原始变量添加到解释变量列表中。这从估计中省略了原始变量,但将其保留在解释变量列表中,从而允许估计边际;note
。这对存储信息的长度有较少的限制;nochain
强制大多数命令使用数值导数来估计边际效应,但一些命令 (如 probit
、logit
和 Poisson
) 要求使用选项 nochain numeric
。如果点估计出现缺失,选项 noestimcheck
可用于绕过产生此错误的 margins
中的一些安全检查。最后,如果在估计多个兴趣点的边际效应时缺少标准误差,仍然可以通过使用较少的兴趣点甚至一次使用一个兴趣点来估计它们。
Note:产生如下推文列表的 Stata 命令为:
lianxh 边际, m
安装最新版lianxh
命令:
ssc install lianxh, replace
免费公开课
最新课程-直播课
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 | 文本分析、机器学习、效率专题、生存分析等 | |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
⛳ 课程主页
⛳ 课程主页
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会-常见问题解答:
✨ https://gitee.com/lianxh/Course/wikis
New!
lianxh
命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh