Как посчитать instrumental variable в SQL

Закрепи формулу instrumental variable в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать instrumental variable в Telegram

Зачем IV

Когда treatment endogenous — то есть зависит от outcome (или общих confounders) — стандартные методы (OLS, matching) дают biased результат. Instrumental variable (IV) использует «инструмент» Z, который влияет на treatment T, но НЕ напрямую на outcome Y. Тогда можно изолировать чистый эффект T → Y.

Классический пример: education → income. Доход и образование оба зависят от ability. Инструмент — расстояние до колледжа (влияет на решение учиться, не на income напрямую).

Условия valid instrument

  1. Relevance: Z коррелирует с T (стат-значимо).
  2. Exclusion restriction: Z влияет на Y только через T.
  3. Independence: Z не зависит от unobserved confounders.

Условия 2 и 3 — assumptions, не тестируются формально. Domain knowledge.

2SLS вручную

Two-stage least squares:

  • Stage 1: предсказать T из Z. T_hat = α + β × Z.
  • Stage 2: предсказать Y из T_hat. Y = γ + δ × T_hat.

Коэффициент δ — IV estimator (LATE).

IV в SQL

В чистом SQL OLS coefficient = covariance / variance.

WITH stage1 AS (
    -- T_hat = α + β × Z
    SELECT
        AVG(treatment) AS mean_t,
        AVG(instrument) AS mean_z,
        COVAR_POP(treatment, instrument) AS cov_tz,
        VAR_POP(instrument) AS var_z
    FROM observations
)
SELECT
    cov_tz / NULLIF(var_z, 0) AS beta_first_stage,
    mean_t - cov_tz / NULLIF(var_z, 0) * mean_z AS alpha_first_stage
FROM stage1;

Дальше считаем predicted T и stage 2 — но это уже несколько шагов. Полный 2SLS в SQL без библиотек громоздкий.

WITH first_stage AS (
    SELECT
        AVG(t) AS mean_t,
        AVG(z) AS mean_z,
        COVAR_POP(t, z) AS cov_tz,
        VAR_POP(z) AS var_z
    FROM observations
),
predicted AS (
    SELECT
        o.user_id,
        o.y,
        fs.mean_t - fs.cov_tz / fs.var_z * fs.mean_z
        + fs.cov_tz / fs.var_z * o.z AS t_hat
    FROM observations o, first_stage fs
),
second_stage AS (
    SELECT
        COVAR_POP(y, t_hat) AS cov_y_that,
        VAR_POP(t_hat) AS var_that
    FROM predicted
)
SELECT cov_y_that / NULLIF(var_that, 0) AS iv_estimate
FROM second_stage;
Закрепи формулу instrumental variable в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать instrumental variable в Telegram

Проверка relevance

«Слабый инструмент» (weak instrument) даёт huge bias. F-statistic stage 1 ≥ 10 — стандарт:

WITH fs_residuals AS (
    SELECT
        t,
        z,
        AVG(t) OVER () + COVAR_POP(t, z) OVER () / NULLIF(VAR_POP(z) OVER (), 0)
            * (z - AVG(z) OVER ()) AS t_hat,
        t - (AVG(t) OVER () + COVAR_POP(t, z) OVER () / NULLIF(VAR_POP(z) OVER (), 0)
            * (z - AVG(z) OVER ())) AS residual
    FROM observations
)
SELECT
    POWER(CORR(t, z), 2) * COUNT(*) / NULLIF(1 - POWER(CORR(t, z), 2), 0) AS f_statistic
FROM fs_residuals;

F < 10 → инструмент weak, IV biased.

Частые ошибки

Ошибка 1. Weak instrument. F-stat stage 1 < 10. Bias может быть хуже OLS.

Ошибка 2. Нарушение exclusion restriction. Если Z влияет на Y помимо T — IV не работает. Самое сложное допущение.

Ошибка 3. Использовать ratio как IV. Например, «дистанция / income» — derived variable. Обычно нарушает independence.

Ошибка 4. IV даёт ATE. Нет, даёт LATE (Local Average Treatment Effect) — для compliers только.

Ошибка 5. Считать stage 2 без correction SE. Standard errors из second stage недооценены. Используйте ivreg в R или linearmodels в Python.

Связанные темы

FAQ

Когда IV?

Endogenous treatment, есть валидный instrument.

F-stat < 10 — что делать?

Искать сильнее инструмент или использовать другой метод.

IV vs DiD?

DiD — temporal variation (pre/post). IV — cross-sectional variation через instrument.

LATE vs ATE?

LATE — effect для compliers (people, whose treatment status зависит от Z). ATE — для всей populace.

Можно ли в чистом SQL?

Базовое 2SLS — да. Robust standard errors — нет.