0


实证论文复刻|stata安慰剂检验

文章及代码来源:中国工业经济《税收征管数字化与企业内部薪酬差距》

先po完整代码

  1. *随机抽取对照组和控制组
  2. forvalue i=1/500{
  3. sysuse 数据1.dta, clear
  4. g obs_id= _n //初始样本序号
  5. gen random_digit= runiform() //生成随机数
  6. sort random_digit //按新生成的随机数排序
  7. g random_id= _n //产生随机序号
  8. preserve
  9. keep random_id gtp //保留虚拟的gtp
  10. rename gtp random_gtp
  11. rename random_id id //重命名为id,以备与其他变量合并(merge)
  12. label var id 原数据与虚拟处理变量的唯一匹配码
  13. save random_gtp, replace
  14. restore
  15. drop random_digit random_id gtp //删除原来的gtp
  16. rename obs_id id //重命名为id,以备与random_rd合并(merge)
  17. label var id 原数据与虚拟处理变量的唯一匹配码
  18. save rawdata, replace
  19. *- 合并,回归,提取系数
  20. use rawdata, clear
  21. merge 1:1 id using random_gtp,nogen
  22. xtreg gap random_gtp size lev roa labor age cash indratio top1 soe olddep avgwage lnpgdp i.year i.ind i.prov,fe vce(cluster code)
  23. g _b_random_gtp= _b[random_gtp] //提取x的回归系数
  24. g _se_random_gtp= _se[random_gtp] //提取x的标准误
  25. gen pvalue=2*ttail(e(df_r), abs(_b[random_gtp]/_se[random_gtp]))
  26. keep _b_random_gtp _se_random_gtp pvalue
  27. duplicates drop _b_random_gtp, force
  28. drop if pvalue ==.
  29. save placebo`i', replace //把第i次placebo检验的系数和标准误存起来
  30. }
  31. *- 纵向合并500次的系数和标准误
  32. use placebo1, clear
  33. forvalue i=2/500{
  34. append using placebo`i' //纵向合并500次回归的系数及标准误
  35. }
  36. rename _b_random_gtp coef1
  37. twoway (kdensity coef1,yaxis(1)) (scatter pvalue coef1, msymbol(smcircle_hollow) yaxis(2) mcolor(blue)), ///
  38. title(Placebo Test) ///
  39. xlabel(-0.13(0.05)0.06) ylabel(,axis(1) angle(0)) ylabel(0(1)5,axis(2)) ///
  40. xline(-0.1152, lwidth(vthin) lp(shortdash)) xtitle(估计系数) ///
  41. xline(0,lwidth(vthin) lp(shortdash)) ///
  42. yline(0.1,lwidth(vthin) lp(dash)) ytitle(p value) ///
  43. legend(label(1 'kdensity of estimates') label( 2 'p value')) ///
  44. plotregion(style(none)) ///无边框
  45. graphregion(color(white)) //白底
  46. *-删除临时文件
  47. forvalue i=1/500{
  48. erase placebo`i'.dta
  49. }
  50. *随机设定政策时点
  51. mat b = J(500,1,0)
  52. mat se = J(500,1,0)
  53. mat p = J(500,1,0)
  54. forvalues i = 1/500{
  55. use 数据1.dta, clear
  56. xtset code year
  57. bsample 1, strata(province) //根据**id**分组,每组随机抽取一个年份
  58. keep year
  59. save matchyear.dta, replace
  60. mkmat year, matrix(sampleyear)
  61. use 数据1.dta, clear
  62. xtset code year
  63. gen DID = 0
  64. foreach j of numlist 1/36 {
  65. replace DID = 1 if (province== `j' & year >= sampleyear[`j',1])
  66. }
  67. qui xtreg gap DID size lev roa labor age cash indratio top1 soe olddep avgwage lnpgdp i.year i.ind i.prov,fe vce(cluster code)
  68. mat b[`i',1] = _b[DID]
  69. mat se[`i',1] = _se[DID]
  70. scalar df_r = e(N) - e(df_m) -1
  71. mat p[`i',1] = 2*ttail(df_r,abs(_b[DID]/_se[DID]))
  72. }
  73. svmat b, names(coef)
  74. svmat se, names(se)
  75. svmat p, names(pvalue)
  76. drop if pvalue1 == .
  77. label var pvalue1 p值
  78. label var coef1 估计系数
  79. twoway (kdensity coef1,yaxis(1)) (scatter pvalue1 coef1, msymbol(smcircle_hollow) yaxis(2) mcolor(blue)), ///
  80. title(Placebo Test) ///
  81. xlabel(-0.2(0.05)0.2) ylabel(,axis(1) angle(0)) ylabel(0(1)5,axis(2)) ///
  82. xline(-0.1152, lwidth(vthin) lp(shortdash)) xtitle(估计系数) ///
  83. xline(0,lwidth(vthin) lp(shortdash)) ///
  84. yline(0.1,lwidth(vthin) lp(dash)) ytitle(p value) ///
  85. legend(label(1 'kdensity of estimates') label( 2 'p value')) ///
  86. plotregion(style(none)) ///无边框
  87. graphregion(color(white)) //白底

随机抽取对照组和实验组

接下来逐一解读:

forvalue表示循环

sysuse表示使用xx数据,和use区别参考stata中 sysuse和use区别 - 知乎

简单来说use调用数据时,需要加上路径,而sysuse不用。

  1. g obs_id= _n //初始样本序号

表示生成序号,按照列表依次递增,如图:

  1. gen random_digit= runiform() //生成随机数

每一列随机生成,如图

  1. sort random_digit //按新生成的随机数排序

结果如图:

  1. g random_id= _n //产生随机序号

  1. preserve
  2. keep random_id gtp //保留虚拟的gtp
  3. rename gtp random_gtp
  4. rename random_id id //重命名为id,以备与其他变量合并(merge)
  5. label var id 原数据与虚拟处理变量的唯一匹配码
  6. save random_gtp, replace
  7. restore

preserve……restore

详细可参考:preserve restore——stata的起死回生之术

preserve 命令可以把之前的内容保存在一个临时内存空间中,这样保存的文件,无论 preserve 以后我们对文件进行什么操作,都可以随时通过restore将preserve命令之前的文件恢复到内存中,继续使用。

  1. keep random_id gtp //保留虚拟的gtp

keep表示保留变量

  1. merge 1:1 id using random_gtp,nogen

merge1:1(merge1:m或merge m:1或merge m:n) 变量 using 数据集2

如果两个数据中的某变量的数据都是唯一的,则用1:1,;

如果数据1中某变量的数据有多个,而数据2中某变量的数据是唯一的,则用merge m:1;

如果数据1中某变量的数据是唯一的,而数据2中某变量的数据有多个,则用merge 1:m;

如果数据1和2中某变量的数据均有多个,则用merge m:n

nogen的含义就是不生成 _merge这个变量

  1. twoway (kdensity coef1,yaxis(1)) (scatter pvalue coef1, msymbol(smcircle_hollow) yaxis(2) mcolor(blue)), ///
  2. title("安慰剂检验") ///
  3. xlabel(-0.13(0.05)0.06) ylabel(,axis(1) angle(0)) ylabel(0(1)5,axis(2)) ///
  4. xline(-0.1152, lwidth(vthin) lp(shortdash)) xtitle(估计系数) ///
  5. xline(0,lwidth(vthin) lp(shortdash)) ///
  6. yline(0.1,lwidth(vthin) lp(dash)) ytitle(估计系数密度分布) ///
  7. legend(label(1 "核密度") label( 2 "P值")) ///
  8. plotregion(style(none)) ///无边框
  9. graphregion(color(white)) //白底

Kdensity命令是对变量未知密度函数分布时的一种估计,不是一种标准的密度分布函数(比如t分布、正态分布)

  1. msymbol()

调整标记符号的形状。

  1. msymbol(S)

中的

  1. S

  1. square

的缩写,表示方块。

  1. msymbol(t)

对应的标记符号为小三角形;

  1. msymbol(sh)

对应的标记符号为小的空心方块,括号的的

  1. h

对应

  1. hollow

,表示空心的意思;

  1. msymbol(X)

对应的标记符号为大的叉号;

  1. msymbol(+)

对应的标记符号为十字号;

  1. msymbol(p)

对应的标记符号为小点。

随机设定政策时点

  1. mat b = J(500,1,0)//系数矩阵
  2. mat se = J(500,1,0)//标准误矩阵
  3. mat p = J(500,1,0)//P值矩阵

生成备用矩阵

使用mat list b可以查看矩阵,可以看出生成500行,一列,值为0的矩阵

  1. bsample 1, strata(province)

这里首先将数据按照省份分组,然后在每个省份组内的 year 变量中随机抽取一个年份作为其政策时间

  1. bsample [exp] [if] [in] [, options]

其中,if代表条件语句,in代表范围语句,options代表其他选项。exp为表达式,用于指定抽取的样本个数。

需要说明的是,对于样本容量exp,如果进行简单分层抽样,就要求样本规模小于等于数据的观测值个数;如果进行分层抽样,exp就不能超过各层中的观测值个数;如果设定选项cluster(),exp就不能超过组的个数;如果同时设定选项cluster()和strata(),exp就不能超过各层内组的个数。

mkmat:将数值型变量中的观测值转变为矩阵

  1. foreach j of numlist 3/30 {
  2. replace DID = 1 if (prov== `j' & year >= sampleyear[`j',1])
  3. }

foreach详细参考:foreach的五个小秘密


本文转载自: https://blog.csdn.net/weixin_50381726/article/details/130059554
版权归原作者 八八嘿嘿 所有, 如有侵权,请联系我们删除。

“实证论文复刻|stata安慰剂检验”的评论:

还没有评论