Условие
Что такое DAG в causal inference, как использовать для выбора контролов в регрессии?
Решение
DAG (Directed Acyclic Graph)
Граф, где узлы — переменные, рёбра — causal arrows. Не циклов (acyclic).
weather → ads → conversion
↑
user_intent
Типы переменных
| Роль | Что |
|---|---|
| Confounder | Влияет и на treatment X, и на outcome Y. Контролировать обязательно. |
| Mediator | На пути X → M → Y. Контроль закрывает part of effect. |
| Collider | X → C ← Y. Контроль создаёт spurious correlation (selection bias). |
| Instrument | Z → X, но не Z → Y напрямую. |
Backdoor criterion
Чтобы получить causal effect X → Y:
- Заблокировать все backdoor paths от X к Y.
- Не открывать новых через контроль collider'ов.
Backdoor — путь X ← ... → Y (стрелка в X на старте).
Пример: эффект рекламы на покупку
season → ads
season → purchase
ads → purchase
ad_clicked → purchase
ads → ad_clicked
season— confounder (влияет и на ads, и на purchase) → контролировать.ad_clicked— mediator (ads → ad_clicked → purchase) → НЕ контролировать, если хотите total effect.- Если будете контролировать ad_clicked, измерите только direct effect ads → purchase, не через клики.
Collider bias
talent → success
luck → success
Если у вас выборка успешных людей и вы спрашиваете «как соотносится талант и удача» — увидите negative correlation. На самом деле они независимы; селекция по success открыла collider.
Известно как Berkson's paradox. Знаменитый кейс: «среди опубликованных исследований негативная корреляция между новизной и качеством» — потому что обозреватели селективно публикуют.
dagitty / DoWhy
# pip install dowhy
from dowhy import CausalModel
model = CausalModel(
data=df,
treatment='ads',
outcome='purchase',
graph="""
ads -> purchase;
season -> ads; season -> purchase;
ads -> click; click -> purchase;
""",
)
identified = model.identify_effect()
estimate = model.estimate_effect(identified, method_name="backdoor.linear_regression")dagitty автоматически найдёт min adjustment set.
Что контролировать
Правило: минимальный backdoor adjustment set. Не «всё подряд» — лишний контроль может открыть collider.
Подводные камни
- Включение mediator в регрессию убирает indirect effect (если хотите total — не включать).
- Включение collider создаёт bias из ничего.
- Bad controls — переменные после treatment, которые сами causally зависят от X.
- DAG — это assumption, не observable. Делайте явно, обсуждайте с предметом.
- Cycle (feedback) — DAG не позволяет; для feedback нужны structural equation models или dynamic models.
Эталонный ответ
DAG — узлы переменные, рёбра causal arrows. Контролировать confounders, не контролировать mediators (если total effect) и colliders (создают bias). Backdoor criterion: блокировать все X ← ... → Y пути. Инструменты — dagitty / DoWhy.