Stata连享会 主页 || 视频 || 推文 || 知乎 || Bilibili 站
温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
New!
lianxh
命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc
,ihelp
,rdbalance
,gitee
,installpkg
⛳ Stata 系列推文:
作者:李烨阳 (浙江大学)
邮箱:li_yeyang95@163.com
编者按:本文参考自 Github 上的「SampleFilter」项目,特此致谢!
samplefilter
命令的目的是帮助研究者定位数据拟合过程中的离群值,探索估计结果与理论预期不一致的潜在因素,以期为因果识别导向的科学研究服务。对于该命令的使用,笔者始终倡导要建立在特定的理论基础和客观事实基础之上,而不能简单以追求显著性为主要目标。
—— by 李烨阳2022/6/21 11:24
这是一种反向查找「离群值」的做法。当然,如果初衷不好,可能适得其反。「枪」,可以用来自卫,也可以用来犯罪,完全取决于它被握在谁的手里。
—— by 连玉君2022/6/21 12:34
目录
在实证分析中,离群值、数据清理过程错误等问题的存在会导致回归结果不符合预期,但是由于其可能的原因非常复杂,我们往往需要消耗大量的时间去逐一排查。Github 上一项基于 Python 的开源项目 SampleFilter 为这一问题提供了解决方案。它通过有放回的自抽样,寻找符合预期结果的可行子样本和表现不佳的样本。在此基础上,研究者可以对表现不佳的子样本进行分析,从而更快的找到回归结果不符合预期的原因。
本文首先对 SampleFilter 的基本思想进行介绍,然后使用 Stata 重写该项目,并提供了 Stata 使用范例。
SampleFilter 项目基于 Python 语言编写,其基本思想为:
该项目的具体实现流程如下图所示 (高清图):
本文使用 Stata 重写了 SampleFilter 项目,基本思想和流程与之一致。差别在于,用 Stata 重写的 samplefilter
命令支持分组回归,并对各类回归模型的命令具有较强的兼容性。
samplefilter
命令安装:
cnssc install lxhget, replace
lxhget samplefilter.pkg, install replace
samplefilter
命令语法:
samplefilter eq [if] [in] [ fw pw iw ],
cmd(str) significant(vars)
[subsamplename(newvar) positive(vars) negative(vars)
p_value(#) lr(#) rr(#) k(#) iteration(#)
zvalue dots1 dots2
*]
必选项有:
eq
:模型设定方程,要与所选用的回归命令的要求格式一致;cmd
: 模型回归命令,例如 reg
等significant
:预期显著的变量,最小缩写 sig
。可选项有:
subsamplename
:可行子样本标识变量名,默认字符串为 samplefilter,即该变量将命名为 samplefilter_#,若不分组回归则 # 为 1,分组回归中 # 为分组序号;positive
:预期为正的变量,最小缩写 pos
;negative
:预期为负的变量,最小缩写 neg
;p_value
: 显著性的临界 p
;lr
:初始样本的样本量占总样本比例的下限,默认值 0.5;rr
:初始样本的样本量占总样本比例的上限,默认值 0.7;k
:重复整个过程的批次数,默认值 5;iteration
:每批次的最大迭代次数,默认值 1000;zvalue
:默认求 z
;dots1
:加此选项在每批次寻找可行子样本时打印进度条 (推荐用于模型回归单次运算时间较长,或者 interation 较大时);dots2
:加此选项在每批寻找到的可行子样本基础上,扩大样本时打印进度条 (推荐用于模型回归单次运算时间较长,或者样本量较大时);*
:可以增加任意所选用的回归命令所允许的选项。
本部分给出了使用 samplefilter
命令探测表现不佳样本的几个范例 (说明:本文中的例子只展示命令的使用方法,不考虑现实和理论含义)。
首先导入数据并设定变量的预期显著性 (必须)、符号正负性 (非必须)。
. sysuse auto, clear
. global y price // 被解释变量
. global x mpg rep78 headroom trunk weight length turn displacement gear_ratio foreign // 全部解释变量
. global sig "headroom weight" // 预期显著的变量
. global pos "weight" // 预期符号为正的变量
. global neg "headroom" // 预期符号为负的变量
然后利用 samplefilter
命令探测表现不佳的样本:
. samplefilter $y $x, sig($sig) pos($pos) neg($neg) cmd(reg) p(0.05)
全样本结果:
Source | SS df MS Number of obs = 69
-------------+---------------------------------- F(10, 58) = 8.66
Model | 345416162 10 34541616.2 Prob > F = 0.0000
Residual | 231380797 58 3989324.09 R-squared = 0.5989
-------------+---------------------------------- Adj R-squared = 0.5297
Total | 576796959 68 8482308.22 Root MSE = 1997.3
------------------------------------------------------------------------------
price | Coefficient Std. err. t P>|t| [95% conf. interval]
-------------+----------------------------------------------------------------
mpg | -21.805 77.360 -0.28 0.779 -176.658 133.047
rep78 | 184.793 331.792 0.56 0.580 -479.361 848.948
headroom | -635.492 383.024 -1.66 0.102 -1402.198 131.214
trunk | 71.499 95.050 0.75 0.455 -118.764 261.763
weight | 4.521 1.412 3.20 0.002 1.695 7.347
length | -76.491 40.403 -1.89 0.063 -157.366 4.384
turn | -114.278 123.537 -0.93 0.359 -361.565 133.009
displacement | 11.540 8.378 1.38 0.174 -5.231 28.311
gear_ratio | -318.648 1124.340 -0.28 0.778 -2569.259 1931.964
foreign | 3334.848 957.225 3.48 0.001 1418.754 5250.943
_cons | 9789.494 6710.193 1.46 0.150 -3642.416 23221.404
------------------------------------------------------------------------------
第1批找到的可行子样本的样本量更大,共57个样本
第2批没有找到样本量更大的可行子样本的
第3批没有找到样本量更大的可行子样本的
第4批没有找到样本量更大的可行子样本的
第5批找到的可行子样本的样本量更大,共59个样本
可行子样本结果:
Source | SS df MS Number of obs = 59
-------------+---------------------------------- F(10, 48) = 8.13
Model | 258052864 10 25805286.4 Prob > F = 0.0000
Residual | 152282700 48 3172556.25 R-squared = 0.6289
-------------+---------------------------------- Adj R-squared = 0.5516
Total | 410335564 58 7074751.1 Root MSE = 1781.2
------------------------------------------------------------------------------
price | Coefficient Std. err. t P>|t| [95% conf. interval]
-------------+----------------------------------------------------------------
mpg | 29.449 70.548 0.42 0.678 -112.397 171.295
rep78 | 343.238 329.438 1.04 0.303 -319.142 1005.618
headroom | -763.087 361.825 -2.11 0.040 -1490.584 -35.590
trunk | 110.767 91.330 1.21 0.231 -72.864 294.399
weight | 4.840 1.331 3.64 0.001 2.164 7.516
length | -68.718 37.654 -1.82 0.074 -144.427 6.991
turn | -29.910 112.902 -0.26 0.792 -256.914 197.094
displacement | 3.763 8.192 0.46 0.648 -12.707 20.234
gear_ratio | -291.453 1105.221 -0.26 0.793 -2513.648 1930.743
foreign | 3014.364 986.754 3.05 0.004 1030.363 4998.366
_cons | 3546.345 6410.416 0.55 0.583 -9342.660 16435.351
------------------------------------------------------------------------------
在程序运行结束之后,会生成 subsample_1 变量,若 subsample_1 = 0 代表表现不好的样本,subsample_1 == 1 则代表可行子样本。在此基础上,我们可以对这两组样本进行描述性统计分析,以找到结果不符合预期的原因。例如最简单的,可以进行分组描述统计:
. label define samplefilter 1 "可行子样本" 0 "表现不好样本"
. label values samplefilter_1 samplefilter
. bys samplefilter_1 : sum $y $x
-> samplefilter_1 = 表现不好样本
Variable | Obs Mean Std. dev. Min Max
-------------+---------------------------------------------------------
price | 5 8742.6 3634.539 4934 13466
mpg | 5 18.4 4.722288 14 25
rep78 | 5 3.2 1.48324 1 5
headroom | 5 2.9 .9617692 1.5 4
trunk | 5 12 5.43139 7 20
-------------+---------------------------------------------------------
weight | 5 3324 835.7512 2240 4330
length | 5 195.2 18.51216 172 221
turn | 5 40.2 3.193744 36 44
displacement | 5 242.2 127.1326 107 425
gear_ratio | 5 2.886 .5113022 2.28 3.55
-------------+---------------------------------------------------------
foreign | 5 .4 .5477226 0 1
-----------------------------------------------------------------------
-> samplefilter_1 = 可行子样本
Variable | Obs Mean Std. dev. Min Max
-------------+---------------------------------------------------------
price | 64 5943.188 2782.066 3291 15906
mpg | 64 21.51563 5.9174 12 41
rep78 | 64 3.421875 .9562607 1 5
headroom | 64 3.007813 .8521317 1.5 5
trunk | 64 14.07813 4.262441 5 23
-------------+---------------------------------------------------------
weight | 64 3009.219 791.7457 1760 4840
length | 64 187.75 23.07957 142 233
turn | 64 39.76563 4.541667 31 51
displacement | 64 194.5469 90.39787 79 400
gear_ratio | 64 3.008125 .4619176 2.19 3.89
-------------+---------------------------------------------------------
foreign | 64 .296875 .4604927 0 1
-----------------------------------------------------------------------
samplefilter
命令也可以适用于分组回归,例如:
. gen group =_n<40
. global sig "trunk"
. bys group: samplefilter $y $x, sig($sig) cmd(reghdfe) p(0.1) sub(subsample) lr(0.6) rr(0.8) noabsorb
-> group = 0
全样本结果: 省略
可行子样本结果:
HDFE Linear regression Number of obs = 26
Absorbing 1 HDFE group F( 10, 15) = 4.43
Prob > F = 0.0050
R-squared = 0.7471
Adj R-squared = 0.5785
Within R-sq. = 0.7471
Root MSE = 1489.9890
------------------------------------------------------------------------------
price | Coefficient Std. err. t P>|t| [95% conf. interval]
-------------+----------------------------------------------------------------
mpg | -28.282 92.793 -0.30 0.765 -226.067 169.502
rep78 | -11.357 566.240 -0.02 0.984 -1218.269 1195.554
headroom | -544.745 493.119 -1.10 0.287 -1595.803 506.313
trunk | 215.979 115.565 1.87 0.081 -30.341 462.299
weight | 0.848 2.113 0.40 0.694 -3.656 5.351
length | 104.254 61.141 1.71 0.109 -26.065 234.572
turn | -589.023 287.757 -2.05 0.059 -1202.362 24.316
displacement | 12.332 16.756 0.74 0.473 -23.383 48.046
gear_ratio | -385.158 1488.517 -0.26 0.799 -3557.857 2787.541
foreign | 2124.030 2014.989 1.05 0.309 -2170.818 6418.877
_cons | 5293.157 10023.993 0.53 0.605 -1.61e+04 26658.793
------------------------------------------------------------------------------
-> group = 1
全样本结果: 省略
可行子样本结果:
HDFE Linear regression Number of obs = 34
Absorbing 1 HDFE group F( 9, 24) = 13.98
Prob > F = 0.0000
R-squared = 0.8398
Adj R-squared = 0.7797
Within R-sq. = 0.8398
Root MSE = 1680.2737
------------------------------------------------------------------------------
price | Coefficient Std. err. t P>|t| [95% conf. interval]
-------------+----------------------------------------------------------------
mpg | 72.391 156.843 0.46 0.649 -251.318 396.100
rep78 | -753.208 495.403 -1.52 0.141 -1775.669 269.253
headroom | -460.110 433.526 -1.06 0.299 -1354.864 434.644
trunk | 386.477 192.034 2.01 0.056 -9.861 782.816
weight | 14.140 2.344 6.03 0.000 9.301 18.978
length | -363.173 85.292 -4.26 0.000 -539.208 -187.139
turn | -382.790 203.964 -1.88 0.073 -803.751 38.171
displacement | -1.449 9.594 -0.15 0.881 -21.250 18.353
gear_ratio | 842.659 1605.453 0.52 0.604 -2470.833 4156.150
foreign | 0.000 (omitted)
_cons | 41278.234 11339.241 3.64 0.001 17875.191 64681.276
------------------------------------------------------------------------------
samplefilter
命令也可以兼容 reghdfe
等命令,但要注意应增加所使用命令所必须添加的选项。例如,如果使用 reghdfe
命令,则必须增加 absorb()
或 noabsorb
选项,同时也支持增加其他所使用命令支持的选项。例如:
. cap drop subsample*
. global sig "mpg trunk gear_ratio"
. samplefilter $y $x, sig($sig) cmd(reghdfe) p(0.1) sub(subsample) noabsorb i(100) k(2)
. cap drop subsample*
. samplefilter $y $x, sig($sig) cmd(reghdfe) p(0.1) sub(subsample) noabsorb i(1000) k(5) dots1
samplefilter
命令可以兼容 logit
、probit
等命令,但注意需要调整为计算 zvalue
选项)。例如:
. webuse lbw, clear
. global x age lwt i.race smoke ptl ht ui
. global sig lwt ui ht ptl
. global pos ui ht ptl
. global neg lwt
. samplefilter low $x, sig($sig) cmd(logit) p(0.1) sub(subsample) i(5000) z dots1
全样本结果:省略
~~~~~~~~~~~~~~~第1批可行子样本搜寻中,共5批~~~~~~~~~~~~~~~
第1批找到的可行子样本的样本量更大,共171个样本
~~~~~~~~~~~~~~~第2批可行子样本搜寻中,共5批~~~~~~~~~~~~~~~
第2批找到的可行子样本的样本量更大,共177个样本
~~~~~~~~~~~~~~~第3批可行子样本搜寻中,共5批~~~~~~~~~~~~~~~
第3批没有找到样本量更大的可行子样本的
~~~~~~~~~~~~~~~第4批可行子样本搜寻中,共5批~~~~~~~~~~~~~~~
第4批找到的可行子样本的样本量更大,共182个样本
~~~~~~~~~~~~~~~第5批可行子样本搜寻中,共5批~~~~~~~~~~~~~~~
第5批没有找到样本量更大的可行子样本的
可行子样本结果:
Logistic regression Number of obs = 182
LR chi2(8) = 30.62
Prob > chi2 = 0.0002
Log likelihood = -97.026723 Pseudo R2 = 0.1363
------------------------------------------------------------------------------
low | Coefficient Std. err. z P>|z| [95% conf. interval]
-------------+----------------------------------------------------------------
age | -0.036 0.037 -0.97 0.330 -0.109 0.037
lwt | -0.012 0.007 -1.75 0.081 -0.026 0.001
race |
Black | 0.968 0.552 1.75 0.079 -0.113 2.050
Other | 0.805 0.448 1.79 0.073 -0.074 1.684
smoke | 0.809 0.416 1.94 0.052 -0.007 1.625
ptl | 0.626 0.376 1.67 0.096 -0.110 1.362
ht | 1.803 0.684 2.64 0.008 0.463 3.144
ui | 0.872 0.464 1.88 0.060 -0.038 1.782
_cons | 0.343 1.204 0.29 0.776 -2.017 2.704
------------------------------------------------------------------------------
. cap drop subsample*
. samplefilter low $x, sig($sig) pos($pos) neg($neg) cmd(probit) p(0.1) sub(subsample) i(5000) z dots1
全样本结果:省略
~~~~~~~~~~~~~~~第1批可行子样本搜寻中,共5批~~~~~~~~~~~~~~~
第1批找到的可行子样本的样本量更大,共180个样本
~~~~~~~~~~~~~~~第2批可行子样本搜寻中,共5批~~~~~~~~~~~~~~~
第2批没有找到样本量更大的可行子样本的
~~~~~~~~~~~~~~~第3批可行子样本搜寻中,共5批~~~~~~~~~~~~~~~
第3批找到的可行子样本的样本量更大,共185个样本
~~~~~~~~~~~~~~~第4批可行子样本搜寻中,共5批~~~~~~~~~~~~~~~
第4批没有找到样本量更大的可行子样本的
~~~~~~~~~~~~~~~第5批可行子样本搜寻中,共5批~~~~~~~~~~~~~~~
第5批没有找到样本量更大的可行子样本的
可行子样本结果:
Probit regression Number of obs = 185
LR chi2(8) = 39.38
Prob > chi2 = 0.0000
Log likelihood = -95.356035 Pseudo R2 = 0.1712
------------------------------------------------------------------------------
low | Coefficient Std. err. z P>|z| [95% conf. interval]
-------------+----------------------------------------------------------------
age | -0.016 0.022 -0.73 0.465 -0.059 0.027
lwt | -0.011 0.004 -2.55 0.011 -0.019 -0.002
race |
Black | 0.740 0.320 2.32 0.021 0.114 1.367
Other | 0.414 0.263 1.58 0.115 -0.101 0.929
smoke | 0.585 0.239 2.45 0.014 0.117 1.053
ptl | 0.491 0.224 2.19 0.029 0.051 0.930
ht | 1.178 0.426 2.77 0.006 0.343 2.012
ui | 0.615 0.285 2.16 0.031 0.057 1.173
_cons | 0.435 0.724 0.60 0.548 -0.984 1.854
------------------------------------------------------------------------------
samplefilter
命令同样可以兼容 ivreg2
等逗号前并非「因变量 + 自变量」模式的命令。例如:
. use http://fmwww.bc.edu/ec-p/data/wooldridge/mroz.dta,clear
. ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6), robust savefirst
与之对应的 samplefilter
命令为:
. global equation "lwage exper expersq (educ=age kidslt6 kidsge6)"
. global sig expersq
. samplefilter $equation, sig($sig) cmd(ivreg2) p(0.05) sub(subsample) i(500) ///
> robust savefirst z dots1 dots2
全样本结果:省略
~~~~~~~~~~~~~~~第1批可行子样本搜寻中,共5批~~~~~~~~~~~~~~~
第1批找到一个可行子样本,开始尝试在此基础上扩大样本
第1批找到的可行子样本的样本量更大,共391个样本
~~~~~~~~~~~~~~~第2批可行子样本搜寻中,共5批~~~~~~~~~~~~~~~
第2批找到一个可行子样本,开始尝试在此基础上扩大样本
第2批找到的可行子样本的样本量更大,共411个样本
~~~~~~~~~~~~~~~第3批可行子样本搜寻中,共5批~~~~~~~~~~~~~~~
第3批找到一个可行子样本,开始尝试在此基础上扩大样本
第3批找到的可行子样本的样本量更大,共425个样本
~~~~~~~~~~~~~~~第4批可行子样本搜寻中,共5批~~~~~~~~~~~~~~~
第4批找到一个可行子样本,开始尝试在此基础上扩大样本
第4批没有找到样本量更大的可行子样本的
~~~~~~~~~~~~~~~第5批可行子样本搜寻中,共5批~~~~~~~~~~~~~~~
第5批找到一个可行子样本,开始尝试在此基础上扩大样本
第5批没有找到样本量更大的可行子样本的
可行子样本结果:
Estimates efficient for homoskedasticity only
Statistics robust to heteroskedasticity
Number of obs = 425
F( 3, 421) = 6.49
Prob > F = 0.0003
Total (centered) SS = 214.1262261 Centered R2 = 0.1631
Total (uncentered) SS = 822.4470383 Uncentered R2 = 0.7821
Residual SS = 179.212182 Root MSE = .6494
------------------------------------------------------------------------------
| Robust
lwage | Coefficient std. err. z P>|z| [95% conf. interval]
-------------+----------------------------------------------------------------
educ | 0.088 0.088 1.01 0.313 -0.083 0.260
exper | 0.046 0.016 2.79 0.005 0.014 0.078
expersq | -0.001 0.000 -1.98 0.048 -0.002 -0.000
_cons | -0.300 1.074 -0.28 0.780 -2.405 1.804
------------------------------------------------------------------------------
Underidentification test (Kleibergen-Paap rk LM statistic): 10.982
Chi-sq(3) P-val = 0.0118
------------------------------------------------------------------------------
Weak identification test (Cragg-Donald Wald F statistic): 4.245
(Kleibergen-Paap rk Wald F statistic): 4.917
Stock-Yogo weak ID test critical values: 5% maximal IV relative bias 13.91
10% maximal IV relative bias 9.08
20% maximal IV relative bias 6.46
30% maximal IV relative bias 5.39
10% maximal IV size 22.30
15% maximal IV size 12.83
20% maximal IV size 9.54
25% maximal IV size 7.80
Source: Stock-Yogo (2005). Reproduced by permission.
NB: Critical values are for Cragg-Donald F statistic and i.i.d. errors.
------------------------------------------------------------------------------
Hansen J statistic (overidentification test of all instruments): 0.640
Chi-sq(2) P-val = 0.7263
------------------------------------------------------------------------------
Instrumented: educ
Included instruments: exper expersq
Excluded instruments: age kidslt6 kidsge6
------------------------------------------------------------------------------
samplefilter
命令的兼容性不止局限于上述例子中所列出的模型估计命令,如果需要使用其他模型估计命令,读者可以根据范例的格式进行尝试。
Note:产生如下推文列表的 Stata 命令为:
lianxh 筛选 程序, m
安装最新版lianxh
命令:
ssc install lianxh, replace
免费公开课
最新课程-直播课
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 | 文本分析、机器学习、效率专题、生存分析等 | |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
⛳ 课程主页
⛳ 课程主页
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会-常见问题解答:
✨ https://gitee.com/lianxh/Course/wikis
New!
lianxh
和songbl
命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh