Diferenças em Diferenças (DiD)
- Fernanda Kelly
- 24 de set.
- 15 min de leitura
Atualizado: 1 de out.
Para os mais íntimos, chamamos de Diff in Diff. E, como você chegou aqui nesse post, acredito que já deve ter dado uma breve pesquisada no assunto, não é mesmo? Pelo menos é isso que eu espero (rs). E como colegas, vamos chamar esse método estatístico (ou econométrico) de Diff in Diff a partir de agora.
E o que colegas de pesquisa geralmente fazem juntes?
Vão em algum lugar seja pra comer, beber uma sprite ou uma cervejinha quando nada deu certo e você acha o erro no código no final do segundo tempo e era um parênteses. Eu que não sou de beber, vou ir contigo tomar uma sprite e, aproveitando a situação, resolvo te ensinar a lógica por trás do Diff in Diff.
Vamos lá?
Chegamos no bar do Seu Raimundo (esse bar é ponto de encontro dos universitários da UFG) e tem uma atlética fazendo uma pequena confraternização, com pequenos grupos em volta. Chegando lá, nos deparamos com a seguinte bebemoragem:
Grupo Tratado → ganhou uma rodada grátis de cerveja.
Grupo Controle → só olhando e pagando do próprio bolso.
A gente quer saber:
Essa rodada grátis fez mesmo a galera da atlética beber mais?
O pulo do gato do método DiD é o seguinte:
Antes da rodada grátis, medimos quanto cada grupo bebia.
Depois, medimos de novo.
A gente vê quanto cada grupo aumentou o consumo.
E aí… subtrai um aumento do outro.
Se o grupo tratado aumentou bem mais que o controle, bingo! Foi a rodada grátis.
Se aumentou igual, foi só coincidência (talvez estava calor naquele dia e em Goiás, isso não é dificil de acontecer).
Conseguiu entender a ideia do DiD?
O DiD é um método estatístico usado para estimar o efeito causal de uma intervenção de interesse (rodada grátis de cerveja) ou política, comparando mudanças ao longo do tempo entre um grupo tratado e um grupo de controle.
A lógica é simples, mas é M-U-I-T-O poderosa:
Antes da intervenção, os dois grupos devem ter tendências paralelas.
Mede-se a variação no grupo tratado antes e depois da intervenção.
Mede-se a variação no grupo controle no mesmo período.
A diferença dessas variações é o efeito estimado da intervenção.
E o que tem de interessante nessa modelagem?
A diferença das diferenças isola o efeito puro da intervenção, como se a gente criasse um mundo paralelo sem ela. Mas vamos com C-A-L-M-A, tá?
O truque só funciona bem se antes da intervenção os dois grupos estavam na mesma tendência (andando em paralelo). Se um grupo já vinha mudando de forma diferente antes, o DiD pode acabar contando história errada.E o que é essa "mesma tendência"?
O nome disso é suposição de tendências paralelas. O gráfico abaixo dá uma visualização do que é esse fenômeno. No frigir dos ovos é: ao longo do tempo os dois grupos estejam com a mesma inclinação ao longo do tempo.
E isso não te lembra nada?
Quando iniciei os estudos sobre essa modelagem e consegui juntar o "lé com cré", a minha cabeça fez assim: 🤯. Eu que A-M-O Séries Temporais, consegui entender e ligar esses pontinhos de uma metodologia com a outra.
Em Séries Temporais nós temos a tendência e a sazonalidade e, geralmente, nós tomamos diferenças nas séries para nos "livrar" desses fenômenos. E vale ressaltar que se não houver dados de controle e tratados que satisfaçam essa suposição ou que sejam comparáveis, uma das formas de tentar encontrar esses grupos é utilizar o método Propensity Score Matching.
E o que o Diff in Diff é?
Na primeira diferença, D_1, faz a diferença simples de antes e depois. Isso, em última análise, elimina os efeitos fixos específicos da unidade. Então, uma vez feitas essas diferenças, diferenciamos as diferenças (daí o nome Diff in Diff) para obter a estimava imparcial de D, o efeito causal. Ou seja, é tomar as diferenças até conseguir isolar o parâmetro de interesse, o tal do Efeito Médio do Tratamento sobre os Tratados (ATT).
Mas Fernanda Kelly, nem sei o que é efeito fixo. Como assim?
Depois do nome completo, acho que tenho que explicar, né? O Diff in Diff traz muito a ideia de Modelos Mistos, onde temos variáveis que são fixas e aleatórias no tempo. No Diff in Diff, efeitos fixos são controles que capturam fatores constantes no tempo ou comuns a todos no mesmo período.
A grande questão é:
Como se aplica essa modelagem?
Uma coisa é certa, tem pacote no R para isso, mas muitos analistas utilizam a nossa velha e muito boa função lm() do pacote stats. E aí agora você deve estar que nem eu quando juntei o "lé com cré": 🤯. Mas, SIM, é uma regressão. E para conseguir explicar um pouco melhor cada passo dado nessa modelagem, vamos iniciar com um exemplo e depois vamos questionando juntes, certo?
Como eu havia comentado, só de ter um pacote já nos alivia um monte. O nome desse pacote é did: Treatment Effects with Multiple Periods and Group e ele armazena a base de dados mpdta (Callaway & Sant’Anna, 2021). Essa base de dados possui 2000 observações e 5 variáveis, contendo o logaritmo do emprego de adolescentes em 500 condados (uma divisão administrativa e territorial de um estado) nos EUA de 2003 a 2007. As 5 variáveis citadas são:
year: Ano de observação
countyreal: Identificador único para um condado específico
lpop: O logaritmo de milhares de habitantes do condado
lemp: O logaritmo do emprego de adolescentes no condado
first.treat: No ano em que o estado onde o condado está localizado aumentou seu salário mínimo, ele é definido como 0 para condados que têm salários mínimos iguais ao salário mínimo federal durante todo o período.
treat: Se um determinado condado é ou não tratado naquele ano (1 = SIM)
E o que vamos analisar?
O efeito da adoção de um salário mínimo por condado nos EUA.Vamos instalar e carregar o pacote?
install.packages("did") # Instalar pacote
library(did) # Carregar pacote
did::mpdta # Carregar base de exemploA fórmula de estimativa do Diff in Diff é a seguinte,

