Qual é a razão para fazermos isso? Diff-in-diff é um modelo de diferenças, e sendo assim, ele poderia ser estimado de uma forma bem mais direta. Escreveríamos uma variável que é, ela mesma, a subtração no momento 2 e no momento 1.
No entanto, pode haver um desbalanceamento entre grupo de controle e tratamento ao longo do tempo. Isso viola o diff-in-diff, em particular porque a noção de parallel trends é violada. Então precisamos discutir a ideia de conditional parallel trends, quando o balanceamento só é respeitado dentro dos grupos.
Em palavras: na ausência do tratamento, a variação média de \(Y\) para os tratados teria sido igual à variação média observada nos controles, condicional em covariadas \(X_i\).
O lado esquerdo é um contrafactual – nunca observado para \(D_i = 1\). O lado direito é observável. Essa igualdade é o que autoriza usar o grupo controle como estimador da tendência que o grupo tratado teria seguido, permitindo identificar o ATT:
O primeiro termo, \(\mathbb{E}_\omega[\Delta Y_{i,t=2} \mid D_i = 1]\), é simplesmente a variação média observada de \(Y\) entre os períodos para o grupo tratado.
O segundo termo é um valor esperado duplo que estima o contrafactual, ou seja, qual teria sido a variação média dos tratados na ausência do tratamento. Ele opera em dois passos:
O valor esperado interno, \(\mathbb{E}_\omega[\Delta Y_{i,t=2} \mid X_i, D_i = 0]\), modela a relação entre as covariadas \(X_i\) e a variação de \(Y\) usando apenas os controles. Isso produz uma função que, dado um perfil \(X_i\), prediz qual seria a tendência esperada sem tratamento.
O valor esperado externo, \(\mathbb{E}_\omega[\cdots \mid D_i = 1]\), toma a média dessas predições avaliadas nos \(X_i\) dos tratados. Ou seja, projeta a tendência contrafactual sobre o perfil de covariadas do grupo tratado.
A diferença entre os dois termos é o ATT (Average Treatment Effect on the Treated) sob a hipótese de tendências paralelas condicionais em \(X_i\).
Código
# Passo 1: estimar E[ΔY(0) | X_i, D_i = 0] nos controlescontr = df %>%filter(treat ==0) %>%arrange(id, tempo) %>%group_by(id) %>%summarise(d_y = y[tempo ==2] - y[tempo ==1],sexo =unique(sexo),raca =first(raca) )out_reg =lm(d_y ~ sexo + raca, data = contr)# Passo 2: projetar o contrafactual nos tratados# ou seja, E[E[ΔY(0) | X_i, D_i = 0] | D_i = 1]treat = df %>%filter(treat ==1) %>%arrange(id, tempo) %>%group_by(id) %>%summarise(d_y = y[tempo ==2] - y[tempo ==1],sexo =unique(sexo),raca =first(raca) )# predict aplica os coeficientes dos controles aos X dos tratadostreat$d_y0_hat =predict(out_reg, newdata = treat)# Passo 3: ATT = E[ΔY | D=1] - E[E[ΔY(0) | X, D=0] | D=1]mean(treat$d_y) -mean(treat$d_y0_hat)