Авто.арима с ежедневными данными: как уловить сезонность / периодичность?

21

Я устанавливаю модель ARIMA на ежедневные временные ряды. Данные собираются ежедневно с 02-01-2010 по 30-07-2011 и касаются продаж газет. Поскольку можно найти недельный график продаж (среднесуточное количество проданных копий обычно одинаково с понедельника по пятницу, а затем увеличивается в субботу и воскресенье), я пытаюсь уловить эту «сезонность». Учитывая данные о продажах «данные», я создаю временной ряд следующим образом:

salests<-ts(data,start=c(2010,1),frequency=365)

а затем я использую функцию auto.arima (.), чтобы выбрать лучшую модель ARIMA по критерию AIC. Результатом всегда является несезонная модель ARIMA, но если я попробую какую-нибудь модель SARIMA со следующим синтаксисом в качестве примера:

sarima1<-arima(salests, order = c(2,1,2), seasonal = list(order = c(1, 0, 1), period = 7))

Я могу получить лучшие результаты. Есть ли что-то не так в спецификации ts command / arima? Недельный график очень сильный, поэтому я не ожидал бы так много трудностей при его захвате. Любая помощь будет очень полезна. Спасибо, Джулия Деппиери

Обновить:

Я уже изменил некоторые аргументы. Точнее, процедура выбирает ARIMA (4,1,3) как лучшую модель, когда я установил D=7, но AIC и другие, также хорошо подходящие по показателям и прогнозам соответствия), вообще не улучшаются. Я предполагаю, что есть некоторые ошибки из-за путаницы между сезонностью и периодичностью ..?!

Вызов Auto.arima используется и получен результат:

modArima<-auto.arima(salests,D=7,max.P = 5, max.Q = 5)



 ARIMA(2,1,2) with drift         : 1e+20
 ARIMA(0,1,0) with drift         : 5265.543
 ARIMA(1,1,0) with drift         : 5182.772
 ARIMA(0,1,1) with drift         : 1e+20
 ARIMA(2,1,0) with drift         : 5137.279
 ARIMA(2,1,1) with drift         : 1e+20
 ARIMA(3,1,1) with drift         : 1e+20
 ARIMA(2,1,0)                    : 5135.382
 ARIMA(1,1,0)                    : 5180.817
 ARIMA(3,1,0)                    : 5117.714
 ARIMA(3,1,1)                    : 1e+20
 ARIMA(4,1,1)                    : 5045.236
 ARIMA(4,1,1) with drift         : 5040.53
 ARIMA(5,1,1) with drift         : 1e+20
 ARIMA(4,1,0) with drift         : 5112.614
 ARIMA(4,1,2) with drift         : 4953.417
 ARIMA(5,1,3) with drift         : 1e+20
 ARIMA(4,1,2)                    : 4960.516
 ARIMA(3,1,2) with drift         : 1e+20
 ARIMA(5,1,2) with drift         : 1e+20
 ARIMA(4,1,3) with drift         : 4868.669
 ARIMA(5,1,4) with drift         : 1e+20
 ARIMA(4,1,3)                    : 4870.92
 ARIMA(3,1,3) with drift         : 1e+20
 ARIMA(4,1,4) with drift         : 4874.095

 Best model: ARIMA(4,1,3) with drift        

Так что я предполагаю, что функция arima должна использоваться как:

bestOrder <- cbind(modArima$arma[1],modArima$arma[5],modArima$arma[2])
sarima1<-arima(salests, order = c(4,1,3))

без сезонных компонентов и параметров периода. Данные и аналитический анализ показывают, что один и тот же недельный график может быть приближенно рассмотрен для каждой недели, за исключением августа 2010 года (когда зарегистрирован последовательный рост продаж). К сожалению, у меня нет опыта в моделировании временных рядов, на самом деле я пробую этот подход, чтобы найти альтернативное решение для других параметрических и непараметрических моделей, которые я пытался приспособить к этим проблемным данным. У меня также есть много зависимых числовых переменных, но они показали низкую мощность при объяснении переменной отклика: несомненно, самая трудная часть для моделирования - это временная составляющая. Более того, построение фиктивных переменных для представления месяцев и дней недели оказалось не надежным решением.

Giulia
источник

Ответы:

28

Если есть еженедельная сезонность, установите сезонный период равным 7.

salests <- ts(data,start=2010,frequency=7) 
modArima <- auto.arima(salests)

Обратите внимание, что выбор сезонных различий был не очень хорош auto.arima()до самого недавнего времени. Если вы используете v2.xx forecastпакета, установите D=1в вызове auto.arima()принудительное использование сезонных различий. Если вы используете v3.xx forecastпакета, автоматический выбор Dработает намного лучше (используя тест OCSB вместо теста CH).

Не пытайтесь сравнивать AIC для моделей с разными уровнями различия. Они не сопоставимы напрямую. Вы можете только надежно сравнить AIC с моделями, имеющими одинаковые порядки дифференцирования.

Вам не нужно переоснастить модель после звонка auto.arima(). Он вернет объект Arima, как если бы вы вызывали arima()с выбранным порядком модели.

Роб Хиндман
источник
спасибо за указание на мою глупую ошибку. Я отзову свой ответ.
mpiktas
1
Спасибо вам за ваши очень полезные предложения. Я использую версию пакета прогноза 2.19, поэтому я следовал вашему совету и установил параметр D равным 1 в вызове auto.arima (). Теперь лучшей моделью, выбранной для серии продаж, является ARIMA (1,0,0) с ненулевым средним. Стоит ли ожидать спецификации части сезонности для лучшей возвращенной модели, я имею в виду значения P, D, Q или хотя бы для D?
Джулия
2
Пока ваши данные имеют частоту, отличную от 1, будут учитываться сезонные модели ARIMA. Если возвращается несезонная модель, то либо сезонность очень слабая, либо данные не находятся в объекте ts с частотой> 1.
Роб Хиндман
15

Проблема с подгонкой сезонного ARIMA к ежедневным данным заключается в том, что «сезонный компонент» может работать только в выходные или, может быть, только в будние дни, поэтому в целом существует незначительный «сезонный компонент». Теперь вам нужно дополнить ваш набор данных 6-ю манекенами, представляющими дни недели, и, возможно, месячными показателями, представляющими годовые эффекты. Теперь рассмотрите возможность включения событий, таких как праздники, и включите в них любые опережающие, одновременные или запаздывающие эффекты вокруг этих известных переменных. Нет, в данных могут быть необычные значения (импульсы), сдвиги уровней или тренды местного времени. Кроме того, эффекты дня недели могли меняться с течением времени, например, не было эффекта субботы в течение первых 20 недель, а эффекта субботы в течение последних 50 недель.

IrishStat
источник
В этом случае (IrishStat), это не будет смешанная техника моделирования вместо ARIMA. Лаги не принимаются нигде в ARIMA, кроме Box Jlung Test. Auto.arima (недавно) исправляет все, включая масштабирование данных, сезонные колебания (вот почему я нахожу лучшие параметры p, d, q).
wackyanil
Она называется передаточной функцией и отражает синергетический подход, см. Autobox.com/pdfs/capable.pd, начиная со слайда 42. Auto.arima может работать для простых случаев, но, на мой взгляд, не является достаточно общим. Если вы имеете в виду данные, задайте новый вопрос и включите его.
IrishStat
@IrishStat Вы имели в виду ARIMA с вмешательством? день недели, являющийся фиктивными переменными? и подобные фиктивные переменные для праздников?
Энтузиаст
Да .. это был бы мой подход к ежедневным данным
IrishStat
0

Чтобы определить порядок сезонности в моей TS (ежедневные данные за 3 года), я использовал этот код в Matlab:

с = 0; мин = 1e + 07; п = длина (х); для i = 1: 400 diff = x (i + 1: n) -x (1: ni); с (я) = сумма (абс (разн)); если (с (я)

Это дает мне 365, что логично.

nkabouche
источник
1
Добро пожаловать на сайт. Мне не ясно, как это отвечает на исходный вопрос, и мне не ясно, что делает код, который вы разместили, просто глядя на него. Может быть, вы могли бы немного расширить ответ?
Эйнар
1
Как ваше решение справляется с фиксированными эффектами дня недели, фиксированными эффектами дня месяца, эффектами недели месяца, эффектами дня месяца, опережающими и запаздывающими эффектами праздников , понедельник после пятницы, пятница перед праздником понедельника, ежемесячные эффекты, еженедельные эффекты, изменения выходных дней во времени, импульсы, сдвиги уровня / шага?
IrishStat
код Matlab s = 0; min = 1e + 07; n = длина (x); для i = 1: 400 diff = x (i + 1: n) -x (1: ni); с (я) = сумма (абс (разн)); if (s (i) <min) min = s (i); i end end
nkabouche