Auto.arima із щоденними даними: як зафіксувати сезонність / періодичність?


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))

Я можу отримати кращі результати. Чи є в технічній специфікації команда / 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 року (коли реєструється послідовне збільшення продажів). На жаль, я взагалі не маю досвіду моделювання часових серій, адже я намагаюся такий підхід, щоб знайти альтернативне рішення для інших параметричних електронних непараметричних моделей, які я намагався пристосувати до цих проблемних даних. У мене також багато залежних числових змінних, але вони показали низьку потужність у поясненні змінної відповіді: безсумнівно, найскладнішою частиною моделі є часова складова. Більше того, побудова фіктивних змінних для відображення місяців та буднів не виявилася надійним рішенням.

Відповіді:


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 (). Зараз найкращою моделлю, обраною для серіалу Salests, є ARIMA (1,0,0) з нульовим середнім. Чи слід очікувати конкретизації частини сезону для найкращої моделі, що повертається, я маю на увазі значення P, D, Q або принаймні для D?
Джулія

2
Поки ваші дані мають частоту, відмінну від 1, будуть враховані сезонні моделі ARIMA. Якщо повертається несезонна модель, то або сезонність дуже слабка, або дані не знаходяться в об'єкті з частотою> 1.
Роб Гіндман

15

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


У цьому випадку (IrishStat), чи не буде це змішана техніка моделювання замість ARIMA. Лаги не приймаються ніде в ARIMA, за винятком тесту Box Jlung. Auto.arima (нещодавно) виправляє все, включаючи масштабування даних, коливання сезонності (тому я вважаю найкращі параметри p, d, q).
wackyanil

Він називається функцією передачі і відображає синергетичний підхід, див. Autobox.com/pdfs/capable.pd, починаючи зі слайда 42. Auto.arima може працювати в простих випадках, але на мою думку недостатньо загальний. Якщо у вас є набір даних, поставте нове запитання та включіть його.
IrishStat

@IrishStat Ви мали на увазі ARIMA з втручанням? день тижня є фіктивними змінними? і подібні фіктивні змінні для свят?
Ентузіаст

Так .. такий мій підхід до щоденних даних
IrishStat

0

Щоб визначити порядок сезонності в моїх ц (щоденні дані протягом трьох років), я використовував цей код у Matlab:

s = 0; min = 1e + 07; n = довжина (x); для i = 1: 400 diff = x (i + 1: n) -x (1: ni); s (i) = сума (abs (diff)); якщо (s (i)

Це дає мені 365, що логічно.


1
Ласкаво просимо на сайт. Мені незрозуміло, як це відповідає на початкове запитання, і мені незрозуміло, що робить опублікований вами код лише від того, як дивитись на нього. Може, ви могли трохи розширити відповідь?
ейнар

1
Як ваше рішення має справу з фіксованими ефектами дня тижня, фіксованими ефектами дня місяця, наслідками тижня місяця, наслідками дня місяця, наслідками відпустки та затримками свят , понеділок - після свята п'ятниці, п’ятниця перед понеділковим святом, щомісячні ефекти, щотижневі ефекти, зміни ефектів вихідного тижня з часом, імпульси, зміни рівня / кроку?
IrishStat

код Matlab s = 0; min = 1e + 07; n = довжина (x); для i = 1: 400 diff = x (i + 1: n) -x (1: ni); s (i) = сума (abs (diff)); if (s (i) <min) min = s (i); i end end
nkabouche
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.