与个体水平面板数据的差异

机器算法验证 计量经济学 面板数据 固定效应模型 差异中的差异
2022-01-21 10:59:19

使用单个水平面板数据指定差异模型差异的正确方法是什么?

这是设置:假设我在城市中嵌入了个人级别的面板数据多年,并且处理方式因城市年级别而异。形式上,设是城市年个人的结果,而是干预是否影响的虚拟变量。典型的 DiD 估计器,例如 Bertrand 等人 (2004, p. 250) 中概述的估计器,是基于一个简单的 OLS 模型,具有城市和年份的固定效应项:yististDstst

yist=As+Bt+cXist+βDst+ϵist

但是该估计器是否忽略了个体层面的面板结构(即城市内每个个体的多个观察值)?扩展这个模型是否有意义许多 DiD 应用程序使用重复的横截面数据,而没有单个级别的面板数据。Si


Bertrand、Marianne、Esther Duflo 和 Sendhil Mullainathan。2004. “我们应该在多大程度上相信差异估计?” 经济学季刊 119(1):249-75。

3个回答

差异中的差异 (DiD) 的一个很好的功能实际上是您不需要面板数据。鉴于处理发生在某种聚合级别(在您的情况下为城市),您只需要在处理之前和之后从城市中随机抽取个体。这允许您估计 并获得治疗的因果效应作为预期的事前结果差异处理减去控制的预期后预结果差异。

yist=Ag+Bt+βDst+cXist+ϵist

在某些情况下,人们使用个体固定效应而不是治疗指标,这是当我们没有明确定义的聚合水平时,治疗发生。在这种情况下,您将估计 其中是治疗后时期的指标接受了治疗(例如,在各地开展的就业市场计划)。有关这方面的更多信息,请参阅 Steve Pischke 的这些讲义

yit=αi+Bt+βDit+cXit+ϵit
Dit

在您的设置中,添加单个固定效应不应该改变与点估计相关的任何内容。治疗指标只会被各个固定效果吸收。但是,这些固定效应可能会吸收一些剩余方差,因此可能会降低 DiD 系数的标准误差。Ag

这是一个代码示例,它显示了这种情况。我使用 Stata,但您可以在您选择的统计包中复制它。这里的“个人”实际上是国家,但它们仍然根据一些治疗指标进行分组。

* load the data set (requires an internet connection)
use "http://dss.princeton.edu/training/Panel101.dta"

* generate the time and treatment group indicators and their interaction
gen time = (year>=1994) & !missing(year)
gen treated = (country>4) & !missing(country)
gen did = time*treated

* do the standard DiD regression
reg y_bin time treated did

------------------------------------------------------------------------------
       y_bin |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
        time |       .375   .1212795     3.09   0.003     .1328576    .6171424
     treated |   .4166667   .1434998     2.90   0.005       .13016    .7031734
         did |  -.4027778   .1852575    -2.17   0.033    -.7726563   -.0328992
       _cons |         .5   .0939427     5.32   0.000     .3124373    .6875627
------------------------------------------------------------------------------

 * now repeat the same regression but also including country fixed effects
 areg y_bin did time treated, a(country)

------------------------------------------------------------------------------
       y_bin |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
        time |       .375    .120084     3.12   0.003     .1348773    .6151227
     treated |          0  (omitted)
         did |  -.4027778   .1834313    -2.20   0.032    -.7695713   -.0359843
       _cons |   .6785714    .070314     9.65   0.000       .53797    .8191729
-------------+----------------------------------------------------------------

因此,您会看到,当包含单个固定效应时,DiD 系数保持不变(areg是 Stata 中可用的固定效应估计命令之一)。标准误差稍微紧一些,我们原来的治疗指标被个体固定效应吸收,因此在回归中下降。

在回应评论
时,我提到了 Pischke 示例,以显示人们何时使用个体固定效应而不是治疗组指标。您的设置具有明确定义的组结构,因此您编写模型的方式非常好。标准误差应该集中在城市级别,即处理发生的聚合级别(我在示例代码中没有这样做,但在 DiD 设置中,标准误差需要纠正,如 Bertrand 等人的论文所示)。

关于搬运工,他们在这里没有太多的作用。对于在治疗后时期的人,治疗指标等于 1 要计算 DiD 系数,我们实际上只需要计算四个条件期望,即 Dstst

c=[E(yist|s=1,t=1)E(yist|s=1,t=0)][E(yist|s=0,t=1)E(yist|s=0,t=0)]

因此,如果您有 4 个治疗后时期,前两个时期居住在治疗城市,然后在剩余两个时期移动到控制城市,则前两个观察值将用于计算中的最后两个为了弄清楚为什么识别来自随着时间的推移的群体差异而不是来自移动者,你可以用一个简单的图表来可视化这一点。假设结果的变化真的只是因为治疗,并且它具有同期效应。如果我们有一个人在治疗开始后住在一个治疗的城市,然后搬到一个控制城市,他们的结果应该回到他们接受治疗之前的状态。这显示在下面的程式化图表中。E(yist|s=1,t=1)E(yist|s=0,t=1)

在此处输入图像描述

不过,出于其他原因,您可能仍想考虑搬家公司。例如,如果治疗具有持久的效果(即即使个人已经移动,它仍然会影响结果)

简短的回答是,在单位或治疗组级别使用固定效应不会改变估计,只会改变推断。通常,使用单位固定效应会吸收更多的变化,因此您的标准误差会更小。

单位是否在同一个聚合组中不会改变这个结果(它只会改变您定义处理组级别的方式,以及您需要面板而不是重复横截面的事实)。这同样适用于时间固定效应:您可以使用年份固定效应,也可以只使用 FE 来表示前后。

