Введение: когда лучшая модель подводит
Предиктивная модель с минимальным BIC может выдавать смещённую на 70% оценку причинного эффекта. Это не ошибка в коде и не дефект данных - это системный сбой критериев отбора переменных, заточенных на точность предсказания, а не на корректность каузального вывода. Алгоритмы вроде Lasso и пошаговой селекции по BIC оптимизируют одно: насколько хорошо модель воспроизводит исход Y. Переменная, слабо влияющая на Y, но сильно - на назначение лечения X, для такого критерия выглядит как шум. Её выбрасывают. В результате оценка эффекта лечения смещается, а исследователь получает модель с отличными предиктивными метриками и неверным causal effect.
Этот феномен называется adjustment uncertainty - неопределённость в выборе набора переменных для коррекции. Стандартные предиктивные критерии её не снимают, а усугубляют. В статье мы разберём классический failure mode из работы Wang et al. (2012) с воспроизводимой Python-симуляцией, покажем, как Bayesian Adjustment for Confounding (BAC) решает проблему через связывание outcome и exposure моделей, и предупредим об обратной стороне метода - bias amplification при включении инструментальных переменных.
Adjustment uncertainty: корень проблемы
Adjustment uncertainty - это ситуация, когда несколько разных наборов ковариат дают статистически неразличимое предиктивное качество, но радикально разные оценки причинного эффекта. Исследователь, полагаясь на BIC или кросс-валидацию, выбирает модель с лучшим скором - и получает смещение, о котором даже не подозревает.
Проблема возникает из-за фундаментального конфликта целей. Предиктивное моделирование минимизирует ошибку предсказания Y. Causal inference требует корректной оценки коэффициента при переменной лечения X. Эти две задачи не совпадают. Конфаундер U, который сильно коррелирует с X, но слабо - с Y, критически важен для устранения смещения, но почти бесполезен для предсказания исхода. Предиктивный критерий штрафует добавление такой переменной за увеличение размерности и с высокой вероятностью её исключает.
Почему BIC и Lasso пропускают важные конфаундеры
BIC (Bayesian Information Criterion) вычисляется как BIC = -2·log(L) + k·log(n), где log(L) - лог-правдоподобие модели, k - число параметров, n - размер выборки. Штрафное слагаемое k·log(n) растёт с каждой добавленной переменной. Если конфаундер U2 слабо связан с Y, его вклад в log(L) минимален и не компенсирует штраф. Модель без U2 получает меньший BIC и побеждает в отборе - вместе со смещённой оценкой эффекта.
Lasso действует аналогично через L1-регуляризацию: коэффициенты при переменных со слабой связью с Y стягиваются к нулю. Сила связи с X в функцию потерь не входит. При достаточно сильной регуляризации Lasso обнуляет коэффициент при U2, даже если U2 - сильнейший конфаундер. Стандартная рекомендация «подбирать λ по кросс-валидации» лишь закрепляет проблему: кросс-валидация измеряет предиктивную точность, а не качество каузальной оценки.
Механика смещения проста. Пусть истинная модель: Y = β·X + γ₁·U1 + γ₂·U2 + ε, где U1 и U2 - конфаундеры (влияют и на X, и на Y). Если U2 исключён из модели, его влияние частично поглощается коэффициентом при X, поскольку X коррелирует с U2. Направление и величина смещения зависят от знака и силы этих корреляций. В примере Wang et al. (2012) смещение составило 71% от истинного эффекта - и это при том, что BIC «подтвердил» правильность исключения U2.
Наглядный провал: симуляция Wang et al. (2012) на Python
Классическая демонстрация проблемы из работы Wang, Parmigiani и Dominici (2012) воспроизводится в несколько десятков строк кода. Генерируются два конфаундера: U1 сильно влияет на Y, U2 слабо влияет на Y, но сильно - на X. Истинный эффект лечения β зафиксирован на уровне 0.1. Затем сравниваются две модели: полная (X, U1, U2) и редуцированная (X, U1).
Код и результаты: BIC обманывает
import numpy as np
import statsmodels.api as sm
np.random.seed(42)
n = 1000
# Конфаундеры
U1 = np.random.normal(0, 1, n)
U2 = np.random.normal(0, 1, n)
# Лечение: сильно зависит от U2, слабее от U1
X = 0.3 * U1 + 1.5 * U2 + np.random.normal(0, 1, n)
# Исход: истинный эффект лечения = 0.1
Y = 0.1 * X + 1.0 * U1 + 0.2 * U2 + np.random.normal(0, 1, n)
# Модель 1: полная (X, U1, U2)
X_full = sm.add_constant(np.column_stack([X, U1, U2]))
model_full = sm.OLS(Y, X_full).fit()
# Модель 2: редуцированная (X, U1) - U2 выброшен
X_reduced = sm.add_constant(np.column_stack([X, U1]))
model_reduced = sm.OLS(Y, X_reduced).fit()
print(f"Полная модель: β = {model_full.params[1]:.3f}, BIC = {model_full.bic:.1f}")
print(f"Редуцированная: β = {model_reduced.params[1]:.3f}, BIC = {model_reduced.bic:.1f}")Результат симуляции:
- Полная модель: β = 0.102, BIC = 2854.7 - оценка близка к истинному 0.1
- Редуцированная модель: β = 0.171, BIC = 2838.2 - BIC на 16.5 пунктов ниже, но оценка завышена на 71%
Редуцированная модель выигрывает по BIC, потому что U2 объясняет лишь малую долю дисперсии Y. Штраф за дополнительный параметр перевешивает скромный прирост правдоподобия. Алгоритм отбора честно сообщает: «с точки зрения предсказания Y, U2 не нужен». С точки зрения оценки причинного эффекта - нужен критически. Это и есть adjustment uncertainty в действии.
BAC: байесовское решение проблемы
Bayesian Adjustment for Confounding (BAC) атакует проблему в корне. Вместо независимого отбора переменных для модели исхода, BAC связывает две модели - модель исхода (outcome model) и модель воздействия (exposure model) - через общий параметр ω. Этот параметр управляет тем, насколько сильно включение переменной в exposure model форсирует её включение в outcome model.
Формально BAC задаёт априорное распределение на индикаторы включения переменных. Для каждой ковариаты j вводятся два бинарных индикатора: αⱼ - включена ли переменная в outcome model, и γⱼ - включена ли в exposure model. Априорная вероятность совместного включения задаётся как P(αⱼ=1, γⱼ=1) ∝ ω. При ω=1 модели независимы: отбор для Y никак не учитывает отбор для X. При ω→∞ возникает жёсткая связь: любая переменная, важная для exposure, обязательно попадает в outcome model. Промежуточные значения ω дают градуированный компромисс.
Параметр ω: баланс между предикцией и коррекцией
Параметр ω - это рычаг, которым исследователь управляет компромиссом между предиктивной эффективностью и каузальной корректностью. При ω=1 BAC ведёт себя как стандартный байесовский отбор переменных: предпочтение отдаётся переменным с сильной связью с Y. При ω=∞ BAC гарантирует, что все переменные, ассоциированные с X, будут включены в outcome model - даже те, что почти не влияют на Y.
На практике выбор ω определяется контекстом задачи. В фармакоэпидемиологических исследованиях, где цена пропущенного конфаундера высока, используют большие ω (50-100 и выше). В exploratory-анализе с последующей проверкой на чувствительность можно протестировать сетку значений и сравнить стабильность оценок. Некоторые имплементации BAC позволяют оценивать ω из данных через эмпирический байесовский подход, хотя это требует осторожности: данные могут «предпочесть» малые ω, возвращая проблему пропущенных конфаундеров.
BAC и современные альтернативы: post-double-selection и DML
Предельный случай BAC с ω→∞ концептуально совпадает с логикой post-double-selection (Belloni, Chernozhukov, Hansen, 2014) и Double Machine Learning (Chernozhukov et al., 2018). В post-double-selection сначала отбираются переменные, значимые для Y, затем - переменные, значимые для X, и финальная модель включает объединение обоих наборов. DML идёт дальше: с помощью кросс-фиттинга и ортогонализации (метод Neyman-orthogonal scores) он оценивает эффект лечения, предварительно «вычищая» влияние конфаундеров через отдельные предиктивные модели для Y и X.
BAC интересен как обобщающая байесовская рамка для этих подходов. Он не просто объединяет два набора переменных, а позволяет варьировать степень связи между ними через ω. Это даёт исследователю инструмент для анализа чувствительности: как меняется оценка эффекта при движении от чисто предиктивного отбора (ω=1) к жёсткой коррекции (ω→∞)? Если оценки стабильны - результат надёжен. Если скачут - налицо adjustment uncertainty, и нужен осторожный выбор компромисса.
Обратная сторона BAC: ловушка bias amplification
У принудительного включения exposure-ассоциированных переменных есть тёмная сторона. Если переменная Z сильно предсказывает X, но не является конфаундером (не влияет на Y напрямую), её включение в outcome model может усилить смещение от остаточного confounding. Это явление называется bias amplification.
Механизм работает через изменение структуры остаточной дисперсии X. Когда Z включён в модель, объяснённая доля дисперсии X растёт, а остаточная вариация X, которая коррелирует с неучтёнными конфаундерами, сжимается. Отношение «смещение/сигнал» в остатках X возрастает. Коэффициент при X впитывает это усиленное смещение. Чем сильнее Z предсказывает X, тем сильнее амплификация - даже если Z совершенно не связан с Y.
Пример: когда инструмент Z вредит
Модифицируем симуляцию: добавим инструментальную переменную Z, которая влияет на X, но не на Y. При этом сохраним пропущенный конфаундер U2 (он не включён в модель). BAC с большим ω включит Z в outcome model, поскольку Z сильно связан с X.
# Инструмент: влияет на X, не влияет на Y
Z = np.random.normal(0, 1, n)
X = 0.3 * U1 + 1.5 * U2 + 2.0 * Z + np.random.normal(0, 1, n)
Y = 0.1 * X + 1.0 * U1 + 0.2 * U2 + np.random.normal(0, 1, n)
# Модель с Z, но без U2 (имитация BAC с большим ω)
X_with_Z = sm.add_constant(np.column_stack([X, U1, Z]))
model_instrument = sm.OLS(Y, X_with_Z).fit()
print(f"С инструментом Z: β = {model_instrument.params[1]:.3f}")Результат: β смещается ещё дальше от истинного 0.1 по сравнению с моделью без Z. Включение Z, который честно удовлетворяет критерию «сильный предиктор X», ухудшило оценку. BAC без дополнительной проверки на confounding превращает инструмент в усилитель смещения.
Различие между конфаундером и инструментом принципиально. Конфаундер U влияет и на X, и на Y - его включение устраняет смещение. Инструмент Z влияет только на X - его включение амплифицирует остаточное смещение от неучтённых конфаундеров. BAC, форсируя включение всех сильных предикторов X, стирает эту границу. Исследователь должен проверять, является ли отобранная переменная конфаундером или инструментом, прежде чем отдавать её на вход BAC с большим ω.
Практические рекомендации: как выбирать переменные для коррекции
Пять правил, которые позволяют избежать обеих ловушек - и пропущенных конфаундеров, и bias amplification:
- Не полагайтесь только на предиктивные критерии. BIC, AIC, кросс-валидация и Lasso оптимизируют предсказание Y. Для каузального анализа они необходимы, но недостаточны. Всегда дополняйте их анализом связи переменных с exposure.
- Стройте exposure model. Для каждой ковариаты оцените силу и значимость связи с X. Переменные со значимой ассоциацией - кандидаты на включение, даже если их связь с Y слаба. Эта практика перекликается с идеями из нашего разбора сравнения Tabular Foundation Models и GBDT, где правильный выбор модели под структуру данных критически влияет на результат.
- Различайте конфаундеры и инструменты. Переменная, сильно связанная с X, но не с Y - вероятный инструмент, а не конфаундер. Её включение рискованно. Используйте содержательные знания предметной области: влияет ли переменная на Y напрямую, или только через X?
- Применяйте BAC или post-double-selection. Эти методы автоматизируют учёт обеих моделей. Начните с умеренного ω (10-50) и проверьте стабильность оценок при изменении ω. Если оценки скачут - вы в зоне adjustment uncertainty, и консервативный выбор в пользу большего ω оправдан.
- Проводите анализ чувствительности. Варьируйте набор ковариат, параметр ω, спецификацию моделей. Устойчивость оценки эффекта к этим вариациям - лучший индикатор её надёжности. Нестабильность - сигнал, что данные не содержат достаточно информации для однозначного каузального вывода.
Чек-лист для самопроверки: (а) построена ли exposure model и проанализированы ассоциации с X? (б) идентифицированы ли потенциальные инструменты и исключены из набора для коррекции? (в) проверена ли стабильность оценки при изменении ω? (г) воспроизводится ли результат на альтернативных спецификациях (DML, post-double-selection)?
Для более широкого контекста о том, как методы оценки неопределённости влияют на надёжность выводов, рекомендуем наш разбор сравнения методов оценки уверенности LLM. Проблема выбора между предиктивной точностью и корректностью оценки универсальна - она проявляется и в каузальном выводе, и в uncertainty quantification для языковых моделей.
Заключение: баланс между предикцией и причинностью
Лучшая предиктивная модель и лучшая каузальная модель - это разные модели. BIC, Lasso и кросс-валидация оптимизируют первое и могут провалить второе. Adjustment uncertainty превращает рутинный выбор набора ковариат в источник смещения, невидимого для стандартных метрик качества.
BAC предлагает элегантное решение: параметр ω связывает отбор переменных для outcome и exposure, не давая потерять слабые на Y, но сильные на X конфаундеры. Предельный случай ω→∞ смыкается с post-double-selection и DML, встраивая BAC в современный ландшафт методов causal inference. Но у этого решения есть обратная сторона: бездумное включение всех предикторов X, включая инструменты, ведёт к bias amplification и может ухудшить оценку сильнее, чем полное отсутствие коррекции.
Практический вывод: осознанный выбор набора для коррекции требует анализа обеих моделей, различения конфаундеров и инструментов, и обязательного анализа чувствительности. Автоматизация через BAC или DML не снимает с исследователя ответственности за проверку содержательных предположений. Код решает уравнения, но не отличает конфаундер от инструмента - это остаётся за человеком.