Uploaded by nastya.lisovaya.98

Временные ряды Лисовая

advertisement
Домашнее экзаменационное задание
по курсу "Эконометрика временных рядов" - 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 и выбрать из них лучшую.
Проверим, какой порядок разности нужно взять. Функция сама вычислит, сколько раз
нужно взять первую разность, чтобы прийти к стационарности.
global_economy %>% filter(Code == "NLD") %>% features(Growth, unitroot_ndiffs)
Country
<fct>
ndiffs
<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)
Результат исполнения:
Вывод: Пост-диагностика показала, что модель удовлетворительна.
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, что актуально для показателя.
Построив схожую модель для Exports, видим, что MAPE<5%
nld_fit5 <- training %>% model(arima211 = ARIMA(Exports ~ pdq(2,1,1)))
nld_fit5%>% refit(test) %>% accuracy()
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). Результат исполнения:
Download