Модуль 7. Практика валидности

TL;DR

Квазиэксперимент не доказывает causality «по формуле» — он строит аргумент. Сила аргумента зависит от того, сколько проверок метод выдержал. Internal validity — выполнено ли ключевое допущение метода. External validity — обобщается ли результат за пределы выборки. Этот модуль про первое: placebo, falsification, sensitivity analysis — арсенал проверок, без которых причинный вывод не имеет статуса.

Когда нужны проверки

Проверки нужны для каждого квазиэксперимента — без исключений. Но набор тестов зависит от метода:

Если метод выбран без понимания того, какие тесты для него обязательны — дизайн уже хромает. Список тестов нужно формировать ДО старта анализа, не после.

Что проверяем

Каждый тест валидности отвечает на один из двух вопросов:

Вид validityВопросТесты
InternalДействительно ли treatment вызвал измеренный эффект на этих данных?Placebo, falsification, pre-trend, balance, McCrary, sensitivity
ExternalОбобщается ли вывод на других пользователей, периоды, контексты?Heterogeneity analysis, replication на смежных подвыборках, sub-sample stability

Большинство квазиэкспериментальных тестов — про internal validity. Это понятно: сначала нужно убедиться что эффект есть на твоих данных, потом обсуждать его обобщаемость. External validity — отдельная содержательная дискуссия, не имеющая универсальных формальных тестов.

Арсенал проверок

ТестИдеяПрименимостьКрасный флагЧто делать
Placebo treatmentПрименить метод к группе, где интервенции не было — должен дать нулевой эффектDiD, SCMЭффект не нулевой, p < 0.10Метод видит сигнал там, где его нет — есть скрытый confounder
Placebo outcomeПрименить метод к метрике, на которую интервенция не должна влиятьDiD, RDD, IVЭффект значим на placebo-метрикеДизайн ловит общую динамику, не эффект интервенции
Falsification testПроверить условие, которое должно выполняться при правильном дизайне (например, leads = 0 в event study)DiD event study, IVУсловие нарушеноДопущение метода не выполнено — нужен другой метод или другая спецификация
Pre-trend testСравнить тренды treatment и control до интервенцииDiDТренды расходятся, p < 0.10Параллельные тренды нарушены — DiD неприменим
McCrary density testПроверить, нет ли скачка плотности running variable у порогаRDDСкачок значимМанипуляция порогом — RDD неприменим
Balance testСравнить ковариаты treatment и control в окнеRDD, matchingДисбаланс по ключевым ковариатамГруппы не сравнимы — расширить ковариаты или сменить метод
Sensitivity analysisПроверить устойчивость результата к нарушениям допущений (Rosenbaum bounds для matching)Matching, IVРезультат ломается при малом нарушенииЭффект слишком зависит от допущений — заявлять причинность нельзя
Bandwidth robustnessПовторить RDD с разными окнами вокруг порогаRDDЭффект сильно меняетсяЛокальный эффект неустойчив — RDD не работает
Permutation inferenceСравнить наблюдаемый эффект с распределением «случайных» эффектов на placebo-юнитахSCM, DiDНаблюдаемый эффект попадает внутрь placebo-распределенияЭффект не отличим от шума

Как читать результат

Тест проходит — это сигнал что одно конкретное допущение выполняется. Это НЕ доказывает что метод правильный, это снимает одну из угроз.

Тест проваливается — это сигнал что есть проблема. Какая именно — зависит от теста. Провал pre-trend в DiD это не то же самое что провал McCrary в RDD: первое означает «метод неприменим к этим данным», второе — «возможна манипуляция порогом».

