Différence dans les différences avec les données de panel de niveau individuel

11

Quelle est la bonne façon de spécifier un modèle de différence de différence avec des données de panneau de niveau individuel?

Voici la configuration: Supposons que j'ai des données de panel au niveau individuel intégrées dans les villes pendant plusieurs années et le traitement varie au niveau de la ville-année. Formellement, soit le résultat pour l'individu dans la ville et l'année et soit un indice pour savoir si l'intervention a affecté la ville dans l'année . Un estimateur DiD typique tel que celui décrit dans Bertrand et al (2004, p. 250) est basé sur un modèle OLS simple avec des termes à effet fixe pour la ville et l'année:yististDstst

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

Mais cet estimateur ignore-t-il la structure des panels au niveau individuel (c'est-à-dire les observations multiples pour chaque individu dans les villes)? Est-il judicieux d'étendre ce modèle avec un terme d'effet fixe au niveau individuel ? De nombreuses applications DiD utilisent des données transversales répétées sans les données de panneau de niveau individuel.Si


Bertrand, Marianne, Esther Duflo et Sendhil Mullainathan. 2004. «Dans quelle mesure devons-nous faire confiance aux estimations des différences dans les différences?» Quarterly Journal of Economics 119 (1): 249–75.

Greg
la source
Si vous voulez capturer les effets des mannequins d'entité, pourquoi ne pas faire un modèle d'effets fixes? DID est équivalent à FE avec 2 périodes de temps, donc inclure les nuls et ensuite faire DID les ferait abandonner.
VCG
Corrigez-moi si je me trompe, mais je vois deux différences: a) un modèle fe utiliserait une comparaison intra-unité pour estimer l'effet (par exemple, le revenu est-il supérieur ou inférieur après un certain événement de la vie). L'idée d'une approche DiD est d'utiliser d'autres observations comme tendance de contrôle pour capturer ce qui se serait passé sans le traitement. b) DiD se concentre sur un traitement au niveau du groupe et non au niveau individuel. Maintenant, la question est de savoir ce qui se passe si j'ajoute simplement un terme de niveau individuel à l'équation dans mon exemple. Cela utilise-t-il les obs de contrôle comme tendance de contrôle? Tous les obs de contrôle ne varient pas sur le traitement ...
Greg

Réponses:

11

Une caractéristique intéressante de la différence dans les différences (DiD) est que vous n'avez pas besoin de données de panneau pour cela. Étant donné que le traitement se déroule à un certain niveau d'agrégation (dans votre cas, les villes), vous n'avez qu'à échantillonner des individus au hasard dans les villes avant et après le traitement. Cela vous permet d'estimer et d'obtenir l'effet causal du traitement comme la différence de résultat post-pré attendue pour le traité moins la différence de résultat post-pré attendue pour le contrôle.

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

Il y a un cas où les gens utilisent des effets fixes individuels au lieu d'un indicateur de traitement et c'est quand nous n'avons pas un niveau d'agrégation bien défini auquel le traitement a lieu. Dans ce cas, vous où est un indicateur de la période de post-traitement pour les personnes qui reçu le traitement (par exemple, un programme du marché du travail qui se déroule partout). Pour plus d'informations à ce sujet, consultez ces notes de cours de Steve Pischke. D i t

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

Dans votre environnement, l'ajout d'effets fixes individuels ne devrait rien changer par rapport aux estimations ponctuelles. L'indicateur de traitement sera simplement absorbé par les effets fixes individuels. Cependant, ces effets fixes peuvent absorber une partie de la variance résiduelle et donc potentiellement réduire l'erreur standard de votre coefficient DiD.Ag

Voici un exemple de code qui montre que c'est le cas. J'utilise Stata mais vous pouvez le reproduire dans le package statistique de votre choix. Les «individus» ici sont en fait des pays mais ils sont toujours groupés selon un indicateur de traitement.

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

Vous voyez donc que le coefficient DiD reste le même lorsque les effets fixes individuels sont inclus ( aregest l'une des commandes d'estimation des effets fixes disponibles dans Stata). Les erreurs standard sont légèrement plus serrées et notre indicateur de traitement d'origine a été absorbé par les effets fixes individuels et a donc chuté dans la régression.

