温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
作者: 王如玉(中国人民银行金融研究所)
E-mail: 15242968@qq.com
Source: 本文部分内容摘译自以下文章:
目录
「随机推断(Randomization Inference)」被认为是分析随机实验数据的一种较好的方法。尤其在样本量较少、具有聚类随机性、以及高杠杆点 (潜在离群值) 等情形下,其优势更加明显。
遗憾的是,Stata 中一直没有相应的程序实现该方法,进而限制了其在经济学中的应用。直到 2017 年,一位法兰克福大学的博士生 Simon Heß 编写了 ritest
命令,使得「随机推断」具有了可操作性。
关于 ritest
命令更为详细介绍,请参考 Heß (2017)3。接下来,本文将对「随机推断」和 ritest
命令进行简单介绍。
我们通常会面临这样一个难题,在对给定地区所有学校进行一项实验,或美国各州进行一项政策的实验结果评估时,「标注误差」和「
「随机推断」考虑了在随机实验中,随机本身引起的任何变化。当研究者控制实验分配时,差异来自对实验组的随机分配,而不是抽样策略。此时,「随机推断」不仅要考虑随机分配下会发生什么,还包括在所有可能的随机分配下会发生什么,即实验结果是否都会成立?
我们可以通过 ssc install ritest, replace
安装该命令。
ritest resampvar exp_list [, options]: command
resampvar
为需要重新抽样的变量名,例如,处理组指示变量 treatment;exp_list
为需要比较的表达式,例如,回归系数 _b[treatment];options
定义了重新抽样过程的细节、对 reps(#)
执行随机抽样的次数,默认为 100 次;left|right
计算单边 level(#)
置信区间,默认为 95;fixlevels()
将重新随机过程限制于部分实验变量,可被用于多重实验组成对测试的情况;seed(#)
设定随机数种子。command
为每次重复时执行的回归程序,例如 regress testscore treatment age。ritest resampvar exp_list, reps(#) strata(varlist) cluster(varlist): command
主要参数说明:
strata(varlist)
在分层内重新排列 resampvar
;cluster(varlist)
在聚类内保持 resampvar
为常数。该语句根据分层 strata()
和聚类 cluster()
,随机排列resampvar
exp_list
中变量的实现值。不设置分层即假设所有观测值在同一个单一分层中,不设置聚类即假设每个观测值为单一聚类。该方法最简单但最受限的抽样方法,在连续变量时可能会存在很大的局限,建议使用如下两种方法之一。
ritest resampvar exp_list, reps(#) samplingsourcefile(filename) samplingmatchvar(varlist): command
主要参数说明:
samplingsourcefile(filename)
从 Stata 数据文件 filename
中获取 resampvar
并重新排列,文件包含命名为resampvar1, resampvar2, resampvar3, ...
的变量;
samplingmatchvar(varlist)
将 samplingsourcefile()
中的排列与现有数据合并,用 varlist
中的变量 (1:1 或 m:1)。
该语句用 samplingsourcefile()
中的文件,根据 samplingmatchvar()
中列明的解释变量,将数据合并 resampvar1, resampvar2, resampvar3, ...
逐次代换 resampvar
。samplingsourcefile()
必须在执行语句前手动创建。
. ritest resampvar exp_list, reps(#) samplingprogram(progname) samplingprogramoptions(string): command
主要参数说明:
samplingprogram(programname)
根据用户编写的程序 programname
对 resampvar
重新排列;samplingprogramoptions(string)
可选,将 string
作为选项传递给 programname
。该语句通过执行 samplingprogram()
并将 samplingprogramoptions()
作为其可选项,重新排列 resampvar
。这是最多样化,应用最广的方法。如果实验的原始随机过程是由一个 do 文件生成的,原始程序可以用于 samplingprogram()
。通过编写程序可以一次重新抽样多个变量。
Mckenzie (2017) 1 中提供了「Identifying and Spurring High-Growth Entrepreneurship: Experimental Evidence from a Business Plan Competition4」案例的「完整数据和代码」,因此,我们将以该案例为例予以演示说明。
这个实验对尼日利亚「一个青年创业竞赛对就业和公司利润影响」进行了跟踪调研。实验随机选取该竞赛的获奖者,分配为实验组与对照组,奖金根据他们的商业计划的实施情况,分四个阶段支付,并进行了三轮跟踪问卷调查。
例如,为了研究第二轮调查时还在运行的公司的阶段利润,在 Stata 中使用如下命令:
use "Nigeriablogdata.dta", clear
areg s_prof_trunc assigntreat, a(strata) robust
ritest assigntreat _b[assigntreat], reps(5000) strata(strata) seed(125): areg s_prof_trunc assigntreat, a(strata) robust
首先进行控制随机分层的 OLS 回归,其中 s_prof_trunc 为阶段利润,assigntreat 为实验组控制变量,得到该回归的
然后使用 ritest
,告诉它控制变量是什么,想要什么系数的
.................................................. 5000
command: areg s_prof_trunc assigntreat, a(strata) robust
_pm_1: _b[assigntreat]
res. var(s): assigntreat
Resampling: Permuting assigntreat
Clust. var(s): __000000
Clusters: 541
Strata var(s): strata
Strata: 12
------------------------------------------------------------------------------
T | T(obs) c n p=c/n SE(p) [95% Conf. Interval]
-------------+----------------------------------------------------------------
_pm_1 | 69.23354 256 5000 0.0512 0.0031 .0452543 .0576763
------------------------------------------------------------------------------
Note: Confidence interval is with respect to p=c/n.
Note: c = #{|T| >= |T(obs)|}
此处
注意: 此处原作者使用的原版 ritest
命令可能会忽略随机种子,即每次随机得出的结果不同。原作者使用 1000 次重复和种子 125 ,获得的
此处同样使用以上数据,但对其进行了重新调整,以便估计第二轮和第三轮随访数据的合并效应。OLS 回归得出的 cluster
选项 (以 uid 为个体标识符),以便在进行重新排列时将聚类性质考虑在内:
//合并第二、三轮数据
gen prof_trunc2=s_prof_trunc
gen prof_trunc3=t_prof_trunc
gen uid=_n
keep uid prof_trunc2 prof_trunc3 group existing assigntreat strata
reshape long prof_trunc ,i(uid) j(time)
gen time3=time==3
areg prof_trunc assigntreat time3 if group<=2 & existing==1, a(strata) robust cluster(uid) //回归
ritest assigntreat _b[assigntreat], reps(1000) strata(strata) cluster(uid) seed(124): areg prof_trunc assigntreat time3 if group<=2 & existing==1, a(strata) robust cluster(uid)
可以看出,cluster()
选项,
本例来自 Mckenzie (2017)1 的一篇关于缩短供应链的工作论文,并提供了「完整数据和代码」。在该例中,公司所在市场被划分为 63 个区域,这些区域又被划分为 31 个层次 (30 对和一个三元组),并在市场区域层级中产生集群随机化。我们想要知道,一周中有多少天公司在中央市场购物。在具有聚类标准差的回归中获得的
use "clusterColombia.dta", clear
areg dayscorab b_treat b_dayscorab miss_b_dayscorab round2 round3, cluster(b_block) a(b_pair)
ritest b_treat _b[b_treat], reps(5000) cluster(b_block) strata(b_pair) seed(546): areg dayscorab b_treat b_dayscorab miss_b_dayscorab round2 round3, cluster(b_block) a(b_pair)
获得结果如下:
.................................................. 5000
command: areg dayscorab b_treat b_dayscorab miss_b_dayscorab round2 round3, cluster(b_block) a(b_pair)
_pm_1: _b[b_treat]/_se[b_treat]
res. var(s): b_treat
Resampling: Permuting b_treat
Clust. var(s): b_block
Clusters: 63
Strata var(s): b_pair
Strata: 31
------------------------------------------------------------------------------
T | T(obs) c n p=c/n SE(p) [95% Conf. Interval]
-------------+----------------------------------------------------------------
_pm_1 | -2.312006 494 5000 0.0988 0.0042 .0906651 .1074066
------------------------------------------------------------------------------
Note: Confidence interval is with respect to p=c/n.
Note: c = #{|T| >= |T(obs)|}
可见,随机推断确实会产生很大的不同:将
xi
。因此,如果回归已使用 xi
,则删除它。Jason Kerwin (2017)2 指出,可以只使用 i.groupvariable
这种形式来添加组变量固定效果,而无需使用 xi
;fixlevels()
选项来实现。
连享会-直播课 上线了!
http://lianxh.duanshu.com
免费公开课:
直击面板数据模型 - 连玉君,时长:1小时40分钟 Stata 33 讲 - 连玉君, 每讲 15 分钟. 部分直播课 课程资料下载 (PPT,dofiles等)
支持回看,所有课程可以随时购买观看。
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 ⭐ | DSGE, 因果推断, 空间计量等 | |
⭕ Stata数据清洗 | 游万海 | 直播, 2 小时,已上线 |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会学习群-常见问题解答汇总:
✨ https://gitee.com/arlionn/WD