Failed test — это НЕ «честность» аналитика, это «метод не работает». Сообщить об этом честно — задача аналитика. Но интерпретировать failed test как «зато наш анализ прозрачный» — самообман. Прозрачность не заменяет валидность.

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

  1. Делать один тест и считать что валидация пройдена. Один тест проверяет одно конкретное допущение. Метод опирается на несколько — нужны несколько тестов.
  2. Путать placebo treatment и placebo outcome. Placebo treatment — применяем метод к unit-ам, которые интервенцию не получали. Placebo outcome — применяем метод к метрике, на которую интервенция влиять не должна. Это разные источники подтверждения.
  3. Интерпретировать failed test как «зато мы прозрачны». Failed test = метод сломан. Прозрачность важна, но она не валидирует анализ.
  4. Не запускать тесты, если эффект статистически значим. Значимость и валидность — независимые вещи. Сильный p-value не отменяет необходимость проверок, скорее наоборот: сильные эффекты привлекают больше скепсиса.
  5. Делать sensitivity analysis формально — одну-две вариации. Если метод действительно надёжен, он должен выдержать 5+ разных спецификаций (разные ковариаты, разные окна, разные определения treatment). Поверхностная sensitivity не ловит проблем.

Логика аргументации

Квазиэксперимент — не доказательство, а аргумент. Сила аргумента определяется:

  1. Правдоподобность дизайна. Можно ли рассказать историю «как именно treatment назначался» так, чтобы условия идентификации звучали убедительно? Если объяснение требует пяти допущений и двух исключений — дизайн слабый, какие бы тесты он ни прошёл.
  2. Количество пройденных проверок. Каждая проверка снимает одну угрозу. Десять пройденных тестов сильнее, чем три — но только если тесты разные. Десять одинаковых вариаций sensitivity analysis считаются за один тест.
  3. Прозрачность ограничений. Чёткое перечисление допущений и того, при каких условиях они нарушатся. Если ограничения сформулированы — читатель может оценить, релевантны ли они в его контексте. Скрытые ограничения подрывают доверие.
  4. Устойчивость к альтернативным спецификациям. Эффект должен быть похож при разных разумных вариантах анализа (другое окно, другие ковариаты, другая функциональная форма). Один-единственный specification, при котором эффект «работает» — флажок что результат подогнан под спецификацию.

Toy example: DiD на маркетплейсе с полной валидацией

Сценарий: маркетплейс ввёл новую систему ранжирования в категории «Электроника» с 1 марта. В категории «Одежда» ничего не менялось. Аналитик делает DiD по GMV: Электроника = treatment, Одежда = control, период до = январь-февраль, период после = март-апрель.

Наивная оценка: GMV в Электронике вырос на 12% относительно Одежды (DiD-эффект). Без проверок этот результат — статистика, не причинный вывод. Прогоняем 4 теста.

Pre-trend test

Сравниваем тренды GMV в обеих категориях за октябрь-февраль (5 месяцев pre-period).

МесяцЭлектроника, рост к пред.Одежда, рост к пред.Разница
Октябрь+3.1%+2.8%+0.3 пп
Ноябрь+4.2%+4.5%−0.3 пп
Декабрь+12.0%+14.5%−2.5 пп (Новый год)
Январь−5.2%−6.0%+0.8 пп
Февраль+2.0%+1.8%+0.2 пп

Средняя разница в pre-period: +0.3 пп. F-test на различие трендов: p = 0.42. Параллельные тренды можно считать выполненными. ✅

Placebo treatment

Делаем фейковый DiD: «Электроника» vs «Одежда», период до 1 января vs период с 1 января (когда никаких изменений ранжирования не было). Эффект: 0.6%, p = 0.71. Нулевой, как и должно быть. ✅

Falsification test

GMV — целевая метрика. Падение средней цены в категории не должно быть следствием изменения ранжирования (ранжирование меняет видимость товаров, не цены продавцов). Прогоняем DiD на средней цене.

Эффект: −0.4% (Электроника к Одежде), p = 0.81. Цены не сдвинулись — falsification пройден. ✅

Sensitivity analysis

Повторяем основной DiD с разными границами:

ВариацияDiD-эффектp
Базовый (jan-feb vs mar-apr)+12.0%0.003
Сдвиг границы на −2 нед.+11.4%0.005
Сдвиг границы на +2 нед.+12.6%0.002
pre = только feb, post = только mar+13.1%0.012
Контроль = «Дом и дача» вместо «Одежда»+10.8%0.008