但是请注意,仅当没有协变量 X 时,等价性才成立。一旦有了 X,无论您使用单位固定效应还是组固定效应,结果都会有所不同。

下面的示例比较了 5 个估计量。估计器是:

  1. OLS
  2. FE 与 FE:(治疗)组(治疗)期
  3. FE 与 FE:按(治疗)期划分的单位
  4. FE 与 FE:(治疗)按年分组
  5. FE 与 FE:按年计算的单位
                      OLS        FE period-group  FE period-unit  FE year-group  FE year-unit
---------------------------------------------------------------------------------------------
did                   -0.4028 *  -0.4028 *        -0.4028 *       -0.4028 *      -0.4028 *   
                      (0.1853)   (0.1853)         (0.1834)        (0.1758)       (0.1727)    
---------------------------------------------------------------------------------------------
Num. obs.             70         70               70              70             70          
Num. groups: time                 2                2                                         
Num. groups: treated              2                                2                         
Num. groups: country                               7                              7          
Num. groups: year                                                 10             10          
=============================================================================================
*** p < 0.001; ** p < 0.01; * p < 0.05

下表显示了前 3 个回归,这次是协变量:

===================================================================
                      OLS x     FE period-group X  FE period-unit X
-------------------------------------------------------------------
did                   -0.407 *  -0.407 *           -0.460 *        
                      (0.189)   (0.189)            (0.187)         
x1                     0.018     0.018              0.220          
                      (0.104)   (0.104)            (0.165)         
-------------------------------------------------------------------
Num. obs.             70        70                 70              
Num. groups: time                2                  2              
Num. groups: treated             2                                 
Num. groups: country                                7              
===================================================================
*** p < 0.001; ** p < 0.01; * p < 0.05

代码:

library(tidyverse)
library(haven)
library(texreg)
library(lfe)


dat <- read_dta("http://dss.princeton.edu/training/Panel101.dta")  %>% 
  mutate(time = (year>=1994) ,
         treated = (country>4),
         did = time*treated)

reg_ols <- lm(y_bin~ time+ treated+ did, data = dat)
reg_fe_a <- felm(y_bin~ did | time+ treated, data = dat)
reg_fe_b <- felm(y_bin~ did | time+ country, data = dat)
reg_fe_c <- felm(y_bin~ did | year+ treated, data = dat)
reg_fe_d <- felm(y_bin~ did | year+ country, data = dat)

reg_ols_x <- update(reg_ols, .~.+x1)
reg_fe_a_x <- update(reg_fe_a, .~.+x1)
reg_fe_b_x <- update(reg_fe_b, .~.+x1)


screenreg(list(reg_ols, reg_fe_a, reg_fe_b, reg_fe_c, reg_fe_d), 
          omit.coef = "time|treated|Intercept", digits=4, 
          include.rsquared = FALSE, include.adjrs = FALSE, include.rmse = FALSE,
          custom.model.names = c("OLS", "FE period-group", "FE period-unit", "FE year-group", "FE year-unit"))
#> 
#> =============================================================================================
#>                       OLS        FE period-group  FE period-unit  FE year-group  FE year-unit
#> ---------------------------------------------------------------------------------------------
#> did                   -0.4028 *  -0.4028 *        -0.4028 *       -0.4028 *      -0.4028 *   
#>                       (0.1853)   (0.1853)         (0.1834)        (0.1758)       (0.1727)    
#> ---------------------------------------------------------------------------------------------
#> Num. obs.             70         70               70              70             70          
#> Num. groups: time                 2                2                                         
#> Num. groups: treated              2                                2                         
#> Num. groups: country                               7                              7          
#> Num. groups: year                                                 10             10          
#> =============================================================================================
#> *** p < 0.001; ** p < 0.01; * p < 0.05

screenreg(list(reg_ols_x, reg_fe_a_x, reg_fe_b_x), 
          omit.coef = "time|treated|Inter", digits=3, 
          include.rsquared = FALSE, include.adjrs = FALSE, include.rmse = FALSE,
          custom.model.names = c("OLS x", "FE period-group X", "FE period-unit X"))
#> 
#> ===================================================================
#>                       OLS x     FE period-group X  FE period-unit X
#> -------------------------------------------------------------------
#> did                   -0.407 *  -0.407 *           -0.460 *        
#>                       (0.189)   (0.189)            (0.187)         
#> x1                     0.018     0.018              0.220          
#>                       (0.104)   (0.104)            (0.165)         
#> -------------------------------------------------------------------
#> Num. obs.             70        70                 70              
#> Num. groups: time                2                  2              
#> Num. groups: treated             2                                 
#> Num. groups: country                                7              
#> ===================================================================
#> *** p < 0.001; ** p < 0.01; * p < 0.05

reprex 包于 2021-04-01 创建(v1.0.0)

作为对其他答案的补充:当您使用面板数据时,个人不是完全随机抽样的——通常,调查波之间可能存在非随机损耗。

Lechner、Rodriguez-Planas 和 Kranz (2016) 表明,这可能导致简单的 DiD 模型与使用固定效应的模型之间存在显着差异。这可能会导致更喜欢固定效应规范。

参考: Lechner、Michael、Nuria Rodriguez-Planas 和 Daniel Fernández Kranz。“当面板不响应时,FE 和 OLS 的差异估计。” 应用统计学杂志 43.11 (2016): 2044-2052。 https://www.tandfonline.com/doi/abs/10.1080/02664763.2015.1126240