Fuzzy DID:模糊倍分法

发布时间:2021-02-01 阅读 10784

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

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

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

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

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

作者: 曹昊煜 (兰州大学)
E-Mail: caohy19@lzu.edu.cn


目录


编者按: 本文部分内容翻译自 Fuzzy Differences-in-Differences with Stata,特此致谢!

1. 简介

双重差分 (DID) 是政策评估的常用方法,其通常的做法 (sharp design) 是把样本区分为处理组 (treatment group) 和控制组 (control group) 两组 (G) ,并且保证仅有处理组在某个时间点 (T) 之后受到政策干预 (treat) 。通过构造交互项 D=G×T 识别政策的平均处理效应 (average treatment effect,ATE) 。

但在有些情况下,可能不存在非常明确的分组方式,即没有“干净”的处理组和控制组,所有个体都或多或少受到了政策的影响。此时 DG×T ,处理效应的识别难度也相应增加。在这样的情况下,可以使用 Chaisemartin 和 Haultfoeuille 提出的模糊双重差分 ( Fuzzy Differences-in-Differences,FDID ) 方法识别政策效果。

2. 假设与识别

表示受到和不受到处理 (treat) 的潜在收入,Y=Y(D) 表示可观察的收入,G{0,...,g¯} 且 T{0,...,t¯}

为简单起见先考虑 t¯=1,g¯=1 的情况。对于随机变量 RS(R) 表示其密度可能范围 (support);Rdgt 下标分别表示处理效应大小、组别、时间 Rgt 下标分别表示组别和时间;F(R) 表示其分布函数,相应地,FR1q 表示 R 的第 q 分位数。

2.1 符号约定

在开始介绍方法之前,首先设定 Y=Y(1) 和 Y=Y(0) 为变量的潜在结果,Y=Y(D) 表示可观测的结果变量。组别 G{0,...,g¯},时间 T{0,...,t¯},也就是该方法可以推广到多期多组的情形。对于随机变量 RS(R) 表示其可能的范围,Rdgt 和 Rgt 表示给定处理情况、分组和时间的条件分布。最后,使用 F(R) 和 FR1(q) 表示随机变量的分布函数和分位数。

2.2 基本假设

模糊双重差分的识别首先依赖三个主要的假设:

假设 1:模糊设定假设

该假设表明处理组在 0 和 1 期的期望变动为正且高于控制组。

假设 2:控制组中的个体稳定性

该假定说明控制组前后被处理的概率相同,并且严格落在 0~1 之间。这实际是对对照组设定的一种要求,如果对照组不能满足这一点就不应该作为对照组。

假设 3:处理参与方程

假设 3 意味着给定组别时,每个组的任意一期的处理效应与时间无关。

2.3 识别

