Домашнее экзаменационное задание по курсу "Эконометрика временных рядов" - 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). Результат исполнения: