Вы находитесь на странице: 1из 9

Домашнее экзаменационное задание

по курсу "Эконометрика временных рядов" - ARIMA-моделирование

1. Из базы данных global_economy (в пакете fpp3) выберите страну (или территорию, или
регион) и какую-либо экономическую переменную (временной ряд с 1960 по 2017 гг.).

В индивидуальном задании было указано - NDL, Growth

Установим пакет: install.packages('fpp3')

view(global_economy)

2. Выяснить, стационарен ли временной ряд (с помощью формального теста (тестов) и


визуально). Если нет, привести к стационарности.

Оценим стационарность ряда визуально, построив график:

global_economy %>% filter(Code == "NLD") %>% autoplot(Growth)

Наблюдаем наличие визуального тренда. Используем стандартный тест на стационарность


(КПСС), или единичные корни. нулевая гипотеза - данные стационарны. p<0.005 - гипотезу
отвергаем, говорим, что данные нестационарны.

Используем один из способов избавления от нестационарности - берем первую разность,


находим новый ряд.

global_economy %>% filter(Code == "NLD") %>% mutate(diff_caf = difference(Growth))


%>% features(diff_caf, unitroot_kpss)
По результатам теста, нулевую гипотезу подтверждаем – ряд стационарен.

3. Провести диагностику получившегося стационарного ряда по графикам


автокорреляционной и частной автокорреляционной функций. Сделать предположение о
составе и порядке модели ARIMA.

Построим графики ACF и PACF для первой разности ряда при помощи команды:

global_economy %>% filter(Code == "NLD") %>% gg_tsdisplay(difference(Growth),


plot_type='partial')

Диагностический график для разностного ряда - acf слабо выходят за границы. На pacf
статистически значимы первые 2 пика по графику - (коэффициенты отрицательные)
авторегрессия 2-го порядка AR(2). Для acf только один пик выходит за границы - скорее
всего, это модель скользящего среднего первого порядка.

4. Оценить две-три предполагаемые модели ARIMA и выбрать из них лучшую.

Проверим, какой порядок разности (AR) нужно взять. Функция сама вычислит, сколько раз
нужно взять первую разность, чтобы прийти к стационарности. Код:

global_economy %>% filter(Code == "NLD") %>% features(Growth, unitroot_ndiffs)

Country ndiffs
<fct> <int>
1 Netherlands 1
Таким образом, требуемый порядок разности - n=1

Запустим пробную спецификацию модели – ARIMA(2,1,0) следующей командой:


nld_fit1 <- global_economy %>% filter(Code == "NLD") %>% model(arima210 =
ARIMA(Growth ~ pdq(2,1,0)))

Оценим коэффициенты модели командой report(nld_fit1). Она показывает значения


коэффициентов, их стандартные ошибки, значение функции максимального
правдоподобия, а также информационных критериев Акаике и Шварца.

Уравнение модели выглядит следующим образом: y1=-0.3777y(t-1)-0.3139y(t-2)+const.


Также результаты модели можно вывести при помощи команды glance(nld_fit1).

Добавим к модели компонент МА(1) и сравним их качество по признаку – значение


информационного критерия. Лучше будет та модель, у которой он меньше.

nld_fit1_1 <- global_economy %>% filter(Code == "NLD") %>% model(arima211 =


ARIMA(Growth ~ pdq(2,1,1)))

Выведем значения коэффициентов и информационных критериев при помощи команды


командой report(nld_fit1_1).

По данному критерию новая модификация модели является существенно лучше.

5. В процессе выполнения п. 4 провести диагностику остатков и тесты на наличие


автокорреляции в остатках.
Пост-диагностика модели представляет из себя диагностику остатков. Сначала графически,
а после по результатам формального теста. Построим график с единичными корнями
командой gg_arma(nld_fit1):

Видим два сопряженных корня характеристического многочлена в границах единичной


окружности. Построим acf и график остатков, используя команду gg_tsresiduals(nld_fit1):

Наша модель приемлема, если в остатках нет автокорреляции. В идеале, остатки должны
быть белым шумом. Все пики на графике acf находятся в пределах интервала - значит, в
остатках нет автокорреляции. Однако график распределения остатков отличается от
нормального.

Проведем формальный тест Льюнга-Бокса. Если p-value - большое, значит остатки - это
белый шум. Команда:

augment(nld_fit1) %>% features(.innov, ljung_box, lag = 10, dof = 3)

