Мы уже поняли, что для стационарного временного ряда переменная в момент времени 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
р-значение: 0,000000
Критические ценности:
1%: -3,431
5%: -2,862
10%: -2,567
Теперь, когда мы запустили тест ADF, давайте интерпретируем результат. Сначала мы сравним статистику АПД с критическими значениями, более низкое критическое значение говорит нам, что ряд, скорее всего, нестационарный. Далее мы видим р-значение. Значение р, превышающее 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))
H = 0,1660, с = 5,0740
Значение H <0,5 показывает антипостоянное поведение, а H> 0,5 показывает постоянное поведение или ряд трендов. H = 0.5 показывает случайное блуждание / броуновское движение. Значение Н <0,5, подтверждающее, что наша серия является стационарной.
Для нестационарного временного ряда мы устанавливаем параметр «d» равным 1. Кроме того, значение параметра авторегрессивного тренда «p» и параметра тренда скользящей средней «q» рассчитывается для стационарного временного ряда, т.е. путем построения графика ACP и PACP после различия временных рядов.
Модель ARIMA, которая характеризуется 3-мя параметрами (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