Stata:DID入门教程

发布时间:2021-10-20 阅读 3626

Stata连享会   主页 || 视频 || 推文 || 知乎 || Bilibili 站

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

New! lianxh 命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc, ihelp, rdbalance, gitee, installpkg

课程详情 https://gitee.com/lianxh/Course

课程主页 https://gitee.com/lianxh/Course

⛳ Stata 系列推文:

PDF下载 - 推文合集

袁洛琪 (北京大学),luoqi_yuan@163.com
何庆红 (北京大学)


目录


政策评估 (Policy Evaluation) 是当前公共经济学和劳动经济学中最常用的实证方法。其目的在于评价一项既有政策的效果,此类研究关注的是该政策的处理效应 (Treatment Effect)。由于政策往往是对一类特定的人群起作用,政策评估的基本思想是将这类人群与其他人群进行比较。目前,双重差分模型 (Difference-in-Differences) 是用于政策评估的常用模型。此推文的目的是,简要介绍两期和多期双重差分模型 (DID) 中模型设定和系数含义。

1. DID 模型设定

1.1 因果识别思路

  • 对特定个体 i, Di,j=1 表示第 j 期的个体 i 受到政策影响 (处理组),Di,j=0 表示第 j 期的个体 i 不受政策影响 (控制组);
  • Yi,j1 为个体 i 受政策影响时的结果 (outcome),Yi,j0 为不受政策影响时的结果;
  • 虽然个体 i 不可能同时属于处理组和控制组,不可能同时观测到 Yi,j1 与 Yi,j0,但双重差分模型用同一个体不同时期处理状态相反的结果来构造反事实,进而估计出某一政策的实施结果。

其中,E(Y|D=1,T=0)E(Y|D=0,T=0) 计算出的为个体差异,E(Y|D=1,T=1)E(Y|D=0,T=1) 计算出的为个体差异和政策效应之和,因此政策效应即为两者之差:

故 DID 估计出的处理效应为处理组接受处理后的平均处理效应 (ATT at the post-treatment period),即:

双重差分需满足共同趋势这一前提假设,也就是说实验组和控制组在政策施行之前并不存在显著差异,因此使用 DID 方法时需要进行平行趋势检验,即对政策施行之前的实验组和控制组特征是否相似进行检验。

1.2 截面数据 vs 面板数据

  • DID的数据结构:面板数据最佳,重复截面数据也可以;
  • 重复截面数据:数据组成必须是稳定的:
    • 不同时点上的数据都是总体的代表性样本;
    • 可以允许组别固定效应;
  • 面板数据:可以使用个体固定效应,更加稳健。

1.3 常见计量模型设定

政策施行时间一致:

Di 为是否为实验组的虚拟变量 (Di=1 代表个体 i 属于实验组,反之则属于控制组), β1 代表控制组与实验组的组间差异;Tt 为政策实行前后的虚拟变量 (Tt=1 代表在政策之后,反之则代表在政策之前);交乘项 Di×Tt 代表政策实行之后的实验组,β3 度量的即为政策实行效果。最后,加入一系列控制变量 Xit 控制可能干扰政策施行的影响因素。

政策逐步施行:

当政策逐步推进时,不存在明确的实验组和控制组划分,此时回归模型保留了时间固定效应 Tt 以及交乘项 Di×Tt 估计政策实行效果。同样可以加入一系列控制变量 Xit 控制可能干扰政策施行的影响因素。

平行趋势检验:

该模型中包括了政策之前和之后若干期的虚拟变量 Dt ,即可用于检验平行趋势是否成立,也可估计政策施行每一期效果具体大小,λt 代表时间固定效应。系数 δi 用于检验平行趋势是否成立,若系数不显著则平行趋势成立;系数 λ 度量的是政策实行后每一期的效果大小,若显著则说明该期政策效应存在。

2. Stata 示例

首先,我们输入一组数据,并定义相关变量。

clear
input id Year Treat After Treat_x_After
      1  2001  0  0  0
      1  2002  0  0  0
      1  2003  0  1  0
      1  2004  0  1  0
      2  2001  0  0  0
      2  2002  0  0  0
      2  2003  0  1  0
      2  2004  0  1  0
      3  2001  1  0  0
      3  2002  1  0  0
      3  2003  1  1  1
      3  2004  1  1  1
end

bysort id: gen fi = 0.5*id
bysort id: gen  y = _n + fi
replace y = y + 10 if Treat_x_After==1
save "DIDm_simudata.dta", replace

2.1 政策实行时间一致的 DID

. use "DIDm_simudata.dta", clear
. keep if inlist(Year,2002,2003)  //保留政策施行时间一致的观测值
. list, sepby(id) noobs

  +---------------------------------------------------+
  | id   Year   Treat   After   Treat_~r    fi      y |
  |---------------------------------------------------|
  |  1   2002       0       0          0    .5    2.5 |
  |  1   2003       0       1          0    .5    3.5 |
  |---------------------------------------------------|
  |  2   2002       0       0          0     1      3 |
  |  2   2003       0       1          0     1      4 |
  |---------------------------------------------------|
  |  3   2002       1       0          0   1.5    3.5 |
  |  3   2003       1       1          1   1.5   14.5 |
  +---------------------------------------------------+

此时两期 DID 的计量模型为:

在 Stata 中有两种实现方式:

. reg y Treat##After

      Source |       SS           df       MS      Number of obs   =         6
-------------+----------------------------------   F(3, 2)         =    281.56
       Model |  105.583333         3  35.1944444   Prob > F        =    0.0035
    Residual |         .25         2        .125   R-squared       =    0.9976
-------------+----------------------------------   Adj R-squared   =    0.9941
       Total |  105.833333         5  21.1666667   Root MSE        =    .35355
------------------------------------------------------------------------------
           y | Coefficient  Std. err.      t    P>|t|     [95% conf. interval]
-------------+----------------------------------------------------------------
     1.Treat |      0.750      0.433     1.73   0.225       -1.113       2.613
     1.After |      1.000      0.354     2.83   0.106       -0.521       2.521
 Treat#After |
        1 1  |     10.000      0.612    16.33   0.004        7.365      12.635
       _cons |      2.750      0.250    11.00   0.008        1.674       3.826
------------------------------------------------------------------------------

Treat#After 对应的系数即为计量模型中的系数 β3,代表着政策施行对因变量有显著的影响,且政策施行会使得因变量增加 10 单位。

. reg y Treat After Treat_x_After

      Source |       SS           df       MS      Number of obs   =         6
-------------+----------------------------------   F(3, 2)         =    281.56
       Model |  105.583333         3  35.1944444   Prob > F        =    0.0035
    Residual |         .25         2        .125   R-squared       =    0.9976
-------------+----------------------------------   Adj R-squared   =    0.9941
       Total |  105.833333         5  21.1666667   Root MSE        =    .35355
-------------------------------------------------------------------------------
            y | Coefficient  Std. err.      t    P>|t|     [95% conf. interval]
--------------+----------------------------------------------------------------
        Treat |      0.750      0.433     1.73   0.225       -1.113       2.613
        After |      1.000      0.354     2.83   0.106       -0.521       2.521
Treat_x_After |     10.000      0.612    16.33   0.004        7.365      12.635
        _cons |      2.750      0.250    11.00   0.008        1.674       3.826
-------------------------------------------------------------------------------

上述命令是通过手动生成交乘项 Treat_x_After 的方法进行两期 DID 的回归分析。同样 Treat_x_After 对应的系数即为计量模型中的系数 β3,代表着政策施行对因变量有显著的影响且政策施行会使得因变量增加 10 单位。

2.2 政策逐渐施行的 DID

. use "DIDm_simudata.dta", clear
. list id Year Treat After y, sepby(id) noobs

  +----------------------------------+
  | id   Year   Treat   After      y |
  |----------------------------------|
  |  1   2001       0       0    1.5 |
  |  1   2002       0       0    2.5 |
  |  1   2003       0       1    3.5 |
  |  1   2004       0       1    4.5 |
  |----------------------------------|
  |  2   2001       0       0      2 |
  |  2   2002       0       0      3 |
  |  2   2003       0       1      4 |
  |  2   2004       0       1      5 |
  |----------------------------------|
  |  3   2001       1       0    2.5 |
  |  3   2002       1       0    3.5 |
  |  3   2003       1       1   14.5 |
  |  3   2004       1       1   15.5 |
  +----------------------------------+

此时 DID 的计量模型为:

在 Stata 中可通过以下两种方式实现:

. eststo m1: reg y  i.id i.Year Treat_x_After  //混合OLS回归
. xtset id Year
. eststo m2: xtreg y i.Year Treat_x_After, fe  //面板固定效应
. local m "m1 m2"
. esttab `m', nogap  replace not b(%4.2f) s(N r2_a) //输出回归结果

--------------------------------------------
                      (1)             (2)   
                        y               y   
--------------------------------------------
1.id                 0.00                   
2.id                 0.50                   
3.id                 1.00                   
2001.Year            0.00            0.00   
2002.Year            1.00            1.00   
2003.Year            2.00            2.00   
2004.Year            3.00            3.00   
Treat_x_Af~r        10.00           10.00   
_cons                1.50            2.00   
--------------------------------------------
N                   12.00           12.00   
r2_a                 1.00            1.00   
--------------------------------------------
* p<0.05, ** p<0.01, *** p<0.001

2.3 平行趋势检验

以 nlswork.dta 数据为例,假定一项外生政策在 78 年实施,试点组由 idcode 大于 2604 的观测值构成:

clear all 
set more off 
webuse nlswork, clear 
xtset idcode year, delta(1)  //设置成面板数据

gen post = (year >= 78) 
gen treated = (idcode > 2604)
levelsof year, local(localyear) //判断年份的情况
return list
qui sum year 
return list

进一步,生成政策之前和之后每一期的虚拟变量 coeff69 - coeff88

local yearmin = r(min) 
foreach i of local localyear {   
  local j = `i' - 78   
  if `i' > `yearmin'{   
    gen coeff`i' = (year == `i' & treated == 1)   
    label var coeff`i' "`j'"   
    if `i' <= 78 {   
      local countsmall78 = `countsmall78' + 1   
    }   
  }  
} 

利用面板固定效应估计回归结果:

. global controlx "c.age##c.age c.ttl_exp##c.ttl_exp i.south i.race i.year" //设定控制变量
. xtreg ln_w coeff* $controlx, fe robust 
. est store dynamic

Fixed-effects (within) regression               Number of obs     =     28,502
Group variable: idcode                          Number of groups  =      4,710
R-squared:                                      Obs per group:
     Within  = 0.1619                                         min =          1
     Between = 0.2932                                         avg =        6.1
     Overall = 0.2174                                         max =         15
                                                F(33,4709)        =      62.36
corr(u_i, Xb) = 0.1187                          Prob > F          =     0.0000
                                    (Std. err. adjusted for 4,710 clusters in idcode)
-------------------------------------------------------------------------------------
                    |               Robust
            ln_wage | Coefficient  std. err.      t    P>|t|     [95% conf. interval]
--------------------+----------------------------------------------------------------
            coeff69 |      0.006      0.021     0.27   0.790       -0.035       0.046
            coeff70 |      0.034      0.021     1.65   0.100       -0.007       0.075
            coeff71 |      0.009      0.022     0.41   0.684       -0.034       0.052
            coeff72 |      0.038      0.023     1.64   0.101       -0.007       0.084
            coeff73 |      0.045      0.023     1.92   0.055       -0.001       0.091
            coeff75 |      0.031      0.024     1.30   0.194       -0.016       0.078
            coeff77 |      0.058      0.025     2.36   0.018        0.010       0.107
            coeff78 |      0.060      0.026     2.32   0.020        0.009       0.110
            coeff80 |      0.048      0.026     1.83   0.067       -0.003       0.099
            coeff82 |      0.053      0.026     2.05   0.041        0.002       0.104
            coeff83 |      0.036      0.027     1.36   0.175       -0.016       0.089
            coeff85 |      0.031      0.026     1.18   0.236       -0.020       0.081
            coeff87 |      0.047      0.026     1.78   0.076       -0.005       0.099
            coeff88 |      0.024      0.029     0.84   0.400       -0.032       0.081
            省略...
--------------------+----------------------------------------------------------------
            sigma_u |  .36355618
            sigma_e |  .29351858
                rho |  .60539259   (fraction of variance due to u_i)
-------------------------------------------------------------------------------------

可以看出,在政策实行之前的系数 coeff69 - coeff77 基本不显著,政策实行之后的系数 coeff78coeff80coeff82 显著异于0。

同时,我们可以使用 coefplot 命令将平行趋势检验和各期政策效果以图形的形式表示出来。具体关于 coefplot 命令的介绍,可参考连享会推文「Stata可视化:让他看懂我的结果」

. coefplot dynamic, keep(coeff*) vertical recast(connect) yline(0) ///
>     xline(`countsmall78') ciopts(recast( > rline) lpattern(dash))

3. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh did, m
安装最新版 lianxh 命令:
ssc install lianxh, replace

相关课程

免费公开课

最新课程-直播课

专题 嘉宾 直播/回看视频
最新专题 文本分析、机器学习、效率专题、生存分析等
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]
  • Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。

课程主页

课程主页

关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 连享会-主页知乎专栏,700+ 推文,实证分析不再抓狂。直播间 有很多视频课程,可以随时观看。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会-常见问题解答:
https://gitee.com/lianxh/Course/wikis

New! lianxhsongbl 命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh