* 4 剔除主要变量缺失的样本 // 这个建议在合并数据后再进行操作 // 主要思路是,把所有的变量假装用来回归,然后直接剔除掉没用上的样本就行了 global all_vars = "Y X $controls"// $controls 是一系列的控制变量,这里用了 Stata 的全局暂元方法 quireg$all_vars keepife(sample)
* 5 剔除单一观测值 // 这个主要用在固定效应中 bysort stkcd: gen single = _N dropif single <= 1 drop single
(2)合并数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
* 1 1:1 匹配 // 如果主文件(master)和导入文件(using)是通过股票代码和年份一一对应的,那么就采用如下的合并数据方法 merge 1:1 stkcd year using "control1.dta" keepif _m == 3 drop _m // 需要注意的是,如果在后文中没有使用该导入的数据,那么不建议使用 "keep if _m == 3",因为这会导致样本损失 // 建议使用 "drop if _m == 2" 这样可以尽可能地保留原始样本
* 2 m:1 匹配 // 如果主文件(master)和导入文件(using)不是一一对应的。例如,导入文件是以城市和年份为唯一标识的。 // 由于一个城市有多家企业,所以主文件的多个样本对应了导入文件的一个样本,这个时候就需要 m:1 匹配 mergem:1 city year using "control2.dta" keepif _m == 3 drop _m
* 定义全局暂元 global controls = "control1 control2 control3 control4 control5 control6" global independents = "X $controls"
* 保存数据文件 save"main.dta", replace
2 描述性统计
这部分内容其实没啥好说的。。。代码照抄就是了,/// 表示续行符
1 2 3
sum2docx Y $independents/// using "描述性统计.docx", replace/// stats(Nmean(%12.3f) sd(%12.3f) min(%12.3f) median(%12.3f) max(%12.3f))
3 基准回归
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
use"main.dta", replace// 这里开始就可以体现前面保存数据的好处了
// 不放控制变量和固定效应 reghdfe Y X , vce(cluster stkcd) // 个体层面的聚类稳健标准误 est store m1 // 加入控制变量 reghdfe Y $independents ,vce(cluster stkcd) est store m2 // 加入固定效应 reghdfe Y $independents , absorb(stkcd year) vce(cluster stkcd) est store m3
* 1 按照已有的 0-1 虚拟变量分组,例如“是否国企” // 非国企 reghdfe Y $independents , absorb(stkcd year) vce(cluster stkcd), if SOE == 0 est store m1 // 国企 reghdfe Y $independents , absorb(stkcd year) vce(cluster stkcd), if SOE == 1 est store m2
quisum C, detail gen dC = (C >= r(p50)) if !missing(C) // 这里的 dC 就是计算出来的基于中位数的分组变量
// 低于中位数的组别 reghdfe Y $independents , absorb(stkcd year) vce(cluster stkcd), if dC == 0 est store m1 // 高于中位数的组别 reghdfe Y $independents , absorb(stkcd year) vce(cluster stkcd), if dC == 1 est store m2
* 3 按照分位数分组 // 有时候中位数分组不显著(就是这么直接),一些作者会采用极端的分组方法。 // 例如,最低的 1/3 定为 0,最高的 1/3 定为 1,中间的 1/3 剔除 xtile dC = C, nq(3) dropif dC == 2 replace dC = 0 if dC == 1 replace dC = 1 if dC == 3 // 后面就和前面类似了
* 4 按照某个连续变量在某一年的中位数进行分组 // 这种分类方式其实还是比较少见的。。。大家为了显著都不容易啊。。。 // 例如现在有 2008-2020 的上市公司数据,按照变量 C 在 2015 年的中位数分组 // 按照哪一年其实也是有讲究的,如果做的是 DID,一般选取事件的前一年 // 思路就是把 2015 年的数据填充到其他年份,然后再找中位数分组 gen dc = C gen temp = dc if year == 2015 bys code: egen gvar_in_year = min(temp) egen gvar_in_year_median = median(gvar_in_year) gen dC = (gvar_in_year > gvar_in_year_median) if !mi(gvar_in_year) drop dc temp gvar_in_year gvar_in_year_median * 更建议先在原始文件里先处理成指定年份再 merge,然后直接用全样本中位数即可 * 不建议先在原始文件里分组再 merge,可能会导致两组样本差异很大
* 5 按照是否高于同年/行业/城市/省份中位数进行分组 // 这个相对前一个来说简单一些,按行业分别找中位数然后再用变量跟它对比就好 bysort industry: egen temp = median(C) // 行业中位数 gen dC = (C >= temp) if !missing(temp) drop temp
bysort year: egen temp = median(C) // 年份中位数 gen dC = (C >= temp) if !missing(temp) drop temp
* 6 按照是否高于同年行业/城市/省份中位数进行分组 // 这种分组方式感觉怪怪的其实。。。不建议使用 bysort industry year: egen temp = median(C) gen dC = (C >= r(p50)) if !missing(temp) drop temp
5 稳健性检验
这部分内容建议去看下知乎上专门的文章,我这里就抛砖引玉,主要是介绍下有哪些稳健性检验方法。。。
(1)平行趋势检验
DID 必备检验之一,继续沿用前面的 DID 例子。如果大家感兴趣的话,之后可能会专门出一期怎么调平行趋势的文章。。。