Как посчитать instrumental variable в SQL
Содержание:
Зачем IV
Когда treatment endogenous — то есть зависит от outcome (или общих confounders) — стандартные методы (OLS, matching) дают biased результат. Instrumental variable (IV) использует «инструмент» Z, который влияет на treatment T, но НЕ напрямую на outcome Y. Тогда можно изолировать чистый эффект T → Y.
Классический пример: education → income. Доход и образование оба зависят от ability. Инструмент — расстояние до колледжа (влияет на решение учиться, не на income напрямую).
Условия valid instrument
- Relevance: Z коррелирует с T (стат-значимо).
- Exclusion restriction: Z влияет на Y только через T.
- 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;Проверка 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.
Связанные темы
- Как посчитать DiD в SQL
- Как посчитать propensity score matching в SQL
- Instrumental variable простыми словами
- Как посчитать correlation в SQL
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 — нет.