Модуль 4. Synthetic Control Method (SCM)

TL;DR

Synthetic Control Method (SCM) — для случаев, когда у нас есть один объект, на котором случилась интервенция, и нет готового контроля. Метод строит «синтетического двойника» этого объекта из взвешенной комбинации других, похожих объектов. До интервенции синтетический двойник повторяет траекторию реального объекта. После интервенции — расходится. Разрыв между ними и есть эффект. Метод подходит когда юнитов в treatment один или мало (категория, регион, город), а в контроле есть набор похожих юнитов, на которых интервенции не было.

Фундаментальная интуиция

SCM строится на простой идее: если в твоём анализе один treated-объект, тебе нужен один control-объект — и его лучше построить, чем найти. Найти «такую же категорию» или «такой же регион» точно не получится — каждая категория уникальна. Но взвешенную комбинацию из нескольких категорий, которая вместе ведёт себя как twin treated до интервенции, построить можно.

Что мы делаем: берём категорию которая получила интервенцию (treated unit) и набор других категорий, на которых интервенции не было (donor pool). Алгоритм SCM подбирает веса для каждого из доноров так, чтобы взвешенная сумма их траекторий до интервенции максимально совпадала с траекторией treated. Эта взвешенная сумма — синтетический контроль, twin для treated, построенный из соседей.

После интервенции синтетический контроль продолжает собственную траекторию (на него интервенция не воздействовала). Treated юнит идёт по своей траектории. Если они расходятся — этот разрыв и есть эффект интервенции. Если идут вместе — эффекта нет.

Что важно: SCM работает только когда мы можем построить хорошего twin. Если treated очень специфичен (нет похожих объектов в donor pool) — алгоритм может выдать плохое приближение и эффект окажется недостоверным.

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

SCM подходит когда выполняются 5 условий:

Если эти условия выполнены — SCM один из самых наглядных методов. Результат показывается на графике: реальная и синтетическая траектории. Глазом видно, есть эффект или нет.

Что мы оцениваем

SCM оценивает ATT — Average Treatment Effect on the Treated, эффект интервенции на конкретном treated юните. В отличие от RCT или DiD это эффект на одном объекте, а не средний эффект на популяции.

Counterfactual — это синтетический контроль. Что было бы с treated юнитом если бы интервенции не было. SCM конструирует этот counterfactual из доноров и сравнивает с реальностью.

Donor pool — набор юнитов-кандидатов из которых строится синтетический контроль. От его состава зависит качество результата. Если в donor pool попал юнит, который сам получил интервенцию или связан с treated через рынок — синтетический контроль будет смещён.

Веса (weights) — на сколько каждый донор входит в синтетический контроль. Алгоритм SCM подбирает веса так, чтобы они были неотрицательными и суммировались в 1, а взвешенная сумма траекторий доноров в pre-period максимально точно совпадала с траекторией treated. Это и есть «обучение» синтетического контроля.

RMSPE (Root Mean Squared Prediction Error) — метрика качества подгонки в pre-period. Чем ниже — тем лучше синтетический контроль повторяет treated до интервенции, тем сильнее аргумент. Высокий pre-period RMSPE значит что twin плохой и доверять разрыву после интервенции нельзя.

Что нужно для идентификации

Чтобы SCM давал причинный эффект, нужны три условия:

  1. Хорошая подгонка в pre-period. Синтетический контроль должен повторять treated до интервенции — иначе мы не можем заявить что после интервенции расхождение стало из-за неё. Формальный критерий: pre-period RMSPE на порядок меньше типичного post-period отклонения.
  2. Donor pool без скрытого treatment. Доноры не должны быть затронуты интервенцией ни прямо, ни через рынок. Если уход селлера из категории «Бытовая техника» перетянул трафик в «Электронику» — Электроника тоже получила treatment, и её нельзя брать в donor pool.
  3. Стабильность доноров. Между донорами и treated не должно быть структурных изменений в pre-period. Если в одной из категорий поменяли алгоритм ранжирования, она перестаёт быть валидным донором — её собственная траектория сдвинулась по причинам, не связанным с treated.

В отличие от DiD, SCM не требует параллельных трендов — он сам подбирает комбинацию доноров с подходящим трендом. Это сильное преимущество. Но качество подгонки (условие 1) становится критическим: если twin плохой, SCM не работает, а сказать «параллельные тренды не требуются» — недостаточно.

Как проверить, что метод работает

SCM требует пять стандартных проверок до того как интерпретировать разрыв как причинный эффект.