Результат исполнения:
Вывод: Пост-диагностика показала, что модель удовлетворительна – высокий уровень p-
value.

6. Подобрать модель ARIMA с помощью функции автоматического поиска. Сравнить


полученные модели в п.п. 6 и 4.

Осуществим автоматический поиск спецификации модели. Команда:

nld_fit3 <- global_economy %>% filter(Code == "NLD") %>% model(auto = ARIMA(Growth))

Получилась модель (1, 1, 1)

Выведем коэффициенты и значения информационных критериев. Команда: report(nld_fit3)

Вывод после исполнения:

По сравнению с подобранной самостоятельно, значения информационных критериев ниже,


значит, новая модель, подобранная автоматически, лучше.

7. Сделать прогноз и кросс-валидацию для моделей из пп. 4 и 6, используя в качестве


тестового множества период с 2011 по 2017 гг. Сравнить результаты.

Разбиваем выборку на две части - обучающую и тестовую (меньшую по размеру, после 2010
года).

training <- global_economy %>% filter(Code == "NLD") %>% filter(Year <= 2010)

Аналогично отделяем тестовый набор данных:

test <- global_economy %>% filter(Code == "NLD") %>% filter(Year > 2010)
Сравниваем прогноз с тем, что реализовано на самом деле. Команда:

nld_fit2 <- training %>% model(arima210 = ARIMA(Growth ~ pdq(2,1,0)))

Выведем коэффициенты и значения информационных критериев:

Построим модель на двух выборках и для (1,1,1). Команда:

nld_fit2_n <- training %>% model(arima111 = ARIMA(Growth ~ pdq(1,1,1)))

Вывод основной информации о модели:

У модели с (1,1,1) ниже значения всех информационных критериев. Оценим прогнозную


силу моделей при помощи команд:

nld_fit2 %>% refit(test) %>% accuracy() и nld_fit2_n%>% refit(test) %>% accuracy()

Вывод для (2,1,0):

Вывод для (1,1,1):

Как мы видим, у MAPE - расхождения между прогнозом и реализацией – имеется сильное


расхождение. Проблема возникает, если yi близок к 0, что актуально для показателя
Growth. Построив схожую модель для Exports, видим, что MAPE<5%
nld_fit5 <- training %>% model(arima211 = ARIMA(Exports ~ pdq(2,1,1)))

nld_fit5%>% refit(test) %>% accuracy()

График прогноза для модели (например, для (2,1,0)) можно построить при помощи
следующей команды:

nld_fit1 %>% forecast(h=5) %>% autoplot(global_economy)

Прогнозирование построено с горизонтом пяти лет. На графике присутствует индикация


доверительного интервала для прогноза

8. Найти коэффициент Хёрста.

Установим дополнительные пакеты, необходимые на следующих шагах:

install.packages('arfima')

install.packages('fracdiff')

В связи с другой структурой данных в этом пакете, заново отделим часть от дататфрейма,
необходимую нам для анализа, а также удалим из нее все NA:

df=global_economy[ , c("Code", "Growth")]

NLD_part=df[df$Code == "NLD", ]

avector <- as.vector(NLD_part['Growth'])

avector=na.omit(avector)
avector<-ts(avector,start=c(1961,1),frequency=1)

view(avector)

Далее рассчитаем коэффициент Хёрста для исходного ряда:

coef_hurst(avector)

Значение (0.8621541) показывает, что ряд персистентный - ряду присуща трендовость.

Возьмем первые разности для нашего ряда - v=diff(avector)

Для ряда разностей также рассчитаем коэффициент Хёрста - coef_hurst(v). Значение


(0.5000458) показывает, что ряд стохастичный – то есть, белый шум.

9. Оценить модель ARFIMA, найти порядок дробной интегрированности d.

Построим модель ARFIMA для исходного ряда:

Model = arfima::arfima(avector, order=c(0,0,0),fixed=list(phi=NA,theta=NA,frac=NA))

Выведем основную информацию о модели:

summary(Model)

Результат исполнения:

d.f - имеет высокий уровень значимости. Теперь построим модель ARFIMA для разностного
ряда:

Model1 = arfima::arfima(v, order=c(0,0,0),fixed=list(phi=NA,theta=NA,frac=NA))


Выведем основную информацию о модели командой:

summary(Model1). Результат исполнения:

Вам также может понравиться