Временные ряды - ARIMA
Мы уже поняли, что для стационарного временного ряда переменная в момент времени t является линейной функцией предыдущих наблюдений или остаточных ошибок. Следовательно, нам пора объединить их и создать модель авторегрессивной скользящей средней (ARMA).
Однако иногда временные ряды не являются стационарными, т. Е. Статистические свойства ряда, такие как среднее значение, дисперсия, со временем меняются. И статистические модели, которые мы изучили до сих пор, предполагают, что временные ряды являются стационарными, поэтому мы можем включить этап предварительной обработки, чтобы дифференцировать временные ряды, чтобы сделать их стационарными. Теперь нам важно выяснить, является ли временной ряд, с которым мы имеем дело, стационарным или нет.
Различные методы определения стационарности временного ряда: поиск сезонности или тенденции на графике временного ряда, проверка разницы в среднем и дисперсии для различных периодов времени, расширенный тест Дики-Фуллера (ADF), тест KPSS, показатель Херста и т. Д. .
Давайте посмотрим, является ли переменная «температура» в нашем наборе данных стационарным временным рядом или нет, используя тест ADF.
В [74]:
from statsmodels.tsa.stattools import adfuller
result = adfuller(train)
print('ADF Statistic: %f' % result[0])
print('p-value: %f' % result[1])
print('Critical Values:')
for key, value In result[4].items()
print('\t%s: %.3f' % (key, value))
Статистика ADF: -10,406056
p-значение: 0,000000
Критические значения:
1%: -3,431
5%: -2,862
10%: -2,567
Теперь, когда мы выполнили тест ADF, давайте интерпретируем результат. Сначала мы сравним статистику ADF с критическими значениями, меньшее критическое значение говорит нам, что ряд, скорее всего, нестационарен. Далее мы видим p-значение. Значение p больше 0,05 также предполагает, что временной ряд нестационарен.
В качестве альтернативы значение p меньше или равно 0,05 или статистика ADF меньше критических значений предполагают, что временной ряд является стационарным.
Следовательно, временной ряд, с которым мы имеем дело, уже является стационарным. В случае стационарных временных рядов мы устанавливаем параметр d равным 0.
Мы также можем подтвердить стационарность временных рядов, используя показатель Херста.
В [75]:
import hurst
H, c,data = hurst.compute_Hc(train)
print("H = {:.4f}, c = {:.4f}".format(H,c))
Н = 0,1660, с = 5,0740
Значение H <0,5 показывает анти-постоянное поведение, а H> 0,5 показывает постоянное поведение или серию тенденций. H = 0,5 показывает случайное блуждание / броуновское движение. Значение H <0,5, подтверждающее стационарность нашего ряда.
Для нестационарных временных рядов мы устанавливаем параметр «d» равным 1. Кроме того, значение параметра авторегрессивного тренда «p» и параметра тренда скользящего среднего «q» рассчитывается на стационарном временном ряду, т. Е. Путем построения графика. ACP и PACP после разности временных рядов.
Модель ARIMA, которая характеризуется тремя параметрами (p, d, q), теперь нам понятна, поэтому давайте смоделируем наши временные ряды и спрогнозируем будущие значения температуры.
В [156]:
from statsmodels.tsa.arima_model import ARIMA
model = ARIMA(train.values, order=(5, 0, 2))
model_fit = model.fit(disp=False)
В [157]:
predictions = model_fit.predict(len(test))
test_ = pandas.DataFrame(test)
test_['predictions'] = predictions[0:1871]
В [158]:
plt.plot(df['T'])
plt.plot(test_.predictions)
plt.show()
В [167]:
error = sqrt(metrics.mean_squared_error(test.values,predictions[0:1871]))
print ('Test RMSE for ARIMA: ', error)
Тест RMSE для ARIMA: 43.21252940234892