Causal Calculus
DAG: граф как язык причинности
1999 год: Judea Pearl публикует «Causality». Вопрос «что было бы, если бы» наконец получает математический язык - do-исчисление. За это в 2011 году - Тьюринговая премия. DAG превращает «correlation is not causation» из отговорки в инструмент.
- DoWhy / EconML (Microsoft): causal analysis в Bing, Office, Azure там где A/B-тесты невозможны
- RLHF reward modeling: DAG показывает, что модель учится стилю, а не качеству - reward hacking
- Off-policy evaluation в Spotify, Netflix, Booking: оценка policy без её деплоя через backdoor criterion
- Healthcare ML: propensity score из DAG для оценки эффектов лечения в observational data
Предварительные знания
Узлы, рёбра и три слова DAG
**30 лет статистика повторяла мантру: «correlation is not causation».** 30 лет это была отговорка - не инструмент. Можно было сказать «тут конфаундер» и развести руками. В 1988 году Judea Pearl публикует «Probabilistic Reasoning in Intelligent Systems». Правила меняются: причинность теперь не философия, а граф. Узлы, рёбра, направление. Фраза «X влияет на Y» превращается из риторики в формулу. В 2011 году Pearl получает Тьюринговскую премию.
DAG - Directed Acyclic Graph, направленный ациклический граф. Три слова несут нагрузку. **Directed** - стрелки от причины к следствию, не симметричные связи. **Acyclic** - причина не может быть собственным следствием, X → Y → X запрещено. **Graph** - объект дискретной математики, к которому применимы все её алгоритмы. Каждое ребро X → Y - утверждение: «вмешательство в X изменит Y». Каждое отсутствующее ребро - утверждение: «прямого влияния нет».
DAG делает скрытые предположения **видимыми**. Когда дата-инженер решает включить или не включить переменную в регрессию, он строит DAG в голове. Сделать DAG явным - не дополнительная работа, а перевод неявных предположений в проверяемые. Команды, которые рисуют DAG до экспериментов, ловят confounding-баги до продакшна. Остальные - в постмортемах.
Что означает отсутствующее ребро между X и Y в DAG?
d-разделение: как читать условные независимости из графа
Любой DAG - комбинация трёх элементарных структур из трёх узлов. **Chain** (цепь): X → Z → Y. Z - медиатор, влияние X на Y идёт через Z. При кондиционировании на Z цепь разрывается: X ⊥ Y | Z. **Fork** (вилка): X ← Z → Y. Z - конфаундер, общая причина. X и Y коррелируют, но без причинной связи. Кондиционирование на Z убирает зависимость. **Collider** (коллайдер): X → Z ← Y. Z - общее следствие. X и Y независимы! Кондиционирование на Z **создаёт** ложную зависимость.
Collider ведёт себя **противоположно** fork и chain. В fork кондиционирование убирает зависимость. В collider - создаёт её из ничего. Если фильтровать данные по Z (например, «только успешные кандидаты»), X и Y начинают коррелировать, хотя в природе не связаны. Это **collider bias** или **selection bias** - он убил больше эмпирических исследований, чем все остальные ошибки вместе взятые.
В исследовании звёздных актёров обнаружили: красивые менее талантливы. Какая структура DAG создаёт этот артефакт?
do-оператор: корреляция ≠ причинность
Ключевое различие causal и statistical language: первый говорит про **интервенции** (что будет, если изменить X), второй - про **наблюдения** (что наблюдается при X = x). P(Y | X = x) - условное распределение по наблюдению. P(Y | do(X = x)) - распределение после интервенции. Они не равны при наличии конфаундеров. Барометр предсказывает дождь: P(дождь | барометр_низкий) высокая. Но если сломать барометр: P(дождь | do(барометр_низкий)) = базовая вероятность. Барометр не управляет погодой.
Графически do(X = x) - это разрезание всех входящих в X стрелок и фиксация X = x. Убирает влияние конфаундеров на X. **Backdoor criterion**: набор переменных Z блокирует backdoor paths (пути от X к Y через конфаундеры), если Z блокирует все такие пути и не содержит потомков X. При выполнении backdoor criterion: P(Y | do(X)) = Σ_z P(Y | X, Z=z) P(Z=z) - формула adjustment.
Реклама показывается чаще пользователям с высоким интересом к продукту. Как это влияет на оценку эффекта рекламы?
Итог
- DAG = причинная грамматика: узлы - переменные, направленные рёбра - прямые causal-связи, отсутствие ребра - утверждение независимости
- Три кирпича: chain (X→Z→Y, медиатор), fork (X←Z→Y, конфаундер), collider (X→Z←Y, общее следствие)
- Кондиционирование на медиаторе/конфаундере убирает зависимость; кондиционирование на коллайдере создаёт ложную
- P(Y|X=x) ≠ P(Y|do(X=x)): наблюдение vs интервенция. Разница - backdoor paths через конфаундеры
- DAG постулируется, не выводится: данные различают только Markov equivalence class; стрелки - из времени, экспериментов или экспертного знания
- Collider bias убил больше исследований, чем все остальные ошибки. Лечение: рисовать DAG до анализа, отмечать коллайдеры
Куда дальше
DAG - словарь. Дальше - грамматика и операции, превращающие граф в формулу.
- d-разделение — Алгоритм чтения условных независимостей прямо из графа. Без него DAG - картинка, с ним - вычислимая модель
- Backdoor criterion — Какие узлы контролировать для корректной оценки causal effect. Следствие структуры fork и chain
- do-оператор — Формализация интервенции. P(Y|X) → P(Y|do(X)) - сердце causal inference
- Causal discovery — PC, FCI, NOTEARS: можно ли восстановить DAG из данных и где пределы
Вопросы для размышления
- Какие DAG неявно живут в архитектуре текущего проекта? Что изменится, если их нарисовать явно?
- В каких A/B-тестах команды есть риск collider bias через фильтрацию данных?
- Какие из последних решений «добавить фичу в регрессию» были бы пересмотрены, если бы DAG рисовался до анализа?