em que,

Tá, é uma regressão Fê?
Sim! Esse modelo é o caso mais simples. Temos 1 grupo tratado, 1 grupo controle, 1 antes e 1 depois. E, se você é um/uma bom/boa analista/cientista de dados, você sabe que é bem estranho trazer o conceito de causalidade para a interação na modelagem. Sendo assim, vou dar uma leve explicação do conceito de interação na regressão linear múltipla pra não saírem aí dizendo que é só patifaria esse blog (rs).
O que é uma interação?
Uma explicação prática e bem simples é a seguinte:
Uma interação ocorre quando uma variável independente tem um efeito diferente no resultado dependendo dos valores de outra variável independente.E já ressalto aqui que é bem importante avaliar o resultado de variáveis em regressões simples e múltiplas, as vezes só o estudo de multicolineariedade não é o suficiente.
Fê, não me adiantou N-A-D-A essa explicação, tem como melhorar?
Para melhorar vamos ter que ir de exemplo (rs).
Exemplo 1: Suponha que haja um medicamento para redução do colesterol testado em um ensaio clínico. Suponha que estejamos esperando uma resposta dose-dependente linear em uma determinada faixa de dosagem do medicamento, de modo que o quadro se pareça com o gráfico de posição 1x1 (linha 1 e coluna 1, assim como em matrizes). Esse é o padrão de um modelo linear simples. Mas, nós esperamos que a resposta a dosagem do medicamento seja diferente quando inserimos a variável gênero (feminino e masculino) e, nesse caso, que a resposta do gênero masculino seja maior ou mais alta em relação ao gênero feminino. E claro, há vários caminhos e suposições (vozes da minha cabeça) que faz com que essa relação aconteça, o que nos leva ao gráfico de posição 1x2. No entanto, se os homens têm uma curva dose-resposta mais acentuada em comparação com as mulheres, esperaríamos um gráfico como o da posição 2x1. 
E, para cada um desses gráficos, há uma modelagem por trás. Vamos considerar como relatar os efeitos do sexo e da dose na presença de termos de interação. Se considerarmos o primeiro dos modelos acima de posição 1x1, sem qualquer efeito do sexo, é trivial relatá-lo. Não há efeito do sexo, e o coeficiente β1 fornece o efeito da dose. Em particular, β1 representa a quantidade pela qual o colesterol muda para cada unidade de mudança na dose do medicamento.
Se considerarmos o segundo modelo de posição 1x2, onde há efeitos tanto da dose quanto do sexo, a interpretação ainda é simples: como não depende de qual sexo está sendo discutido (o efeito é o mesmo em homens e mulheres), β1 ainda representa a quantidade pela qual o colesterol muda para cada unidade de mudança na dose do medicamento. Da mesma forma, β2 representa o efeito do sexo, que é "aditivo" ao efeito da dose, pois para obter o efeito de ambos juntos para qualquer dose, simplesmente somamos os dois efeitos individuais.
Agora, considere o terceiro modelo de posição 2x1 com um termo de interação. As coisas ficam um pouco mais complicadas quando há um termo de interação. Não há mais nenhum efeito único da dose, pois depende se estamos falando do efeito da dose em homens ou mulheres. Da mesma forma, a diferença entre homens e mulheres depende da dose. Considere primeiro o efeito da dose: a questão "qual é o efeito da dose" não é respondível até que se saiba qual sexo está sendo considerado. O efeito da dose é β1 para mulheres (se elas forem codificadas como 0 e os homens como 1, como foi o caso aqui). Isso ocorre porque o termo de interação se torna 0 se o sexo for codificado como 0, então o termo de interação "desaparece".
Por outro lado, se o sexo for codificado como 1 (homens), o efeito da dose agora é igual a β1 + β3. Isso significa, na prática, que para cada aumento de uma unidade na dose, o colesterol muda na quantidade de β1 + β3 nos homens (em comparação com apenas β1 nas mulheres). Todos os modelos acima consideraram uma variável contínua combinada com uma variável dicotômica (dummy ou indicadora). Também podemos considerar interações entre duas variáveis dummy e entre duas variáveis contínuas. Os princípios permanecem os mesmos, embora alguns detalhes técnicos mudem.
Quer aprender mais sobre esse assunto? Acesse aqui.É realista essa modelagem?
Sim e, ao mesmo tempo, não. Tudo depende dos seus dados e do quanto você sabe o que está fazendo, mas uma coisa é fato: a interação entre duas variáveis não implica em causalidade e, com o exemplo acima, deu pra entender um pouco o que vem a ser a interação entre variáveis em uma regressão linear múltipla.
Tá, então porquê eles ainda modelam com essa justificativa?
Para te responder, D-E C-A-R-A, vamos modelar o Diff in Diff, para que assim, possamos entender a ideia central do pacote did, tentar relacionar com o exemplo acima e responder essa pergunta:
modeloDID_1 <- did::att_gt(
yname = "lemp", # variável de resultado
tname = "year", # tempo
idname = "countyreal", # identificador
gname = "first.treat", # ano de tratamento (0 se nunca tratado)
xformla = ~1, # sem covariáveis adicionais
data = mpdta, # base
panel = TRUE, # dados em painel
est_method = "dr") # método de estimação: "dr" = doubly robustO que quer dizer cada um desses parâmetros?
Antes de responder isso, mas já respondendo, a função att_gt estima o ATT(g,t), que é o efeito médio do tratamento para quem foi tratado no ano g avaliado no tempo t. Vários grupos entram em tratamento em anos diferentes.
A função considera que:
g = ano de início do tratamento para um grupo
t = ano em que medimos o efeito
Grupos podem começar o tratamento em anos diferentes (staggered adoption).
Para cada combinação (g,t), ele compara o grupo tratado com um grupo de controle válido (que ainda não foi tratado ou nunca será).
A ideia central é:

