개별 레벨 패널 데이터와의 차이의 차이


11

개별 레벨 패널 데이터로 차이 모델의 차이를 지정하는 올바른 방법은 무엇입니까?

설정은 다음과 같습니다. 여러 해 동안 도시에 개별 수준의 패널 데이터가 포함되어 있으며 처리는 도시 수준에 따라 다르다고 가정하십시오. 공식적으로하자 개인에 대한 결과가 될 나는 도시 연도 tD t 에 대한 더미가 될 개입의 영향을 도시 여부 에서 년 t . Bertrand et al (2004, p. 250)에 요약 된 것과 같은 전형적인 DiD 추정기는 도시와 연도에 대한 고정 효과 항을 가진 간단한 OLS 모델을 기반으로합니다.yististDstst

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

그러나 그 추정기는 개별 수준의 패널 구조 (예 : 도시 내 각 개인에 대한 다중 관측치)를 무시합니까? 개별 수준의 고정 효과 항 로이 모델을 확장하는 것이 합리적 입니까? 많은 DiD 응용 프로그램은 개별 레벨 패널 데이터없이 반복적 인 단면 데이터를 사용합니다.Si


베르트랑, 마리안, 에스더 듀플로, 센딜 물 라이나 단. 2004.“차이 추정치 차이를 얼마나 신뢰해야합니까?” Quarterly Journal of Economics 119 (1) : 249–75.


엔터티 인형의 효과를 캡처하려면 고정 효과 모델을 사용하지 않는 이유는 무엇입니까? DID는 2 개의 기간이있는 FE와 동일하므로 인형을 포함하여 DID를 수행하면 누락됩니다.
VCG

내가 틀렸지 만 두 가지 차이점을 발견하면 나를 바로 잡으십시오. DiD 접근법의 아이디어는 다른 관찰을 제어 추세로 사용하여 치료없이 발생했을 수있는 일을 포착하는 것입니다. b) DiD는 개인 수준의 치료가 아닌 그룹 수준에 중점을 둡니다. 이제 문제는 예제에서 방정식에 개별 수준 fe 항을 추가하면 어떻게됩니까? 컨트롤 오 버스를 컨트롤 트렌드로 사용합니까? 모든 통제 obs는 치료에 달려 있지 않다…
greg

답변:


11

차이 차이 (DiD)의 좋은 기능은 실제로 패널 데이터가 필요 없다는 것입니다. 치료가 일종의 집계 수준 (귀하의 도시에서는)에서 발생한다고 가정하면 치료 전후에 도시에서 무작위로 개체를 샘플링하기 만하면됩니다. 이를 통해 를 추정 할 수 있습니다

yist=Ag+Bt+βDst+cXist+ϵist
치료에 대한 예상 사후 결과 차이에서 대조군에 대한 예상 사후 결과 차이를 뺀 것으로 치료의 인과 적 효과를 얻는다.

yit=αi+Bt+βDit+cXit+ϵit
Dit Steve Pischke가

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 계수가 동일하게 유지됩니다 ( aregStata에서 사용 가능한 고정 효과 추정 명령 중 하나임). 표준 오차는 약간 더 엄격하며, 원래의 치료 지표는 개별 고정 효과에 의해 흡수되어 회귀에서 떨어졌습니다.

의견에 응답하여
사람들이 치료 그룹 지표가 아닌 개별 고정 효과를 사용할 때를 보여주는 Pischke 예제를 언급했습니다. 설정에는 그룹 구조가 잘 정의되어 있으므로 모델을 작성하는 방식이 완벽합니다. 표준 오류는 도시 수준, 즉 처리가 수행되는 집계 수준에서 클러스터되어야합니다 (예제 코드에서는이 작업을 수행하지 않았지만 DiD 설정에서는 표준 오류를 Bertrand et al 논문에서 입증 된대로 수정해야 함) ).

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)]

E(yist|s=1,t=1)E(yist|s=0,t=1). 발동기가 아닌 시간에 따른 그룹 차이에서 식별이 발생하는 이유를 명확하게하기 위해 간단한 그래프로이를 시각화 할 수 있습니다. 결과의 변화가 진정 치료 때문이고 동시에 효과가 있다고 가정하십시오. 치료가 시작된 후 치료 도시에 거주하지만 통제 도시로 이사하는 개인이있는 경우, 결과는 치료 전 상태로 되돌아 가야합니다. 아래 양식화 된 그래프에 나와 있습니다.

