Differenza nelle differenze con i dati del pannello di livello individuale


11

Qual è il modo corretto di specificare una differenza nel modello di differenza con i dati del pannello di livello individuale?

Ecco l'impostazione: supponiamo che io abbia i dati del panel a livello individuale incorporati nelle città per più anni e il trattamento varia a livello di città-anno. Formalmente, sia essere il risultato per individuo i nella città s e anno t e D s t essere un manichino per se l'intervento interessata città s nell'anno t . Uno stimatore DiD tipico come quello descritto in Bertrand et al (2004, p. 250) si basa su un semplice modello OLS con termini di effetto fissi per città e anno:yioStioStDStSt

yioSt=UNS+Bt+cXioSt+βDSt+εioSt

Ma quello stimatore ignora la struttura del pannello a livello individuale (vale a dire più osservazioni per ciascun individuo all'interno delle città)? Ha senso estendere questo modello con un termine a effetto fisso a livello individuale ? Molte applicazioni DiD utilizzano i dati ripetuti della sezione trasversale senza i dati del pannello a livello individuale.Sio


Bertrand, Marianne, Esther Duflo e Sendhil Mullainathan. 2004. "Quanto dovremmo fidarci delle stime delle differenze nelle differenze?" Quarterly Journal of Economics 119 (1): 249–75.


Se vuoi catturare gli effetti dei manichini delle entità, perché non fare un modello a effetti fissi? DID è equivalente a FE con 2 periodi di tempo, quindi includere i manichini e quindi fare DID li farebbe cadere.
VCG

Correggimi se sbaglio, ma vedo due differenze: a) un modello fe userebbe un confronto all'interno dell'unità per stimare l'effetto (ad es. Il reddito è più alto o più basso dopo un determinato evento della vita). L'idea di un approccio DiD è quella di utilizzare altre osservazioni come tendenza di controllo per catturare ciò che sarebbe accaduto senza il trattamento. b) DiD si concentra a livello di gruppo e non a livello di trattamento individuale. Ora la domanda è cosa succede se aggiungo semplicemente un termine individuale a livello di equazione nel mio esempio. Questo usa il controllo obs come una tendenza di controllo? Tuttavia, tutti i controlli non variano sul trattamento ...
Greg

Risposte:


11

Una buona caratteristica delle differenze di differenza (DiD) è in realtà che non sono necessari i dati del pannello per questo. Dato che il trattamento avviene a un certo livello di aggregazione (nel tuo caso le città), devi solo campionare individui casuali dalle città prima e dopo il trattamento. Ciò consente di stimare

yioSt=UNg+Bt+βDSt+cXioSt+εioSt
e ottenere l'effetto causale del trattamento come differenza atteso post pre pre risultato per il trattamento meno la differenza atteso post pre pre risultato per il controllo.

yiot=αio+Bt+βDiot+cXiot+εiot
Diot di Steve Pischke.

UNg

Ecco un esempio di codice che mostra che è così. Uso Stata ma puoi replicarlo nel pacchetto statistico di tua scelta. Gli "individui" qui sono in realtà paesi ma sono ancora raggruppati secondo alcuni indicatori di trattamento.

* 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
-------------+----------------------------------------------------------------

Quindi vedi che il coefficiente DiD rimane lo stesso quando sono inclusi i singoli effetti fissi ( aregè uno dei comandi di stima degli effetti fissi disponibili in Stata). Gli errori standard sono leggermente più severi e il nostro indicatore di trattamento originale è stato assorbito dai singoli effetti fissi e quindi diminuito nella regressione.

In risposta al commento
ho citato l'esempio di Pischke per mostrare quando le persone usano singoli effetti fissi piuttosto che un indicatore del gruppo di trattamento. La tua impostazione ha una struttura di gruppo ben definita, quindi il modo in cui hai scritto il tuo modello va benissimo. Gli errori standard dovrebbero essere raggruppati a livello di città, cioè il livello di aggregazione a cui si verifica il trattamento (non l'ho fatto nel codice di esempio ma nelle impostazioni DiD gli errori standard devono essere corretti come dimostrato dal documento di Bertrand et al ).

DStSt

c=[E(yioSt|S=1,t=1)-E(yioSt|S=1,t=0)]-[E(yioSt|S=0,t=1)-E(yioSt|S=0,t=0)]

E(yioSt|S=1,t=1)E(yioSt|S=0,t=1). Per chiarire perché l'identificazione proviene dalle differenze del gruppo nel tempo e non dai motori, è possibile visualizzarlo con un semplice grafico. Supponiamo che il cambiamento nel risultato sia veramente solo a causa del trattamento e che abbia un effetto contemporaneo. Se abbiamo un individuo che vive in una città trattata dopo l'inizio del trattamento, ma poi si trasferisce in una città di controllo, il risultato dovrebbe tornare a quello che era prima di essere curato. Questo è mostrato nel grafico stilizzato di seguito.

inserisci qui la descrizione dell'immagine

Potresti comunque voler pensare ai motori per altri motivi. Ad esempio, se il trattamento ha un effetto duraturo (cioè influenza ancora il risultato anche se l'individuo si è mosso)


2
Bella risposta. Consiglieresti anche di raggruppare gli errori a livello di città qui?
Dimitriy V. Masterov,

Ottima risposta, grazie. La tua eq è eq 3 da pagina 12, giusto? Pischke introduce questa parte con "Tuttavia, a volte non ci sono unità naturali a cui è assegnato il trattamento. Invece, alcune persone vengono trattate in un determinato momento e altre no". Ma non è proprio così. Il trattamento è a livello di città (o di qualsiasi gruppo) nella mia impostazione + ho dati del panel. Potrebbe essere ancora il modello giusto, forse con se cluster. Cosa vorresti dire? Che cosa succede se gli individui possono spostarsi tra le città negli anni? In tal caso, il coef per "trattato" sarebbe identificato in base ai motori, giusto?
Greg

@ DimitriyV.Masterov La raccomandazione di Bertrand et al sarebbe quella di raggruppare gli errori standard a livello di gruppo a cui avviene il trattamento. In alternativa, è possibile utilizzare un blocco bootstrap con sostituzione anche se sarebbe di nuovo a livello di città.
Andy,

@greg Ho modificato la risposta per rispondere con un po 'più di dettaglio al tuo commento. Spero che questo aiuti :-)
Andy

fa differenza se utilizziamo più periodi? il manichino D_i_t sarà zero per tutti i periodi precedenti l'evento e sarà comunque uno per tutti i periodi successivi all'evento. non sarebbe lo stesso se usassi solo due punti? @Andy
Jinhua Wang

1

La risposta breve è che l'uso dell'effetto fisso a livello di unità o di gruppo trattato non cambia la stima, ma solo l'inferenza. In genere, l'utilizzo dell'unità a effetto fisso assorbirà più variazioni e quindi si avranno errori standard più piccoli.

Il fatto che le unità si trovino nello stesso gruppo aggregato non modifica questo risultato (cambia solo il modo in cui definisci il livello del gruppo trattato e il fatto che hai bisogno di un riquadro anziché di sezioni trasversali ripetute).

Nota comunque che l'equivalenza vale solo quando non c'è X covariata. Non appena hai X, i risultati sono diversi se usi effetti fissi di unità o di gruppo.

L'esempio seguente confronta i 3 stimatori, in due casi, con e senza X. Gli stimatori sono:

  1. OLS
  2. FE con effetto fisso (trattato) di gruppo
  3. FE con effetto fisso unitario

#>              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

Codice:

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"))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.