基于以上三个假定,可以定义子群 $S={D(0)

局部平均效应的估计量有三种,分别是:

三种统计量都可以看成是 2SLS 统计量,WDID 是把 GT 当作 IV 时 Y 对 D 的 2SLS 估计量,其包含了时间和组别上面的变化。WTCWCIC 则是在有一定的权重下把 T 作为 IV 的 2SLS 估计量,仅包含时间上的变化。

3. Stata 范例

本小节介绍如何使用 fuzzydid 命令估计 Eq.(1) 的结果,在使用该命令之前,请首先运行如下命令,以便安装程序包,并下载作者提供的范例数据和 dofiles:

. ssc install fuzzydid, replace // 安装命令包
. net get fuzzydid.pkg          // 下载作者提供的 dofile 和数据到当前工作路径下

亦可执行如下命令,并在弹出窗口中点击「****」来手动安装和下载:

. net describe fuzzydid, from(http://fmwww.bc.edu/RePEc/bocode/f)

作者提供的附件资料如下,其中,turnout_dailies_1868-1928.dta 会在后续分析中使用。

ANCILLARY FILES                         
      fuzzydid_Gentzkowappli.do
      ../s/simus.do
      ../t/turnout_dailies_1868-1928.dta

3.1 fuzzydid 的基本语法

fuzzydid 的基本语法如下:

fuzzydid Y G T D [if] [in]   ///
    [, did tc cic lqte newcateg(numlist)    ///
    numerator partial nose cluster(varname) ///
    breps(#) eqtest continuous(varlist)     ///
    qualitative(varlist) ///
    sieves sieveorder(#) tagobs]

下面我们具体解释命令各项符号的含义:

必要的选项:

  • Y 是结果变量
  • G 是分组变量,当数据为两期两组时,G 仅仅需要设定为虚拟变量形式,但在其他情形下,G 至少应包含虚拟变量及其前推一期
  • T 是时间变量
  • D 是处理变量

可选择的主要选项:

  • did 计算 WDID 估计量
  • tc 计算 WTC 估计量
  • cic 计算 WCTC 估计量
  • lqte 选项分别计算 {5%, 10%,..., 95%} 分位数的处理效应 τq^,附加这一选项的前提是 G,T,D 是离散变量,并且模型中不含协变量
  • numerator 附加该选项则只计算 WDIDWTCWCIC 估计量的分子
  • partial 计算估计量的边界
  • nose 只计算统计量,而不计算标准误
  • cluster(varname) 使用 Bootstrap 方法在设定的层级上获得聚类稳健标准误
  • breps(#) 设定 Bootstrap 的自抽样次数,默认为 50
  • eqtest 当同时设定了两个或以上的 didtccic 选项时,附加 eqtest 用于比较估计量之间的差异
  • tagobs 生成一个新变量标记使用的样本

附加协变量的选项:

  • continuous(varlist)qualitative(varlist) 分别用于指定加入方程的连续型协变量和离散型协变量
  • sieves 表示在包含有协变量的情况下使用非参数方法估计 WDIDXWTCX 的期望
  • sieveorder(#) 设定误差的阶数,其中的 # 必须大于或等于 2

3.2 实证分析:报纸对参与大选的影响

本文的示例部分的数据来自 Gentzkow et al. (2011) ,该文章使用美国 1868~1928 年间的县级面板数据讨论了报纸对参与选举的影响。数据文件中的变量 pres_turnoutnumdailies 分别表示历次大选的参与情况和报纸数量。

* net get fuzzydid.pkg // 下载作者提供的 dofile 和数据到当前工作路径下
use "turnout_dailies_1868-1928.dta", clear // 调入范例数据
sum pres_turnout numdailies

首先从系统中调入范例数据,并对关键变量进行表述性分析,可见样本区间内各县参与选举的平均比例为 65.01% ,报纸数量的均值为 1.46 。

    Variable |    Obs       Mean   Std. Dev.       Min     Max
-------------+------------------------------------------------
pres_turnout | 16,872     .65014   .2210102   .0017981   2.518
  numdailies | 16,872   1.463134   2.210448          0      45

接下来使用前两期数据(1868 和 1872)演示该情形下,W^DIDW^TCW^CTC 的估计。额外定义一个虚拟变量 G1872 ,若 1868 年 ~ 1872 年间某县区的报纸数量上升,则令其为 1 。在该模型中,报纸数量下降的县区被排除在外,估计中还对处理变量进行了重新归类,并计算聚类文件标准误。

. keep if year == 1868 | year == 1872

// 确定分组变量
. gen G1872=(fd_numdailies>0)   ///
      if (year==1872) & (fd_numdailies!=.) ///
      & (fd_numdailies>=0&sample==1)  

. sort cnty90 year
. replace G1872=G1872[_n+1] if cnty90==cnty90[_n+1]&year==1868

. fuzzydid pres_turnout G1872 year numdailies,  ///
      did tc cic newcateg(0 1 2 45) breps(200)  ///
      cluster(cnty90)  // 此时的处理变量是一个连续变量


Bootstrap replications (200)
----+--- 1 ---+--- 2 ---+--- 3 ---+--- 4 ---+--- 5
..................................................    50
..................................................   100
..................................................   150
..................................................   200

Estimator(s) of the local average treatment effect with 
bootstrapped standard errors.  
Cluster variable: cnty90.  
Number of observations:  1424 .

       |     LATE    Std_Err          t    p_value   lower_ic   upper_ic
-------+-----------------------------------------------------------------
 W_DID | .0047699   .0160903   .2964428    .766892  -.0230387   .0377381
  W_TC | .0266618   .0164816   1.617671   .1057335  -.0021458   .0586236
 W_CIC | .0133223   .0132744   1.003613   .3155653  -.0116416   .0348834

结果的每一列分别表示局部平均处理效应的估计结果、稳健标准误、t 值及其对应 p 值和置信区间。三类点估计结果都为正,但并并不显著,其原因可能在于两期数据样本量较小。

接下来估计局部分位数处理效应,仍然使用 1868 和 1872 年的数据。此时的 fuzzydid 仅支持离散的处理变量,因此使用 numdailies_bin 变量代替 numdailies

. gen numdailies_bin = (numdailies>0)
. fuzzydid pres_turnout G1872 year numdailies_bin, ///
           lqte breps(200) cluster(cnty90)

. fuzzydid pres_turnout G1872 year numdailies_bin, ///
           lqte breps(200) cluster(cnty90)

Bootstrap replications (200)
----+--- 1 ---+--- 2 ---+--- 3 ---+--- 4 ---+--- 5
..................................................    50
..................................................   100
..................................................   150
..................................................   200

Estimators of local quantile treatment effects with bootstrapped standard errors.  
Cluster variable: cnty90.  Number of observations: 1424 .

      |      LQTE    Std_Err          t    p_value   lower_ic   upper_ic
------+------------------------------------------------------------------
  q_5 |      .154   .1500589   1.026264   .3047672      -.038   .4982885
 q_10 |      .072   .0901928   .7982899   .4247023      -.079       .245
 q_15 |     -.007   .0771367  -.0907476   .9276931     -.0835      .1925
 q_20 |      .005   .0633607   .0789131   .9371017     -.0825      .1655
 q_25 | -.0040001   .0566226  -.0706444   .9436808     -.1055       .126
 q_30 |     -.034   .0591615  -.5746983   .5654953     -.1225       .121
 q_35 | -.0270001   .0551444  -.4896252   .6243992       -.12      .0865
 q_40 |     -.052    .049529  -1.049891   .2937684  -.1244999      .0675
 q_45 | -.0529999   .0438851  -1.207697    .227164      -.114       .057
 q_50 | -.0330001   .0431931  -.7640123   .4448599      -.113      .0575
 q_55 | -.0270001   .0442831  -.6097145    .542051  -.1034999       .074
 q_60 |      .011   .0481622   .2283946   .8193395     -.0995        .08
 q_65 |       .02   .0474835      .4212   .6736091  -.0994999      .0855
 q_70 |  .0249999   .0465543   .5370058   .5912636  -.0900001      .0885
 q_75 |      .024   .0421916   .5688336   .5694691     -.0885      .0895
 q_80 |       .02   .0354423   .5642961   .5725526      -.087       .077
 q_85 |  .0210001   .0340442   .6168486   .5373346      -.067       .072
 q_90 |      .037   .0297976   1.241709    .214344      -.051       .068
 q_95 |      .025   .0275591   .9071403   .3643326      -.041       .067

该结果计算了各分位数 q=0.05,0.10,,0.95 的 τ^q 的估计结果,然而,各个分位数上的点估计结果显著性并不理想。

进一步,使用全样本计算 W^DIDW^TCW^CIC 。当特定的县区 c 和年份 t 报纸数量增加时,定义 G_T 为 1,报纸数量不变或下降时定义为 G_T 为 0 或 1G_Tplus1 表示 G_T 的前推一期。此外,命令中附加了 eqtest 选项,以比较结果间是否存在显著差异。

. use "turnout_dailies_1868-1928.dta", clear

. sort cnty90 year
. by cnty90 year: egen mean_D = mean(numdailies)
. by cnty90: gen lag_mean_D = mean_D[_n-1]  ///
    if (cnty90==cnty90[_n-1]) & (year-4==year[_n-1])
. gen G_T = sign(mean_D - lag_mean_D) if sample==1
. gen G_Tplus1 = G_T[_n+1] if cnty90==cnty90[_n+1]&year+4==year[_n+1]
 
. fuzzydid pres_turnout G_T G_Tplus1 year numdailies, did tc cic   ///
           newcateg(0 1 2 45) breps(200) cluster(cnty90) eqtest


Bootstrap replications (50)
----+--- 1 ---+--- 2 ---+--- 3 ---+--- 4 ---+--- 5
..................................................    50

Estimator(s) of the local average treatment effect with bootstrapped standard errors.  Cluster variable: cnty90.  Number of
observations:  16872 .

             |      LATE    Std_Err          t    p_value   lower_ic   upper_ic
-------------+------------------------------------------------------------------
       W_DID |  .0037507   .0011952   3.138276   .0016995   .0012794   .0056295
        W_TC |  .0053305    .001263   4.220367   .0000244   .0026724   .0070759
       W_CIC |   .004215   .0015391   2.738691   .0061684   .0010033   .0071204

Estimators equality test

             |     Delta    Std_Err          t    p_value   lower_ic   upper_ic
-------------+------------------------------------------------------------------
      DID_TC | -.0015798   .0003489  -4.527442   5.97e-06  -.0023057   -.000944
     DID_CIC | -.0004643   .0007062  -.6574857   .5108687  -.0018933   .0003862
      TC_CIC |  .0011155   .0006045   1.845166   .0650133  -.0002279   .0019818

Wald-DID 的估计结果为 0.0038 ,这说明每增加一个县区的报纸数量,选民在总统选举中的投票率就会提高 0.38 个百分点,结果在 5% 水平下显著。Wald-TC 和 Wald-CIC 的结果分别为 0.0053 和 0.0042 ,总体上也是显著的。在 3 组 16 期的情形下,改命令的计算速度有所下降。

最后,可以在模型中加入州层面的个体效应作为协变量,做法仍然是使用各州的虚拟变量,结果如下:

. fuzzydid pres_turnout G_T G_Tplus1 year numdailies,  ///
      did tc newcateg(0 1 2 45) ///
      qualitative(st1-st48) breps(50) cluster(cnty90) eqtest   
*-Note: 该命令不能计算Wald-CIC估计量,为节省运行时间,自抽样次数仅仅设定为50次

Bootstrap replications (50)
----+--- 1 ---+--- 2 ---+--- 3 ---+--- 4 ---+--- 5
..................................................    50

No method was specified to estimate E(Y|X), E(D|X) and P(D=d|X). Method set to default: ols.


Estimator(s) of the local average treatment effect with bootstrapped standard errors.  Cluster variable: cnty90.  Number of
observations:  16872 .  Controls included in the estimation:  st1 st2 st3 st4 st5 st6 st7 st8 st9 st10 st11 st12 st13 st14 st15 st16
st17 st18 st19 st20 st21 st22 st23 st24 st25 st26 st27 st28 st29 st30 st31 st32 st33 st34 st35 st36 st37 st38 st39 st40 st41 st42
st43 st44 st45 st46 st47 st48 .

             |      LATE    Std_Err          t    p_value   lower_ic   upper_ic
-------------+------------------------------------------------------------------
       W_DID |  .0026383   .0009817   2.687479   .0071994   .0006856   .0043835
        W_TC |  .0043428   .0011789   3.683668   .0002299   .0015496   .0060633

Estimators equality test

             |     Delta    Std_Err          t    p_value   lower_ic   upper_ic
-------------+------------------------------------------------------------------
      DID_TC | -.0017046   .0007947  -2.144923    .031959  -.0030505  -.0002611

控制州层面的虚拟变量后,W^DID=0.0026W^TC=0.0043,并且二者在统计上显著。但加入协变量后,该命令的计算速度大大下降,如果指定的自抽样次数为 200,那么命令的计算时间将长达 180 分钟!!!

最后,让我们来总结一下 $Fuzzy DID** 方法:

  • 当我们无法找到干净的处理组和控制组时,只需要有力的分组依据,就可以考虑使用模糊双重差分这一方法识别局部的平均处理效应
  • 该方法意味着我们不必苦苦追寻分组明确的自然实验,但如果需要在模型中控制更多变量时,我们就只能用时间为精确的识别埋单。

4. 相关推文

Note:产生如下推文列表的命令为:
lianxh DID 倍分法 差分
安装最新版 lianxh 命令:
ssc install lianxh, replace

相关课程

连享会-直播课 上线了!
http://lianxh.duanshu.com

免费公开课:


课程一览

支持回看

专题 嘉宾 直播/回看视频
最新专题 因果推断, 空间计量,寒暑假班等
数据清洗系列 游万海 直播, 88 元,已上线
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]

Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。


关于我们

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

连享会主页  lianxh.cn
连享会主页 lianxh.cn

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

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

✏ 连享会学习群-常见问题解答汇总:
https://gitee.com/arlionn/WD

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