em que,

O método Diff in Diff neste pacote implementa a fórmula com o estimador doubly robust. Sua formulação é a seguinte:

em que,

O doubly robust significa que a estimativa é consistente se ou o modelo de resultado ou o modelo de propensão estiver correto.
Senhorrrrrr, como é essa estimativa?
No método Diff in Diff, o DR (doubly robust) combina os seguintes métodos:
Outcome regression (OR): ajusta um modelo para prever Y no grupo de controle, dado X (covariáveis).
Inverse probability weighting (IPW): repondera as observações usando a probabilidade de ser tratado.
E aqui temos um ponto importante:
Joga onde essa tal de Inverse probability weighting (IPW)?
Dando um google, já damos de cara com a seguinte visão geral criada por IA:
A ponderação de probabilidade inversa (IPW) é uma técnica estatística usada para abordar viés de confusão e seleção em estudos observacionais, reponderando uma amostra para criar uma pseudopopulação representativa da população-alvo de interesse. Isso é feito estimando a probabilidade de um indivíduo receber o tratamento observado ou ser observado (seu "escore de propensão") e, em seguida, usando o inverso dessa probabilidade como um peso em análises subsequentes. O objetivo é criar uma pseudopopulação "balanceada" em que as variáveis de confusão tenham uma distribuição semelhante nos grupos tratados e não tratados, permitindo uma estimativa mais precisa dos efeitos causais.Eu não sei como ficou a tua cabeça depois disso, mas eu fiquei assim: 🤯. É uma junção de metodologias bem interessantes e, no Diff in Diff, a intenção é:
Criar um grupo de controle válido para cada grupo de adoção g.
Corrigir desequilíbrios entre quem foi tratado e quem ainda não foi tratado.
Evitar viés quando as características X influenciam tanto a chance de tratamento quanto o resultado.
Vamos voltar ao exemplo?
Assim a gente consegue dar mais alguns passos. O nosso primeiro modelo foi denominado por modeloDID_1 e, se você está codando junto comigo, o próximo passo é entender a saída desse modelo a partir da função summary(), bem básica mesmo. Trouxe pra gente analisar somente o ano de 2004, mas na sua saída de código é pra ter todos os anos (2003, 2004, 2005, 2006 e 2007). Cada linha tem:
Group (g) : ano em que o grupo de condados começou a ser tratado.
Time (t) : ano em que estamos medindo o efeito.
ATT(g,t) : efeito médio estimado do tratamento nesse grupo e tempo.
Std. Error : erro-padrão (incerteza da estimativa).
[95% Simult. Conf. Band] : intervalo de confiança simultâneo a 95%.
Group | Time | ATT(g,t) | Std. Error | [95% Simult. | Conf. Band] |
2004 | 2004 | -0.0105 | 0.0246 | -0.0756 | 0.0546 |
2004 | 2005 | -0.0704 | 0.0343 | -0.1609 | 0.0201 |
2004 | 2006 | -0.1373 | 0.0380 | -0.2377 | -0.0369* |
2004 | 2007 | -0.1008 | 0.0361 | -0.1962 | -0.0054* |
O que é importante saber aqui?
A base de dados mpdta tem anos de 2003 a 2007. Só que o att_gt() calcula o ATT(g,t) apenas quando existe um grupo tratado em g e observações no ano t. Como ninguém foi tratado em 2003 (os primeiros grupos só entram em 2004, 2006 e 2007), não há como calcular ATT em 2003, porque não existe comparação “tratado x controle” naquele ano, ou seja, 2003 não aparece na tabela.
Por que só alguns grupos têm 2005?
Olha os grupos de adoção:
Grupo 2004 entrou em 2004
Grupo 2006 entrou em 2006
Grupo 2007 entrou em 2007
O que acontece:
Para o Grupo 2004, em 2005 ele já está tratado, nos dando a opção de estimar ATT(2004,2005).
Para o Grupo 2006, em 2005 ele ainda não foi tratado, ou seja, nesse ano ele é um pré-tratamento válido, então aparece ATT(2006,2005).
Para o Grupo 2007, em 2005 ele também não tinha sido tratado, então aparece ATT(2007,2005).
Mas não existe, por exemplo, ATT(2004,2003), porque o grupo de 2004 ainda não existia como tratado e não dá para comparar.
Em resumo:
Só aparece o ano t se o grupo já foi tratado (efeito pós-tratamento) ou se ainda não foi tratado mas existe dado naquele ano (efeito placebo/pré-tratamento).E como interpretar a saída?
Eu vou trazer a interpretação de um não significativo ao nível de 95% de confiança e um significativo, o resto é com vocês, certo?
Significativo:
Em 2006, dois anos após a adoção, esse grupo apresentou uma queda de -0,1373 (aproximadamente -13,7%). Veja que o intervalo é totalmente negativo, tornando-o estatisticamente significativo. Aqui já conseguimos ver um efeito robusto da política de salário mínimo, reduzindo emprego.Não Significativo:
Em 2004, olhando para os condados que só seriam tratados em 2006, o efeito foi 0,0065 (≈ aproximadamente +0,65%). O intervalo inclui 0, levando-o a não significância. Isso é um “pré-tratamento”, ou seja, serve para testar paralelismo de tendências. O fato de não ser significativo é bom sinal: não há efeito antes da adoção.Deu pra entender mais ou menos qual é a pegada da interpretação?
Vamos de mais uma interpretação de caso não significativo.
Em 2004, os condados que começaram a ser tratados em 2004 tiveram um efeito estimado de -0,0105 (aproximadamente -1,05% no log do emprego). Como o intervalo de confiança inclui 0, esse efeito não é estatisticamente significativo, ou seja, naquele mesmo ano da adoção da política de salário mínimo, não dá para afirmar com confiança que houve impacto.A grande questão é,
Qual a diferença entre usar uma regressão linear lm() e a metodologia do pacote did?
Veja que o quadro abaixo compara um Diff in Diff clássico a um Diff in Diff mais robusto. A diferença básica entre eles é a utilização de um ou mais grupos tratados, o que implica na regressão linear em casos do Diff in Diff clássico.
DiD clássico | did (Callaway & Sant’Anna) | |
Grupos | 1 tratado, 1 controle | Vários grupos tratados em anos diferentes |
Períodos | 1 antes, 1 depois | Múltiplos períodos de tempo |
Estimativa | Único β\beta no modelo linear | ATT(g,t) para cada grupo-tempo |
Contrafactual | Diferença entre controle e tratado | Usa grupos que ainda não foram tratados como controles |
Método | Regressão linear simples | Estimador robusto (IPW, outcome regression, DR) |
Saída | Um número só (β) | Uma matriz de ATT(g,t) + estimativas agregadas |
Viu a diferença?
E tem mais uma coisinha interessante...
É possível mostrar como o impacto da política varia entre os grupos, não entre os anos. Para isso vamos utilizar a função aggte() do pacote did.
did:aggte(modeloDID_1, type = "group") %>%
summary()Nós vamos ter como resultado,
Group Average Treatment Effects
---------------------------------
Group ATT(g) Std. Error [95% Simult. Conf. Band]
1 2004 -0.081 0.027 [-0.150 , -0.012]
2 2006 -0.011 0.017 [-0.052 , 0.030]
3 2007 -0.022 0.015 [-0.059 , 0.015]
Control group: Not yet treated
Estimation method: Doubly Robust
E o que significa cada saída dessa?
Group | Ano em que o grupo de condados começou a receber o tratamento. |
ATT(g) | Efeito médio de tratamento agregado ao longo do tempo para todo o período pós-tratamento daquele grupo. |
Std. Error | Erro-padrão da estimativa. |
[95% Simult. Conf. Band] | Intervalo de confiança simultâneo a 95%. Se não inclui 0, o efeito estatisticamente é significativo. |
Fê, e a interpretação?
Vou trazer a interpretação de cada um dos grupos:
Grupo 2004 – ATT = -0.081
Em média, após a adoção em 2004, o log do emprego desses condados foi 8,1% menor do que teria sido sem a política.
Intervalo não inclui o 0, ou seja, é estatisticamente significativo.
Grupo 2006 – ATT = -0.011
Redução média de ~1,1%, mas intervalo inclui 0, ou seja, é não significativo.
Grupo 2007 – ATT = -0.022
Queda média de ~2,2%, também não significativa.
E o que podemos concluir a nível de grupo com o método Diff in Diff?
Podemos inferir que o efeito negativo e significativo se concentra no grupo que entrou mais cedo (2004) e que grupos de adoção posterior (2006 e 2007) não apresentam impacto detectável. E isso confirma os resultados que já víamos no summary(modeloDID_1):
primeiros tratados sentiram a política,
entradas tardias praticamente não.
Essa é a estimativa DiD agregada por grupo: ela pega todos aqueles ATT(g,t) por tempo que você viu antes e resume em um único número para cada coorte de adoção.
É incrível, né?
E, depois dessa "falaiada" toda, idas e vindas, métodos e mais métodos, eu espero que você tenha se perguntado o que é esse parâmetro group = type. Basicamente ele é o parâmetro que dita qual o efeito que queremos quando estamos agregando os dados.
Mas, qual tipo de parâmetro de efeito de tratamento agregado calcular?
Uma opção é o "simple", que calcula apenas uma média ponderada de todos os efeitos médios do tratamento em relação ao grupo e ao tempo, com pesos proporcionais ao tamanho do grupo. Outra opção é o "dynamic", que calcula os efeitos médios em diferentes durações de exposição ao tratamento e é semelhante a um "event study", que aqui, o efeito geral calcula a média do efeito do tratamento em todas as durações positivas de exposição. Temos também a "calendar" que calcula os efeitos médios do tratamento em diferentes períodos de tempo; aqui, o efeito geral calcula a média do efeito em cada período de tempo.
A que nós usamos, "group" é a opção padrão e calcula os efeitos médios do tratamento em diferentes grupos. Nesse caso, o efeito geral calcula a média do efeito em diferentes grupos. Ele mostra como o impacto da política varia entre os grupos, não entre os anos, o que é útil para saber quem mais sofreu ou se beneficiou, sem se preocupar com a cronologia detalhada. Essa é a leitura:
“Qual foi o efeito médio, em todo o período de tratamento, para cada grupo que entrou em um determinado ano?”
Eu vou deixar o link do livro Causal Inference: The Mixtape para que você, assim como eu, aprofunde no tema. No capítulo 9, há uma grande e bela explicação sobre o método e muitos exemplos bem legais. Outra importante fonte é o guia Avaliação na Prática, desenvolvida pelo FGV CLEAR com o objetivo de ampliar o acesso a conhecimentos osbre monitoramento e avaliação com foco em políticas públicas: Guia Avaliação de Impacto: Método de Diferença em Diferenças (DID)
E já me adianto...
O que eu critiquei esse método não tá escrito e só o Ricardo Theodoro que ouviu, mas fui atrás, estudei e hoje entendo que utilizar essa metodologia de forma correta nos traz grandes interpretações e bons resultados.
Só não vai aplicando lm() em tudo e dizer que você está aplicando Diff in Diff, tá?
Seja crítico/a com o que você utiliza e como utiliza em suas análises. Nesse post eu fui bem breve na explicação, mas tem M-U-I-T-O material que aplica essa metodologia de forma errônea e também assertiva, basta você ter essa base para entendê-los.
Gostou? Tem dúvida?
O meu linkedin está aberto para futuras conversas e sinta-se à vontade para me chamar por lá.
Boas análises,
Fernanda Kelly | Estatística


Comentários