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

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

Зачем PACF

ACF на тренде или AR(1) показывает высокую корреляцию во всех лагах: ACF(2) высокая только потому, что AC(1) высокая. PACF убирает «эхо» промежуточных лагов — показывает direct correlation y_t и y_{t-k} после учёта y_{t-1}...y_{t-k+1}.

Применение: choose order для AR(p) модели. PACF(k) ≈ 0 при k > p → AR(p) достаточно.

Идея

PACF(k) = corr(residuals(y_t | y_{t-1}, ..., y_{t-k+1}),
                 residuals(y_{t-k} | y_{t-1}, ..., y_{t-k+1}))

В строгой версии — Yule-Walker уравнения. В SQL приближение через AR-регрессию.

PACF аппроксимация в SQL

Простейшее: PACF(1) = ACF(1). PACF(2) — slope в регрессии y_t = a + b1×y_{t-1} + b2×y_{t-2} (коэффициент b2).

WITH base AS (
    SELECT event_date, value AS y,
        LAG(value, 1) OVER (ORDER BY event_date) AS y1,
        LAG(value, 2) OVER (ORDER BY event_date) AS y2
    FROM daily_metrics
    WHERE metric_name = 'dau'
)
SELECT
    -- PACF(1) = простая корреляция
    CORR(y, y1) AS pacf_1,
    -- PACF(2) ~ partial correlation между y и y_{t-2} after controlling for y_{t-1}
    (CORR(y, y2) - CORR(y, y1) * CORR(y2, y1))
    / NULLIF(SQRT((1 - POWER(CORR(y, y1), 2)) * (1 - POWER(CORR(y2, y1), 2))), 0) AS pacf_2_approx
FROM base
WHERE y2 IS NOT NULL;

Это упрощённая формула. Полный PACF — через recursive Levinson-Durbin вне SQL.

Выбор порядка AR

WITH pacf_table AS (
    SELECT 1 AS lag, 0.85 AS pacf
    UNION ALL SELECT 2, 0.10
    UNION ALL SELECT 3, 0.02
    UNION ALL SELECT 4, 0.01
)
SELECT
    lag,
    pacf,
    CASE
        WHEN ABS(pacf) > 0.2 THEN 'significant'
        ELSE 'noise'
    END AS verdict
FROM pacf_table
ORDER BY lag;

Последний significant lag → порядок AR. В примере выше: PACF(1) сильный, PACF(2)+ near 0 → AR(1).

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

PACF vs ACF

Pattern Type
ACF медленно затухает, PACF cuts off на p AR(p)
ACF cuts off на q, PACF медленно затухает MA(q)
Оба медленно затухают ARMA(p, q)
ACF спайк на сезонной частоте сезонный AR

В SQL обычно используют для preliminary check перед statsmodels.

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

Ошибка 1. PACF(k) = ACF(k). Только при k=1. На больших лагах PACF != ACF.

Ошибка 2. Игнорировать stationarity. PACF на non-stationary серии бессмыслен. Сначала detrend / difference.

Ошибка 3. Считать PACF на коротком ряду. Меньше 50 точек — большой confidence interval, PACF шумит.

Ошибка 4. Confidence band. PACF(k) значим если |PACF| > 2/√n. Иначе шум.

Ошибка 5. Использовать SQL для AR-моделей. PACF в SQL — для exploration. Fit модели — в Python statsmodels.tsa.ARIMA.

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

FAQ

PACF range?

[-1, 1], как ACF.

Когда использовать PACF?

Для выбора порядка AR(p). MA-модели — через ACF.

PACF в SQL — точно?

Аппроксимация для маленьких лагов. Точный PACF — через Levinson-Durbin в Python.

Confidence band?

±2/√n. Лаг внутри band — шум.

PACF и stationarity?

Stationarity нужна. ADF-test → detrend → PACF.