Как посчитать partial autocorrelation в SQL
Содержание:
Зачем 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).
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.
Связанные темы
- Как посчитать autocorrelation в SQL
- Как посчитать seasonality в SQL
- Как посчитать correlation в SQL
- Time series forecasting для аналитика
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.