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

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

Зачем выявлять

Когда в регрессии есть сильно коррелированные предикторы (X1 и X2 почти линейно зависят), OLS «не понимает», какому из них приписать эффект. Коэффициенты становятся нестабильными: добавили одну строку — коэффициенты меняются сильно. Multicollinearity — главный enemy interpretability.

Корреляционная матрица

Простейший способ — попарные корреляции:

SELECT
    'x1_x2' AS pair, CORR(x1, x2) AS correlation FROM training_data
UNION ALL
SELECT 'x1_x3', CORR(x1, x3) FROM training_data
UNION ALL
SELECT 'x2_x3', CORR(x2, x3) FROM training_data
UNION ALL
SELECT 'x1_x4', CORR(x1, x4) FROM training_data;

Пары с |CORR| > 0.8 — кандидаты на удаление. > 0.95 — почти линейная зависимость, обязательно убирать.

VIF и его аппроксимация

VIF (Variance Inflation Factor) = 1 / (1 − R²_j), где R²_j — R² регрессии предиктора j на остальные. VIF > 5 — серьёзная multicollinearity, > 10 — обязательно reduce.

В SQL для bivariate auxiliary regression:

WITH r2_x1_on_x2 AS (
    SELECT POWER(CORR(x1, x2), 2) AS r2 FROM training_data
)
SELECT
    r2,
    1 / NULLIF(1 - r2, 0) AS vif_x1
FROM r2_x1_on_x2;

Для multi-predictor VIF — нужны matrix operations, лучше Python.

Что делать

  1. Удалить один из коррелированных: оставить тот, что важнее по domain.
  2. Combine: PCA или sum (x_combined = x1 + x2).
  3. Regularization: ridge / lasso вместо OLS.
  4. Ignore: если интересует только prediction, не interpretation — collinearity не критична.
Закрепи формулу multicollinearity в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать multicollinearity в Telegram

Влияние на коэффициенты

Проверьте, насколько коэффициент чувствителен к удалению фичи:

-- Псевдо-сравнение: запустить OLS с и без X2 в Python,
-- сохранить коэффициенты в таблицу, сравнить.
SELECT
    feature_set,
    coefficient_x1,
    se_x1
FROM ols_runs
WHERE target_variable = 'y'
ORDER BY feature_set;

Если coefficient_x1 сильно меняется от model к model — multicollinearity вредит.

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

Ошибка 1. Учитывать только pairwise correlations. Три переменные могут быть pairwise низко коррелированы, но иметь высокую multivariate collinearity. VIF улавливает.

Ошибка 2. Удалять «лишний» предиктор автоматически. Иногда оба предиктора нужны для interpretability. Сначала domain check.

Ошибка 3. Регуляризация скрывает проблему. Ridge борется с multicollinearity, но коэффициенты становятся biased. Trade-off.

Ошибка 4. Считать VIF на standardized или нет. VIF инвариантен к шкале (использует корреляции). Standardize не обязательно.

Ошибка 5. Игнорировать multicollinearity в логистической регрессии. Та же проблема. VIF аналогично рассчитывается.

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

FAQ

Какой VIF threshold?

5 — стоит проверить. 10 — обязательно reduce.

VIF vs correlation?

Correlation — pairwise. VIF — против всех остальных предикторов.

Multicollinearity и prediction?

Не критично, если цель — prediction. Критично, если interpretation.

Удалять или агрегировать?

Если коррелированные переменные про одно явление (revenue_month_1, revenue_month_2) — агрегировать (avg, sum).

Можно ли в Postgres VIF полностью?

Bivariate — да. Multi — нужны matrix operations, проще Python.