Diferença nas diferenças com os dados do painel no nível individual

11

Qual é a maneira correta de especificar uma diferença no modelo de diferença com os dados do painel no nível individual?

Aqui está a configuração: Suponha que eu tenha dados de painel em nível individual incorporados nas cidades por vários anos e o tratamento varie no nível do ano da cidade. Formalmente, seja ser o resultado para o indivíduo i na cidade de e ano e ser um manequim para saber se a intervenção afetou cidade no ano . Um estimador de DiD típico, como o descrito em Bertrand et al (2004, p. 250), é baseado em um modelo OLS simples, com termos de efeito fixo para cidade e ano:yEustEustDstst

yEust=UMAs+Bt+cXEust+βDst+ϵEust

Mas esse estimador ignora a estrutura do painel em nível individual (ou seja, várias observações para cada indivíduo nas cidades)? Faz sentido estender esse modelo com um termo de efeito fixo de nível individual ? Muitos aplicativos DiD usam dados repetidos de seção transversal sem os dados do painel em nível individual.SEu


Bertrand, Marianne, Esther Duflo e Sendhil Mullainathan. 2004. "Quanto devemos confiar nas estimativas das diferenças nas diferenças?" Quarterly Journal of Economics 119 (1): 249–75.

greg
fonte
Se você deseja capturar os efeitos dos manequins de entidade, por que não fazer um modelo de efeitos fixos? DID é equivalente a FE com 2 períodos, portanto, incluir manequins e fazer DID faria com que eles desistissem.
VCG
Corrija-me se estiver errado, mas vejo duas diferenças: a) um modelo fe usaria uma comparação dentro da unidade para estimar o efeito (por exemplo, a renda é maior ou menor após um determinado evento da vida). A idéia de uma abordagem DiD é usar outras observações como tendência de controle para capturar o que teria acontecido sem o tratamento. b) A DiD se concentra no nível do grupo e não no tratamento individual. Agora, a questão é o que acontece se eu apenas adicionar um termo de nível individual fe à equação no meu exemplo. Isso usa o obs de controle como uma tendência de controle? Todos os obs controle não variam sobre o tratamento embora ...
greg

Respostas:

11

Um bom recurso da diferença entre diferenças (DiD) é que você não precisa de dados do painel para isso. Dado que o tratamento ocorre em algum tipo de nível de agregação (nas cidades dos seus casos), você só precisa amostrar indivíduos aleatórios das cidades antes e depois do tratamento. Isto permite estimar

yEust=UMAg+Bt+βDst+cXEust+ϵEust
e obtenha o efeito causal do tratamento como a diferença de resultado pós-pré esperada para o tratado menos a diferença de resultado pós-pré esperada para o controle.

yEut=αEu+Bt+βDEut+cXEut+ϵEut
DEut de Steve Pischke.

UMAg

Aqui está um exemplo de código que mostra que esse é o caso. Eu uso o Stata, mas você pode replicar isso no pacote estatístico de sua escolha. Os "indivíduos" aqui são, na verdade, países, mas ainda estão agrupados de acordo com algum indicador de tratamento.

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

Portanto, você vê que o coeficiente de DiD permanece o mesmo quando os efeitos fixos individuais são incluídos ( aregé um dos comandos de estimativa de efeitos fixos disponíveis no Stata). Os erros padrão são um pouco mais rigorosos e nosso indicador de tratamento original foi absorvido pelos efeitos fixos individuais e, portanto, caiu na regressão.

Em resposta ao comentário
, mencionei o exemplo de Pischke para mostrar quando as pessoas usam efeitos fixos individuais em vez de um indicador de grupo de tratamento. Sua configuração tem uma estrutura de grupo bem definida, de modo que a maneira como você escreveu seu modelo está perfeitamente bem. Os erros padrão devem ser agrupados no nível da cidade, ou seja, o nível de agregação em que o tratamento ocorre (eu não fiz isso no código de exemplo, mas nas configurações de DiD, os erros padrão precisam ser corrigidos, conforme demonstrado pelo artigo de Bertrand et al. )

Dstst

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

E(yEust|s=1,t=1)E(yEust|s=0 0,t=1). Para deixar claro por que a identificação vem das diferenças de grupo ao longo do tempo e não dos motores, você pode visualizá-lo com um gráfico simples. Suponha que a mudança no resultado seja realmente apenas por causa do tratamento e que tenha um efeito contemporâneo. Se tivermos um indivíduo que mora em uma cidade tratada após o início do tratamento, mas depois se muda para uma cidade de controle, seu resultado deve voltar ao que era antes de ser tratado. Isso é mostrado no gráfico estilizado abaixo.

insira a descrição da imagem aqui

Você ainda pode querer pensar em motores por outros motivos. Por exemplo, se o tratamento tiver um efeito duradouro (ou seja, ainda afeta o resultado, mesmo que o indivíduo tenha se mudado)

Andy
fonte
2
Boa resposta. Você também recomendaria agrupar os erros no nível da cidade aqui?
Dimitriy V. Masterov
Ótima resposta, obrigado. Sua eq é a eq 3 da página 12, certo? Pischke introduz esta parte com "No entanto, às vezes não há unidades naturais s onde o tratamento é atribuído. Em vez disso, algumas pessoas são tratadas em um ponto específico no tempo e outras não". Mas esse não é realmente o caso. O tratamento está no nível da cidade (ou qualquer grupo) na minha configuração + eu tenho dados do painel. Ainda pode ser o modelo certo, talvez com um cluster. O que você diria? E se os indivíduos puderem se deslocar entre cidades ao longo dos anos? Nesse caso, o coef para 'tratado' seria identificado com base nos motores, certo?
greg
@ DimitriyV.Masterov A recomendação de Bertrand et al seria agrupar os erros padrão no nível do grupo em que o tratamento ocorre. Como alternativa, você pode usar um bootstrap de bloco com substituição, embora também esteja no nível da cidade novamente.
Andy Andy
@greg Eu editei a resposta para responder com um pouco mais de detalhes ao seu comentário. Espero que isso ajude :-)
Andy
faz diferença se usarmos vários períodos? o manequim D_i_t será zero para todos os períodos antes do evento e será um para todos os períodos após o evento de qualquer maneira. não seria o mesmo se eu apenas usasse dois períodos? @Andy
Jinhua Wang
1

A resposta curta é que o uso de efeito fixo na unidade ou no nível do grupo tratado não altera a estimativa, apenas a inferência. Normalmente, o uso de efeito fixo da unidade absorverá mais variação e, portanto, você terá erros padrão menores.

O fato de as unidades estarem no mesmo grupo agregado não altera esse resultado (apenas altera a forma como você define o nível do grupo tratado e o fato de precisar de painel em vez de seções transversais repetidas).

Observe, no entanto, que a equivalência só é válida quando não há X covariável. Assim que você possui Xs, os resultados são diferentes, independentemente de você usar efeitos fixos por unidade ou grupo.

O exemplo abaixo compara os 3 estimadores, em dois casos, com e sem X. Os estimadores são:

  1. OLS
  2. FE com efeito fixo do grupo (tratado)
  3. FE com efeito fixo unitário

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

Código:

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
fonte