여기에 이미지 설명을 입력하십시오

그래도 다른 이유로 이동자들에 대해 생각하고 싶을 수도 있습니다. 예를 들어, 치료에 지속적인 효과가있는 경우 (즉, 개인이 움직여도 여전히 결과에 영향을 미침)


2
좋은 대답입니다. 도시 수준에서 오류를 클러스터링하는 것이 좋습니다?
Dimitriy V. Masterov

좋은 답변, 감사합니다. 귀하의 EQ는 12 페이지의 EQ 3입니다. Pischke는이 부분을 "그러나 치료가 할당 된 자연 단위가없는 경우가 있습니다. 대신 특정 시점에서 치료를받는 사람들도 있고 그렇지 않은 사람들도 있습니다"라고 소개합니다. 그러나 실제로는 그렇지 않습니다. 내 설정에서 도시 (또는 모든 그룹) 수준의 치료는 + 패널 데이터가 있습니다. 클러스터 된 se로 여전히 올바른 모델 일 수 있습니다. 뭐라고 하시겠습니까? 개인이 여러 해 동안 도시를 이동할 수 있다면 어떨까요? 이 경우 '치료 된'에 대한 계수는 이동자를 기준으로 식별됩니다.
greg

@ DimitriyV.Masterov Bertrand 등의 권고는 치료가 발생하는 그룹 수준에서 표준 오류를 군집화하는 것입니다. 대신 도시 부트 레벨에 있지만 대체와 함께 블록 부트 스트랩을 사용할 수 있습니다.
Andy

@greg 귀하의 의견에 좀 더 자세하게 답변하기 위해 답변을 편집했습니다. 나는 이것이 도움이되기를 바랍니다 :-)
Andy

여러 기간을 사용하면 차이가 있습니까? 더미 D_i_t는 이벤트 전 모든 기간에 대해 0이되고 어쨌든 이벤트 후 모든 기간에 대해 1이됩니다. 방금 두 기간을 사용한 경우에도 동일하지 않습니까? @Andy
진화 왕

1

짧은 대답은 단위 또는 치료 그룹 수준에서 고정 효과를 사용하는 것이 추정을 변경하지 않고 추론 만 변경한다는 것입니다. 일반적으로 단위 고정 효과를 사용하면 더 많은 변형이 흡수되므로 표준 오류가 더 작아집니다.

단위가 동일한 집계 그룹에 있는지 여부는이 결과를 변경하지 않습니다 ( 처리 된 그룹 레벨 정의 방법 및 반복되는 단면 대신 패널이 필요하다는 사실 만 변경됨 ).

그러나 공변량 X가없는 경우에만 동등성이 유지됩니다. X가있는 즉시 단위 효과 또는 그룹 고정 효과 사용 여부에 따라 결과가 다릅니다.

아래의 예는 두 가지 경우에 X가 있거나없는 세 가지 추정기를 비교합니다.

  1. OLS
  2. (처리 된) 그룹 고정 효과를 갖는 FE
  3. 단위 고정 효과가있는 FE

#>              OLS         FE treated  FE unit   OLS x       FE treated x  FE unit x
#> ----------------------------------------------------------------------------------
#> (Intercept)   0.500 ***                         0.491 ***                         
#>              (0.094)                           (0.107)                            
#> did          -0.403 *    -0.403 *    -0.403 *  -0.407 *    -0.407 *      -0.460 * 
#>              (0.185)     (0.185)     (0.183)   (0.189)     (0.189)       (0.187)  
#> x1                                              0.018       0.018         0.220   
#>                                                (0.104)     (0.104)       (0.165)  
#> ----------------------------------------------------------------------------------
#> Num. obs.    70          70          70        70          70            70       
#> ==================================================================================
#> *** 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_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_ols_x, reg_fe_a_x, reg_fe_b_x), 
          omit.coef = "time|treated", digits=3, 
          include.rsquared = FALSE, include.adjrs = FALSE, include.rmse = FALSE,
          custom.model.names = c("OLS", "FE treated", "FE unit", "OLS x", "FE treated x", "FE unit x"))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.