Определение доверительных интервалов автокорреляционных коэффициентов временных рядов
Рассмотрим, способ построения графика автокорреляции и доверительных интервалов коэффициентов, по которым выбирается количество членов MA в модели ARIMA. Сначала создадим демонстрационный набор данных:
import pandas as pd import pmdarima as pm import numpy as np ts = pm.datasets.load_airpassengers(as_series=True) ts.index = pd.date_range('1949', '1961', freq='M') ts.plot()
График автокорреляции временного ряда можно вывести функцией plot_acf из модуля statsmodels.graphics.tsaplots. При этом одновременно отображаются доверительные интервалы коэффициентов при истинности нулевой гипотезы о равенстве каждого из них нулю:
from statsmodels.graphics.tsaplots import plot_acf _ = plot_acf(ts)
Для каждого 𝜌𝑘 доверительный интервал считается по формуле Барлетта в предположении, что временной ряд является MA(k-1). Обычно исследователя будет интересовать максимальный лаг, выходящий за пределы доверительного интервала. Остальные лаги, значения которых находятся внутри интервала, полагаются незначимыми.
Для подсчета точных границ доверительных интервалов можно воспользоваться функцией acf из модуля statsmodels.tsa.stattools. При задании уровня значимости в параметре alpha, она возвращает не только величины автокорреляций, но и их доверительные интервалы, подсчитанные по формуле Барлетта:
from statsmodels.tsa.stattools import acf acfs, confints = acf(ts, alpha=0.05) display(acfs[1:5]) display(confints[1:5])
Выводимые acf доверительные интервалы строятся вокруг 𝜌𝑘, вычтем значения автокорреляций и получим интервалы в предположении, что коэффициенты равны 0:
[(interv[0]-p,interv[1]-p) for interv,p in zip(confints, acfs)][1:5]
Теперь посчитаем те же доверительные интервалы по формуле и сверим с выводимыми значениями:
import scipy.stats as stats n = 5 for k in range(1, n): display(f'{-stats.norm(0,1).ppf(0.975)*((1+2*(acfs[1:k]**2).sum())/(len(ts)))**0.5},\ {stats.norm(0,1).ppf(0.975)*((1+2*(acfs[1:k]**2).sum())/(len(ts)))**0.5}')