Модуль 2. Difference-in-Differences (DiD)

TL;DR

Сравниваем изменение outcome в treatment-группе vs контрольной. Работает, если без treatment группы двигались бы параллельно. Оценивает ATT.

Когда применять

What you estimate

ATT (Average Treatment Effect on the Treated). δ = E[Y(1) − Y(0) | D=1]. DiD не оценивает ATE — только эффект для тех, кто получил treatment.

Assumptions

  1. Parallel trends: без treatment обе группы двигались бы одинаково (не доказуемо, только не отвергаемо)
  2. No anticipation: treatment-группа не реагирует до формальной даты treatment
  3. No spillover: treatment не влияет на контрольную группу
  4. Stable composition: состав групп не меняется из-за treatment
  5. Common shocks: внешние шоки затрагивают обе группы одинаково

Diagnostics

ПроверкаЧто смотримКрасный флагЧто делать
Pre-trendsEvent study: коэфф. для k < 0Значимые коэфф. до treatmentMatching+DiD, SCM, или отказ
AnticipationКоэфф. за 1–2 периода до treatmentРеакция до treatment dateСдвинуть treatment date назад
Placebo outcomeOutcome, не связанный с treatmentЗначимый эффект на placeboПересмотреть дизайн
Placebo treatment dateФиктивная дата в pre-periodЗначимый "эффект"Trends нестабильны → DiD невалиден
SE clusteringУровень кластеризации ≥ уровня treatmentНекластеризованные SE при групповом treatmentКластеризовать; при малом N — wild bootstrap

Minimal estimator

Y_it = α + β₁·Treat_i + β₂·Post_t + δ·(Treat_i × Post_t) + ε_it

δ = (Ȳ_treat_post − Ȳ_treat_pre) − (Ȳ_control_post − Ȳ_control_pre)

Pitfalls

What to do next

Event Study — полноценный разбор

Event study — регрессия с отдельными коэффициентами δ_k для каждого периода k относительно treatment (k = −4, −3, …, −1, 0, +1, +2, …). Период k = −1 обычно опорный (δ_{−1} = 0).

Y_it = α + Σ_k δ_k · 1{t − t* = k} · Treat_i + γ_t + μ_i + ε_it

Ожидание:
  k < 0: δ_k ≈ 0 (parallel trends подтверждены)
  k ≥ 0: δ_k ≠ 0 (эффект treatment)

ASCII-визуализация (идеальный случай):
  δ_k
   |
 + |                          * * *
   |                        *
   |                      *
 0 |----*---*---*---*---|------------------
   |                    |
 - |                    |
   +----+---+---+---+--+--+---+---+---→ k
       -4  -3  -2  -1  0  +1  +2  +3

Красные флаги event study

ФлагЧто означаетДействие
Pre-trend: δ_{−3}, δ_{−2} значимыParallel trends нарушеныDiD невалиден без коррекции
Монотонный pre-trend (рост/падение)Группы расходились и до treatmentДобавить group-specific trends или отказаться
Эффект в k=0, но не в k≥1Возможно transient shock, не treatmentПроверить устойчивость по длине post-period

При нарушении pre-trends

Staggered DiD — предупреждение

Toy example: DiD вручную

Запуск рекламы в городе A (treated), город B — контроль. Outcome: средний revenue/день.

ГородГруппаPre (нед. 1–4)Post (нед. 5–8)
ATreated100130
BControl90105
# Step 1: Разности
ΔY_treat   = 130 − 100 = +30
ΔY_control = 105 −  90 = +15

# Step 2: DiD-оценка
δ = ΔY_treat − ΔY_control = 30 − 15 = 15

# Step 3: Проверка parallel trends
# Pre-period (нед. -8..-5): были ли тренды параллельны?
# Нужно проверить по дневным/недельным данным.
-- Pseudo-SQL
SELECT
  treat,
  post,
  AVG(revenue) AS mean_rev
FROM daily_revenue
GROUP BY treat, post;

-- δ = (mean_rev WHERE treat=1 AND post=1)
--   - (mean_rev WHERE treat=1 AND post=0)
--   - (mean_rev WHERE treat=0 AND post=1)
--   + (mean_rev WHERE treat=0 AND post=0)

Ожидаемый результат: δ = 15 (каузальный эффект рекламы при выполнении parallel trends).

Упражнения

Задача 1: выбор метода

Компания запускает программу лояльности для клиентов с доходом > 100K. Клиенты с доходом < 100K — контроль. Через 3 месяца сравнивают retention. Какой метод подходит лучше: DiD или RDD?

Решение

RDD подходит лучше. Порог 100K — это cutoff по running variable (доход). Юниты рядом с порогом (95K vs 105K) почти идентичны. DiD здесь проблематичен: группы систематически различаются (высокий доход vs низкий), parallel trends маловероятны.

Задача 2: диагностика

Аналитик провёл DiD: δ = +12%, p = 0.003. Но event study показывает δ_{−2} = +5% (p = 0.04), δ_{−1} = +3% (p = 0.15). Валиден ли результат?

Решение

Нет. Значимый коэффициент δ_{−2} = +5% указывает на нарушение parallel trends: treated группа росла быстрее ещё до treatment. Часть (или весь) эффект δ = +12% может быть продолжением существующего тренда, а не каузальным эффектом treatment.

Задача 3: интерпретация

DiD по geo-launch (3 treated региона, 9 контрольных). δ = +8%, SE = 2%, p = 0.001. SE не кластеризованы. Что не так?

Решение

SE должны быть кластеризованы на уровне региона (12 кластеров). Без кластеризации SE занижены, p-value ложно мал. При 12 кластерах (и только 3 treated) даже кластеризованные SE ненадёжны — нужен wild cluster bootstrap или randomization inference.