Causal Calculus
d-separation: когда граф говорит «независимы»
Парадокс Симпсона, 1973 год. Данные Berkeley показывают: мужчин принимают в университет чаще, чем женщин - 44% против 35%. Феминистские организации требуют расследования. Бикель вскрывает данные по факультетам - и обнаруживает, что в каждом отдельном факультете женщин принимают с той же или лучшей вероятностью. Полная инверсия. Агрегированная статистика - ложь. Дезагрегированная - правда. Что выбрать? d-separation отвечает на этот вопрос одним правилом: посмотреть на граф.
- **DoWhy и CausalML**: библиотеки Microsoft и Uber реализуют d-separation как обязательный шаг идентификации перед любой оценкой эффекта. Без проверки графа - нет надёжного ответа на вопрос 'что произойдёт если'
- **A/B-тесты с сегментацией**: post-hoc анализ по сегментам (устройства, регионы, когорты) регулярно создаёт парадокс Симпсона. Платформы Eppo и Statsig используют d-separation для диагностики, какие разбивки безопасны
- **Berkson-bias в production ML**: модели кредитного скоринга, модерации контента и найма обучаются на отфильтрованных данных (одобренные заявки, прошедшие модерацию посты). Фильтр - коллайдер. Модель наследует систематический bias, незаметный без анализа графа
- **Causal discovery**: алгоритм PC (Peter-Clark) строит DAG, тестируя d-separation гипотезы через статистические тесты условной независимости. Это основа автоматического построения причинных графов из данных
Предварительные знания
Три структурных мотива: chain, fork, collider
Любой путь в DAG составлен из трёх элементарных структур. Не метафора - буквальный факт: любой путь между двумя узлами можно разбить на подпути, каждый из которых является одним из трёх типов. Структура определяет, блокируется ли информационный поток по этому пути.
| Структура | Граф | Что происходит без условия | Что происходит при условии на Z |
|---|---|---|---|
| Chain (цепь) | $X \to Z \to Y$ | $X$ и $Y$ зависимы: информация течёт через $Z$ | Путь блокирован: $X \perp Y \mid Z$ |
| Fork (вилка) | $X \leftarrow Z \to Y$ | $X$ и $Y$ зависимы: $Z$ - общая причина | Путь блокирован: $X \perp Y \mid Z$ |
| Collider (коллайдер) | $X \to Z \leftarrow Y$ | $X$ и $Y$ независимы: информация не течёт | Путь открыт: условие на $Z$ создаёт зависимость |
Первые два мотива ведут себя одинаково: кондиционирование блокирует поток. Третий - зеркально наоборот: кондиционирование открывает путь, которого не было. Именно поэтому добавление переменных в регрессию может навредить, а не помочь. DoWhy (Microsoft) проверяет эту структуру автоматически перед каждым шагом идентификации эффекта.
Berkson's paradox: госпитализация как коллайдер
Классический collider bias в медицинских данных
Граф: Болезнь A -> Госпитализация <- Болезнь B Больные в больнице отобраны по коллайдеру (госпитализации). Среди всего населения A и B независимы. Среди госпитализированных: если A не объясняет попадание в больницу, то её объясняет B - возникает отрицательная корреляция. Результат: врачи замечают, что у пациентов с A реже бывает B. Вывод 'A защищает от B' - артефакт отбора. ML-вариант: модель обучается только на одобренных заявках (кредиты, рекомендации, модерация). Коллайдер - статус одобрения. Модель наследует Berkson-bias и хуже работает на всём населении.
**Интуиция коллайдера**: если знать, что $Z$ произошло, и узнать что $X$ не случилось, - вероятность $Y$ повышается. Информация "течёт" в обход через следствие. Это называется explaining away (объяснение через исключение) - и это то, что делает коллайдер опасным при фильтрации данных или добавлении переменных в регрессию.
В графе $\text{Талант} \to \text{Найм} \leftarrow \text{Связи}$ HR анализирует только нанятых сотрудников. Что произойдёт?
Критерий d-separation: алгоритм
d-separation (directional separation) - алгоритм Pearl 1988 года для определения условной независимости прямо по структуре DAG. Без данных. Без вычислений вероятностей. Только граф.
**Определение**: множество узлов $S$ d-separates $X$ от $Y$, если каждый путь между $X$ и $Y$ заблокирован $S$. Путь заблокирован $S$, если: (1) на пути есть chain или fork с серединой $Z \in S$, **или** (2) на пути есть collider $Z \notin S$ и ни один потомок $Z$ не принадлежит $S$.
Правило коллайдера часто удивляет: **потомок** коллайдера тоже открывает путь. Если в регрессию добавлен прокси-показатель для коллайдера (например, диагноз вместо самого факта госпитализации) - bias всё равно появляется. CausalML (Uber) и DoWhy (Microsoft) реализуют проверку d-separation как обязательный шаг перед backdoor adjustment.
Если $X$ и $Y$ d-separated данным $S$ - они условно независимы: $X \perp\!\!\!\perp Y \mid S$. Это называется Global Markov Property. Обратно (Faithfulness Assumption): если в данных есть условная независимость, то в истинном DAG должна быть d-separation. На этом допущении строятся все алгоритмы causal discovery - PC, FCI, GES.
**Faithfulness может нарушаться**: если параметрические значения точно компенсируют структурные пути (probability-1 совпадение), то d-connection не даёт зависимости в данных. На практике это редкость, но в синтетических данных встречается. PC-алгоритм может ошибочно ориентировать рёбра в таких вырожденных случаях.
В DAG $A \to B \leftarrow C$, $B \to D$. Является ли $A$ d-separated от $C$ при условии на $D$?
M-bias и парадокс Симпсона через d-separation
**Парадокс Симпсона**: лечение ухудшает исходы в общей популяции, но улучшает в каждой подгруппе по полу. Или наоборот. Это не статистический курьёз - это систематическая проблема, убивающая клинические исследования и A/B-тесты. d-separation объясняет его в одно правило.
Парадокс Симпсона: Berkeley admissions 1973
Реальный кейс: дискриминация или статистический артефакт?
Данные приёма в Berkeley 1973: Общий приём: мужчины 44%, женщины 35% - выглядит как дискриминация По факультетам: Факультет A: мужчины 62%, женщины 82% Факультет B: мужчины 63%, женщины 68% Факультет C: мужчины 37%, женщины 34% Факультет D: мужчины 33%, женщины 35% ... В каждом факультете женщины принимались с примерно одинаковой или лучшей вероятностью. DAG: Пол -> Выбор факультета -> Приём Пол -> Приём (прямой эффект?) Проблема: факультет - медиатор (chain). Контроль на медиатор блокирует путь Пол -> Факультет -> Приём. Результат без контроля: общий bias из-за того, что женщины подавали на конкурентные факультеты. d-separation решение: не контролировать на медиатор при оценке общего эффекта (total effect = прямой + через медиатор).
**M-bias** - структура, где добавление «разумного» контрольного регрессора создаёт bias вместо того, чтобы его устранить. Название из формы графа: $U_1 \to X$, $U_1 \to B \leftarrow U_2$, $U_2 \to Y$. Если $B$ добавить в модель (выглядит как «полезный контроль»), открывается путь через скрытые конфаундеры $U_1$ и $U_2$.
**Главный вывод**: d-separation говорит, какие переменные безопасно включать в модель. Переменная выглядит «разумным контролем» - ещё не значит, что её включение уменьшит bias. Если эта переменная - коллайдер или потомок коллайдера - включение создаёт ложные зависимости. DoWhy автоматически проверяет это через refutation tests.
Чем больше переменных включено в регрессию, тем лучше контролируется confounding
Включение коллайдеров и их потомков создаёт confounding вместо того, чтобы его устранить
d-separation показывает: каждый узел графа имеет роль - медиатор, конфаундер или коллайдер. Включать нужно только те, что блокируют backdoor-пути (конфаундеры), и никогда - коллайдеры и медиаторы при оценке total effect. Эвристика «больше контролей = лучше» противоречит структуре графа.
Исследователь изучает эффект физической активности (X) на здоровье (Y). В регрессию добавлен ИМТ (B), который зависит как от активности, так и от питания (U, неизмеренное), которое также влияет на здоровье. Что произойдёт?
Ключевые идеи
- **Три мотива**: chain ($X \to Z \to Y$) и fork ($X \leftarrow Z \to Y$) блокируются при условии на $Z$; collider ($X \to Z \leftarrow Y$) открывается - зеркально противоположное поведение
- **Критерий d-separation**: путь заблокирован $S$, если (1) chain/fork с серединой в $S$, или (2) collider с серединой вне $S$ и без потомков в $S$. Если все пути заблокированы - $X \perp\!\!\!\perp Y \mid S$
- **Парадокс Симпсона = нарушение структуры**: агрегат и разбивка дают разные ответы, когда разбивочная переменная - медиатор или конфаундер. d-separation показывает почему
- **M-bias**: добавление выглядящего полезным контроля создаёт bias, если этот контроль - коллайдер. Эвристика 'больше переменных' опасна без анализа графа
- **PC-алгоритм**: causal discovery строится на тестировании d-separation гипотез - этот алгоритм восстанавливает скелет DAG из данных
- **Faithfulness**: данные отражают d-separation только при допущении, что вероятностные независимости не совпадают случайно. Нарушение возможно, но редко в реальных данных
Куда дальше
d-separation - это диагностический инструмент. Следующий шаг - использовать его для принятия решений об оценке эффектов.
- Backdoor criterion — Какие переменные контролировать для корректной оценки causal effect - прямое следствие d-separation
- Frontdoor criterion — Оценка через медиатор когда прямой backdoor adjustment невозможен
- do-оператор — Формализация интервенции: d-separation говорит о наблюдениях, do - об активных вмешательствах
- Causal discovery — PC-алгоритм строит DAG через автоматические тесты d-separation гипотез
Вопросы для размышления
- Какие «контрольные переменные» в текущих моделях могут оказаться коллайдерами? Есть ли DAG, по которому можно это проверить?
- В каких отчётах команды агрегированная статистика и разбивка по сегментам могут давать противоположные выводы - и какой структуре DAG это соответствует?
- Если данные для обучения модели собирались с фильтрацией (модерация, одобрение, порог качества) - какой узел в DAG этот фильтр представляет и почему это опасно?
Связанные уроки
- cc-01-dags — DAG - язык, d-separation - грамматика
- cc-03-backdoor — Backdoor criterion строится поверх d-separation
- cc-05-do-operator — do-оператор формализует разрезание путей
- prob-03-conditional — Условная независимость - математическая база
- stat-20-causal — Causal inference применяет d-separation к реальным данным
- cc-11-causal-discovery — PC-алгоритм ищет граф через тесты d-separation
- stat-01-sampling