数据处理
//描述性统计 输出//
asdoc sum, stat(N mean sd tstat p1 p99) fs(7) dec(2)
//结果展示去除变量//
reghdfe,absorb(vr)
//一对多合并//
merge 1:m Symbol Year using"xx.dta",force
//去除金融业和公用事业 st行业等//
gen J=regexm(IndustryCode,"J")
drop if J==1
//双边缩尾1% 99%//
winsor2 var,cut(1 99)
//按行业年份加总//
bysort code year:egen sum_v=sum(v)
//文字赋值//
gen new = .
replace new = 1 if strmatch(name, "*A*")
replace new = 0 if strmatch(name, "*B*" or "*B1*")
//熵值法构建代理变量 //
order Symbol year v1 v2 v3
gen k=1/ln(n)
foreach v of varlist v1-v3{
egen max_`v'=max(`v')
egen min_`v'=min(`v')
ge s`v'= (`v'-min_`v')/(max_`v'-min_`v')
egen sum_s`v'=sum(s`v')
ge p`v'=s`v'/sum_s`v'
replace p`v'=0.00001 if p`v'==0
ge l`v'=ln(p`v')
ge f`v'=p`v'*l`v'
egen sum_f`v'=sum(f`v')
ge g`v'=1-k*sum_f`v'
}
egen sum_g=rowtotal(v1-v3)
foreach v of varlist v1-v3{
ge w`v'=`v'/sum_g
}
foreach v of varlist v1-v3 {
ge ss`v'= w`v'*s`v'
}
egen Y=rowtotal(ssv1-ssv3 )
//拆分字符串(从n开始取m)//
gen Code=substr(Vcode,n,m)
//处理重复样本//
duplicates drop Symbol Year,force
ssc install unique
unique v 看是否有重复值
duplicates 找到重复值
将重复样本标注出来 duplicates tag v , gen(tag1)
将重复样本单列出来 duplicates list v
剔除重复值 duplicates drop v,force (强制执行)
基础回归
//相关性检验 输出//
asdoc corr ROA RD
//回归(个体层面稳健标准误)//
reg Y X X1 i.year i.Code,vce(cluster Symbol)
//生成行业平均变量(不含自身)//
sort year Code
by year Code : egen total_RD=total(RD)
by year Code : egen number=count(RD)
gen deps=total_RD-RD
gen RD_Code=deps/(number-1)
PSM
DID
//前期准备//
ssc install asdoc,replace(导入word)
ssc install estout,replace(绘制三线表)
ssc install parmest,replace(导出回归分析的参数和统计量,stata16可以安装)
ssc install coeplot,replace(回归系数可视化)
ssc install dpplot,replace(绘制核密度估计图)
ssc install diff,replace(双重差分估计)
ssc install ftools
ssc install reghdfe (直接回归命令)
//创建虚拟变量//
gen Time = (Year >= xxx)&!missing(Year) //创建时间虚拟变量
gen Treat = (ID <= xxx)&!missing(ID) ..创建政策虚拟变量
gen DID=Time*Treat
//基准回归估计//
//DID估计1//
asdoc xtreg Y Time Treat DID v v v,fe
//DID估计2//
diff Y ,t(Treat) p(Time) cov( v v v )
//平行趋势检验 //
//画出每年均值趋势图//
gen Treatment= Y if ID <= 108 //构造实验组变量
gen Control=Y if ID >108 //构造对照组变量
bysort Year: egen tTreat= mean(Treat)
bysort Year: egen cControl=mean(Control) //按年份分组并求每年均值
duplicates drop Year,force //删除重复值,只保留一年一个数据
scatter tTreat Year,c(1)|| scatter cControl Year,c(1) //自动画图
//更换被解释变量//
diff Y1 ,t(Treat) p(Time) cov(x x x) robust report bs reps(100) test #两组的被解释变量出现显著差异、其他控制变量不显著表示被解释变量的差异是由于自变量(即政策)而产生的
//平衡趋势检验//
tab Year,gen(yrdum) #构建一个时间的虚拟变量
forvalues v=n1/n2 {
gen Treat`A' =yrdum`A'* Treat
} //构建变量A,n1-n2年的交乘项
xtreg Y Time Treatn1-Treatn2 i.Year, fe #回归
est sto reg
coefplot reg, keep( Treatn1-Treatn2 ) vertical recast(connect) yline(0) //画图,置信区间均跨过零线说明系数不显著,没有明显差异
//分位数回归//
diff Contracts ,t(Treat) p(Time) cov(v v v ) qdid(0.5) report //qdid(0.5)指did做50%分位数回归,report可报告变量
//安慰剂检验//
cap erase "simulations.dta" //覆盖文件,便于之后保存
permute DID beta = _b[DID] se = _se[DID] df = e(df_r), reps(500) seed(100) saving("simulations.dta"):reghdfe Y DID, absorb( ID Year) vce(robust) #抽取100个作为伪实验组,随机抽取500次,不要加控制变量
use "simulations.dta", clear
gen t_value = beta / se
gen p_value = 2 * ttail(df, abs(beta/se))
dpplot beta, xtitle(" Estimator", size(*0.8)) xlabel(, format(%4.3f) labsize(smalI)) ytitle("Density", size(*0 .8)) ylabel(, nogrid format(%4.3f) labsize(smalI)) note(" ") //图中值基本都在0附近,且服从正态分布,说明影响非常微弱,意味着模型设定中并未遗漏掉足够重要的影响因素,模型基本没有问题
caption(" ") graphregion(fcolor(white))
//改变政策时间的反事实检验//
xtset ID Year
gen Time = (Year >= xxx)&!missing(Year) #将政策时间提前到xxx年
gen Treat = (ID <= xxx)&!missing(ID)
diff Y ,t(Treat) p(Time) cov( v v v) robust report bs reps(100)
工具变量回归
ivreg2 Y (X=IV) x1 x2 i.year ,r first savefp(first)
eststo second
outreg2 [firstX second] using"xxx.doc",tstat bdec(3)tdec(2) replace
(Underid p<0.01 Weakid C-D Wald F>S-Y 10% Hansen J p>0.01(H0:模型设置正常))