Эффект устойчив в диапазоне 10.8–13.1% при разных спецификациях. ✅

Итог: 4 теста пройдены. Эффект новой системы ранжирования на GMV в Электронике — около +12%, с уверенностью.

Что было бы при failed pre-trend? Если бы pre-trend дал p = 0.04 (тренды расходились), DiD неприменим. Варианты: синтетический контроль (модуль 4), сужение pre-period до 2 последних месяцев, добавление контрольных переменных в регрессию или признание что причинный вывод невозможен с этими данными.

Упражнения

Задача 1: RDD на BNPL-сервисе

RDD на BNPL-сервисе. Лимит одобрения растёт скачком при кредитном скоре ≥ 650. Аналитик хочет оценить causal эффект высокого лимита на retention.

Какие 3 теста обязательно нужны до того как заявить причинный вывод? Что каждый из них проверяет?

Решение
  1. McCrary density test — проверяет, нет ли пика плотности распределения скоринга вокруг порога 650. Если есть пик ниже порога (заявители с 648-649) или выше (650-651) — значит скоринг манипулируем, и RDD неприменим.
  2. Balance test — заявители с скорингом 649 и 651 должны быть похожи по наблюдаемым характеристикам (возраст, доход, история). Если по какой-то ковариате есть скачок на пороге — то это не RDD-дизайн, а что-то ещё.
  3. Bandwidth robustness — повторить анализ с разной шириной окна вокруг порога: ±10, ±20, ±50 баллов. Если эффект сильно меняется — локальный эффект неустойчив, RDD ненадёжен.

Без этих трёх тестов «эффект лимита на retention» — это догадка, не причинный вывод.

Задача 2: failed pre-trend в DiD

DiD на маркетплейсе показал эффект +15% GMV. Pre-trend test провалился: тренды до интервенции расходились с p = 0.02.

Что делать?

Решение

Наивный DiD неприменим. Эффект +15% — это смесь причинного эффекта и расходящихся pre-trends. Варианты:

  1. Synthetic Control (модуль 4). Вместо одной control-группы (например, «Одежда») построить взвешенную комбинацию нескольких категорий, у которой pre-trend совпадает с treatment. Тогда сравнение валидно.
  2. Сузить pre-period. Если расхождение возникло в декабре, но октябрь-ноябрь шли параллельно — взять pre-period октябрь-ноябрь. Меньше данных, но валидное допущение.
  3. Добавить контрольных переменных в DiD-регрессию. Если pre-trend расходится из-за наблюдаемого confounder (например, разная сезонность категорий), включить его как control. Это уже не классический DiD, а DiD with covariates.
  4. Признать что метод не работает на этих данных. Это нормальный исход — лучше сказать «causal вывод невозможен», чем интерпретировать смешанный сигнал как эффект.

Чего НЕЛЬЗЯ делать: проигнорировать failed pre-trend и заявить +15% как эффект. Это нечестная практика, и аудит такой анализ не пропустит.

Глубже: Sensitivity analysis с формальной нотацией

Для matching существует формальный фреймворк sensitivity — Rosenbaum bounds. Идея: какой силы должен быть hidden confounder, чтобы наблюдаемый эффект мог объясняться им? Параметр Γ — отношение шансов получить treatment между парой matched units. Γ = 1 — confounder отсутствует. Γ > 1 — насколько сильнее должен быть скрытый отбор, чтобы обнулить эффект.

Если эффект ломается при Γ = 1.5 — небольшой скрытый confounder уже достаточен, метод хрупкий. Если эффект держится до Γ = 4 — нужно очень сильное скрытое смещение, аргумент сильный.

Похожая идея для observational studies — E-value (Vanderweele 2017): минимальная сила confounder, которая объясняет наблюдаемое отношение рисков. Чем выше E-value, тем устойчивее аргумент.