ПроверкаЧто смотримКрасный флагЧто делать
Pre-period fit (RMSPE)Насколько синтетический контроль повторяет treated до интервенцииБольшой RMSPE в pre-period, сравнимый с post-разрывомTwin плохой — SCM ненадёжен, искать другие доноры или отказаться
In-space placeboПрименить SCM к каждому донору как будто он treated, посмотреть на распределение «эффектов»Реальный эффект попадает внутрь распределения placeboЭффект не отличим от шума — недостоверен
In-time placeboСдвинуть «дату интервенции» назад на pre-period, посмотреть на разрывПоявляется разрыв там где интервенции не былоДизайн ловит общую динамику, не эффект
Leave-one-outУбрать каждого донора по очереди, пересчитать SCMЭффект сильно меняется при удалении одного донораРезультат зависит от одного юнита — хрупкий
Permutation inferencep-value через распределение placebo-эффектов в donor poolРеальный эффект не в верхних 5% распределенияЭффект статистически не отличим от случайного

Стандартная практика — показывать на графике сразу две линии: реальный treated и синтетический. Pre-period они почти совпадают, post-period расходятся. Это самая наглядная визуализация в quasi-experiment литературе. Глазом видно работает дизайн или нет.

Минимальный расчёт

Алгоритм SCM находит веса w_j (для каждого донора j) такие,
что:

  min Σ_t (Y_treated,t − Σ_j w_j · Y_donor_j,t)²

  при условии:  Σ_j w_j = 1,  w_j ≥ 0  для всех j

Минимизация — на pre-period (до интервенции).

После того как веса найдены — синтетический контроль на
post-period:

  Y_synth,t = Σ_j w_j · Y_donor_j,t   для t > t_intervention

Эффект (ATT) на каждом моменте post-period:

  τ̂_t = Y_treated,t − Y_synth,t

Кумулятивный эффект — сумма τ̂_t по post-period или среднее.

Типичные ошибки

  1. Игнорировать pre-period fit. Если RMSPE в pre-period большой, синтетический контроль плохо отражает treated. Любой разрыв в post-period — следствие плохой подгонки, а не интервенции. Без хорошего fit нет SCM.
  2. Включать в donor pool юниты с косвенным treatment. Уход крупного селлера из «Бытовой техники» — куда ушёл его трафик? В похожие категории. Эти категории нельзя брать в donor pool, иначе их Y искажён той же интервенцией.
  3. Слишком короткий pre-period. Алгоритм требует достаточно точек до интервенции для подгонки. 3–5 наблюдений pre — мало, веса будут переобучены под шум.
  4. Слишком большой donor pool. Если в pool 50 юнитов — алгоритм найдёт идеальную подгонку случайно, а не из-за реального сходства. 5–20 доноров — рабочий диапазон.
  5. Интерпретировать SCM как «средний эффект». SCM даёт эффект на конкретном treated юните. Если ушёл селлер из «Бытовой техники» — эффект говорит про эту категорию. Не про маркетплейс в целом, не про среднее по уходам.
  6. Не делать placebo-проверки. Один график «реальный vs синтетический» с разрывом ничего не доказывает — разрыв может быть случайным. Permutation inference обязателен.

Что делать дальше

Toy example: уход крупного селлера из «Бытовой техники»

В январе с маркетплейса ушёл крупный селлер бытовой техники (~30% GMV категории). Аналитик хочет оценить как этот уход повлиял на GMV категории «Бытовая техника» в течение следующих 8 недель.

Treated: «Бытовая техника». Donor pool: «Электроника», «Книги», «Одежда», «Дом». Категории, не связанные с ушедшим селлером и не получившие косвенного эффекта.

Берём недельные данные GMV за 8 недель до интервенции и 8 недель после (в условных единицах):

НеделяБытовая техника (treated)ЭлектроникаКнигиОдеждаДом
t = −81001059011095
t = −71021079111396
t = −61031099211598
t = −51051109311799
t = −410611294119101
t = −310811495121102
t = −211011696123104
t = −111211897125105
t = 0(интервенция)
t = 110012199127107
t = 299123100129108
t = 398125101131110
t = 497127102133111
t = 595129103135113
t = 694131104137114
t = 793133105139116
t = 891135106141117
Алгоритм SCM находит веса доноров, минимизируя ошибку
подгонки treated в pre-period:

  Электроника: 0.45
  Одежда:      0.30
  Дом:         0.20
  Книги:       0.05