En réponse au commentaire,
j'ai mentionné l'exemple de Pischke pour montrer quand les gens utilisent des effets fixes individuels plutôt qu'un indicateur de groupe de traitement. Votre paramètre a une structure de groupe bien définie, donc la façon dont vous avez écrit votre modèle est parfaitement adaptée. Les erreurs standard doivent être regroupées au niveau de la ville, c'est-à-dire le niveau d'agrégation auquel le traitement a lieu (je ne l'ai pas fait dans l'exemple de code mais dans les paramètres DiD, les erreurs standard doivent être corrigées comme le démontre l'article de Bertrand et al. ).

Concernant les déménageurs, ils n'ont pas grand-chose à jouer ici. L'indicateur de traitement est égal à 1 pour les personnes qui vivent dans une ville traitée dans la période de post-traitement . Pour calculer le coefficient DiD, il suffit en fait de calculer quatre attentes conditionnelles, à savoir 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)]

Donc, si vous avez 4 périodes de post-traitement pour un individu qui vit dans une ville traitée pour les deux premières, puis qui déménage dans une ville de contrôle pour les deux périodes restantes, les deux premières de ces observations seront utilisées dans le calcul de et les deux derniers dans . Pour expliquer clairement pourquoi l'identification provient des différences de groupe au fil du temps et non des déménageurs, vous pouvez visualiser cela avec un graphique simple. Supposons que le changement dans le résultat ne soit vraiment dû qu'au traitement et qu'il ait un effet contemporain. Si nous avons une personne qui vit dans une ville traitée après le début du traitement mais déménage ensuite dans une ville de contrôle, son résultat devrait revenir à ce qu'elle était avant d'être traité. Ceci est illustré dans le graphique stylisé ci-dessous.E ( y i s t | s = 0 , t = 1 )E(yist|s=1,t=1)E(yist|s=0,t=1)

entrez la description de l'image ici

Vous voudrez peut-être toujours penser aux déménageurs pour d'autres raisons. Par exemple, si le traitement a un effet durable (c'est-à-dire qu'il affecte toujours le résultat même si la personne a bougé)

Andy
la source
2
Bonne réponse. Recommanderiez-vous également de regrouper les erreurs au niveau de la ville ici?
Dimitriy V. Masterov
Excellente réponse, merci. Votre eq est eq 3 de la page 12, non? Pischke présente cette partie avec "Cependant, parfois, il n'y a pas d'unités naturelles où le traitement est attribué. Au lieu de cela, certaines personnes sont traitées à un moment donné, et d'autres non". Mais ce n'est pas vraiment le cas. Le traitement EST au niveau de la ville (ou de n'importe quel groupe) dans mon environnement + j'ai des données de panel. Ce pourrait être le bon modèle, peut-être avec un clusterisé. Que dirais-tu? Et si les individus pouvaient se déplacer entre les villes au fil des ans? Dans ce cas, le coef pour «traité» serait identifié en fonction des déménageurs, non?
greg
@ DimitriyV.Masterov La recommandation de Bertrand et al serait de regrouper les erreurs standard au niveau du groupe auquel le traitement a lieu. Alternativement, vous pouvez utiliser un bootstrap de bloc avec remplacement, mais ce serait également au niveau de la ville.
Andy
@greg J'ai édité la réponse pour répondre avec un peu plus de détails à votre commentaire. J'espère que cela aide :-)
Andy
cela fait-il une différence si nous utilisons plusieurs périodes? le mannequin D_i_t sera nul pour toutes les périodes avant l'événement et sera de toute façon un pour toutes les périodes après l'événement. ne serait-ce pas la même chose si je n'utilisais que deux périodes? @Andy
Jinhua Wang
1

La réponse courte est que l'utilisation d'un effet fixe à l'unité ou au niveau du groupe traité ne modifie pas l'estimation, mais seulement l'inférence. En règle générale, l'utilisation de l'effet fixe unitaire absorbera plus de variations, et donc vous aurez des erreurs standard plus petites.

Que les unités soient dans le même groupe agrégé ne change pas ce résultat (cela ne change que la façon dont vous définissez le niveau de votre groupe traité et le fait que vous ayez besoin d'un panneau au lieu de sections répétées).

Notez cependant que l'équivalence n'est valable que lorsqu'il n'y a pas de covariable X. Dès que vous avez des X, les résultats sont différents selon que vous utilisez des effets fixes unitaires ou de groupe.

L'exemple ci-dessous compare les 3 estimateurs, dans deux cas, avec et sans X. Les estimateurs sont:

  1. OLS
  2. FE avec effet fixe de groupe (traité)
  3. FE avec effet fixe unitaire

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

Code:

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"))
Matifou
la source