Сумма весов = 1.00, все ≥ 0. Синтетический контроль для
каждой недели — взвешенная сумма GMV доноров с этими весами.
В pre-period он почти идеально совпадает с реальной
траекторией treated (RMSPE ≈ 0.4 — очень низкий).

Что происходит после t = 0:

НеделяРеальная БытоваяСинтетическаяЭффект τ̂
t = 1100119−19
t = 497124−27
t = 891132−41

Видим: после ухода селлера реальная траектория падает, синтетическая продолжает расти примерно как до интервенции. Разрыв нарастает, к 8-й неделе он ≈ 41 единица — это и есть оценка эффекта ухода селлера на GMV категории.

Что важно проверить: in-space placebo. Применяем SCM к каждому донору как будто он treated, остальные — pool. Если получаем 4 «эффекта» с распределением вокруг 0 (±5 единиц), а реальный эффект −41 — он явно за пределами этого распределения. p-value (доля placebo-эффектов сильнее реального) = 0/4 = 0. Эффект значим.

Что было бы при провале pre-fit: если бы веса не давали хорошей подгонки в pre-period (RMSPE = 5 при реальном эффекте −41, и этот RMSPE сравним с post-разрывом) — мы не могли бы заявить эффект как причинный. Возможно donor pool неподходящий, нужны другие категории.

Упражнения

Задача 1: SCM для нового скоринга в регионе

Банк запустил новую систему скоринга в одном регионе (Самарская область) с 1 марта. Хочет оценить эффект на approval rate (долю одобренных заявок) в течение 3 месяцев. Какие условия нужны для SCM в этой задаче? Что взять в donor pool, какие проверки обязательны?

Решение

SCM подходит — есть один treated юнит (Самарская область), нужен синтетический twin из похожих регионов.

Donor pool: 10–15 регионов России со схожим экономическим профилем (Татарстан, Нижегородская область, Свердловская и т.д.). НЕ включать регионы, где параллельно тестировали другие изменения скоринга или где есть spillover (мигранты из Самары работают в соседних регионах с другой логикой скоринга).

Pre-period: минимум 10–15 месяцев до 1 марта, желательно больше для подгонки.

Обязательные проверки: pre-period RMSPE — должна быть низкой относительно возможного эффекта. Permutation inference — применить SCM к каждому региону donor pool как будто он treated. Эффект на Самаре должен быть в верхних 5–10% распределения. Leave-one-out — проверить устойчивость к удалению каждого донора.

Если pre-fit плохой (например, экономика Самары слишком специфична) — SCM не работает, искать другие методы (DiD с подбором parallel-trend регионов, или временной анализ без контроля).

Задача 2: интерпретация RMSPE и permutation inference

SCM построил синтетический контроль для города Новосибирск, где изменили surge-логику. Pre-period RMSPE = 0.8, эффект на средний чек поездки в post-period = +12%. Permutation inference: реальный эффект попадает в 88-й перцентиль распределения placebo-эффектов. Можно ли заявить causal effect? Что нужно дополнительно проверить?

Решение

Заявить уверенный causal effect — рано. Два сигнала тревоги.

Первый: permutation inference — 88-й перцентиль. Это значит что 12% placebo-эффектов в donor pool оказались сильнее реального. Стандартный порог — 90–95-й перцентиль. Эффект на грани значимости, не выше неё. Возможно это реальный эффект, возможно — артефакт.

Второй: pre-period RMSPE = 0.8. Это абсолютная цифра, нужно сравнить с шкалой post-эффекта. Если средний чек = 500 рублей, эффект +12% = 60 рублей. RMSPE 0.8 в этой шкале — отличная подгонка. Если средний чек = 100 рублей, +12% = 12 рублей, RMSPE 0.8 — это уже 7% относительной ошибки в pre-period, что сравнимо с эффектом. Шкалы должны быть сопоставимы.

Что дополнительно проверить: leave-one-out (убрать каждого донора, пересчитать — если эффект сильно меняется, он ненадёжен), in-time placebo (сдвинуть «дату интервенции» назад — если SCM показывает разрыв там где его не было, дизайн ловит общую динамику), график реальной и синтетической траекторий (плотность подгонки в pre-period).

Без этих проверок +12% — это статистика, не причинный вывод. С полным набором проверок и устойчивым результатом — можно заявлять, с оговоркой про 88-й перцентиль (граница значимости).

Глубже: augmented synthetic control

Augmented SCM (Ben-Michael et al.) добавляет bias correction поверх классических весов, позволяя экстраполировать за пределы convex hull. Также существуют методы с ridge penalty (regularized SCM) для стабилизации весов при многих donor units.