Щоденний аналіз часових рядів


25

Я намагаюся зробити аналіз часових рядів і я новачок у цій галузі. Я щодня перераховую подію 2006–2009 рр. І хочу приєднати до неї модель часових рядів. Ось прогрес, який я досяг:

timeSeriesObj = ts(x,start=c(2006,1,1),frequency=365.25)
plot.ts(timeSeriesObj)

Отриманий сюжет я отримую:

Сюжет часового ряду

Щоб перевірити, чи є сезонність і тенденція в даних, чи ні, я виконую кроки, згадані в цій публікації :

ets(x)
fit <- tbats(x)
seasonal <- !is.null(fit$seasonal)
seasonal

і в блозі Роб Дж Хандмана :

library(fma)
fit1 <- ets(x)
fit2 <- ets(x,model="ANN")

deviance <- 2*c(logLik(fit1) - logLik(fit2))
df <- attributes(logLik(fit1))$df - attributes(logLik(fit2))$df 
#P value
1-pchisq(deviance,df)

Обидва випадки свідчать про відсутність сезонності.

Коли я будую схему ACF & PACF серії, ось що я отримую:

ACF PACF

Мої запитання:

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

  2. Я не знаю, як діяти, як тільки у мене з'являться сюжети ACF та PACF.

  3. Чи можна просто використовувати функцію auto.arima?

    fit <- arima (myts, order = c (p, d, q)

***** Оновлено результати Авто.Аріма ******

Коли я змінюю частоту даних на 7 відповідно до коментарів Роб Хайндмана тут , auto.arima вибирає сезонну модель ARIMA та отримує результати:

Series: timeSeriesObj 
ARIMA(1,1,2)(1,0,1)[7]                    

Coefficients:
       ar1      ma1     ma2    sar1     sma1
      0.89  -1.7877  0.7892  0.9870  -0.9278
s.e.   NaN      NaN     NaN  0.0061   0.0162

sigma^2 estimated as 21.72:  log likelihood=-4319.23
AIC=8650.46   AICc=8650.52   BIC=8682.18 

****** Оновлено перевірку сезонності ******

Коли я перевіряю сезонність із частотою 7, він виводить True, але із сезонністю 365.25, він видає помилковий. Чи достатньо цього, щоб укласти відсутність щорічної сезонності?

timeSeriesObj = ts(x,start=c(2006,1,1),frequency=7)
fit <- tbats(timeSeriesObj)
seasonal <- !is.null(fit$seasonal)
seasonal

повертає:

True

поки

timeSeriesObj = ts(x,start=c(2006,1,1),frequency=365.25)
fit <- tbats(timeSeriesObj)
seasonal <- !is.null(fit$seasonal)
seasonal

повертає:

False

Який вихід str(x)дає результат?
S. Kolassa - Відновіть Моніку

Це дає число [1: 1460] 17 12 12 17 13 14 14 5 12 21 ...
statBeginner

Чи можете ви опублікувати дані?
синоптик

На жаль, не можу.
statBeginner

3
Гаразд, я б покладався на візуальну перевірку та знання домену на додаток до статистичних тестів для виявлення сезонності. На ваше запитання про те, чи може arima справлятися з декількома сезонністю? Звичайно, ARIMA буде працювати з будь-яким типом сезонності, Rпростий не має можливості впоратися з цим. Я б шукав комерційних рішень, якщо для товару, який ви намагаєтеся прогнозувати, є велика вартість запасів / виготовлення. Rмає такі серйозні обмеження для завдання прогнозування, як ваше. Подивіться на питання щодо щоденного прогнозування ще де на цьому веб-сайті.
синоптик

Відповіді:


25

Ваш ACF та PACF вказують на те, що у вас є принаймні сезонність сезону, що проявляється піками в відставаннях 7, 14, 21 тощо.

Ви також можете мати щорічну сезонність, хоча це не очевидно з вашого часового ряду.

Ваша найкраща ставка, враховуючи потенційно багато сезонність, може бути tbatsмоделлю, яка чітко моделює кілька типів сезонності. Завантажте forecastпакет:

library(forecast)

Вихідні дані str(x)вказують на те, що xще не містять інформації про потенційну наявність декількох сезонностей. Подивіться ?tbatsта порівняйте вихід str(taylor). Призначте сезонність:

x.msts <- msts(x,seasonal.periods=c(7,365.25))

Тепер ви можете підігнати tbatsмодель. (Будьте терплячі, це може зайняти деякий час.)

model <- tbats(x.msts)

Нарешті, ви можете прогнозувати та скласти графік:

plot(forecast(model,h=100))

Не слід використовувати arima()або auto.arima(), оскільки вони можуть впоратися лише з одним типом сезонності: або щотижня, або щороку. Не запитуйте мене, що auto.arima()робити з вашими даними. Він може вибрати одну з сезонностей або взагалі їх знехтувати.


EDIT, щоб відповісти на додаткові запитання з коментаря:

  1. Як я можу перевірити, чи мають дані сезонні сезонність чи ні? Чи можу я створити ще одну серію загальної кількості подій на місяць та використати її ACF для вирішення цього питання?

Розрахунок моделі на щомісячних даних може бути можливим. Тоді ви могли б, наприклад, порівнювати АПК між моделями з і без сезонності.

Однак я б скоріше використала зразок проведення, щоб оцінити моделі прогнозування. Протримайте останні 100 точок даних. Встановити модель з щорічної і щотижневої сезонністю до іншої частини даних (як вище), потім встанови один тільки з щотижневої сезонністю, наприклад, використовуючи auto.arima()на tsз frequency=7. Прогнозуйте за допомогою обох моделей на період витримки. Перевірте, яка з них має меншу помилку, використовуючи MAE, MSE або те, що є найбільш релевантним для вашої функції втрат. Якщо між помилками є невелика різниця, перейдіть до більш простої моделі; в іншому випадку використовуйте той із меншою помилкою.

Доказ пудингу є в їжі, а доказ моделі часових рядів - в прогнозуванні.

Щоб покращити питання, не використовуйте єдиний зразок затримки (що може ввести в оману, враховуючи складність в кінці вашої серії), а використовуйте прогнозні джерела походження, що також відоме як "перехресне підтвердження часових рядів" . (Я дуже рекомендую весь безкоштовний онлайн-підручник з прогнозування .

  1. Тож сезонні моделі ARIMA зазвичай не можуть впоратися з різними сезонами? Це властивість самої моделі чи це просто спосіб запису функцій в R?

Стандартні моделі ARIMA вирішують сезонність, визначаючи сезонність. Для сезонних щомісячних даних ви б не моделювали необроблені часові ряди, але часові ряди відмінностей між березнем 2015 року та березнем 2014 року, з лютого 2015 року по лютий 2014 року тощо. (Щоб отримати прогнози за початковою шкалою, вам, звичайно, доведеться повторити свою різницю.)

Не існує одразу очевидного способу поширити цю ідею на кілька сезонностей.

Звичайно, ви можете зробити щось, використовуючи ARIMAX, наприклад, включивши щомісячні манекени для моделювання щорічної сезонності, а потім моделюйте залишки, використовуючи щотижневу ARIMA. Якщо ви хочете зробити це в R, використовуйте ts(x,frequency=7), створіть матрицю місячних манекенів і введіть їх у xregпараметр auto.arima().

Я не пригадую жодної публікації, яка б спеціально розширювала ARIMA на кілька сезонностей, хоча я впевнений, що хтось щось зробив у попередньому моєму абзаці.


Ось декілька питань, на які я поклав свою відповідь: 1. Як я можу перевірити, чи є ці дані щорічної сезонності чи ні? Чи можу я створити ще одну серію загальної кількості подій на місяць і використати її ACF для вирішення цього питання? 2. Тож сезонні моделі ARIMA зазвичай не можуть впоратися з різними сезонами? Це властивість самої моделі чи це просто спосіб запису функцій в R?
statBeginner

Оновлено допис з результатами Auto.Arima з тижневою сезонністю
statBeginner

1
@StephanKolassa, я знайшов цю статтю від AT&T деякий час назад, яка використовує кілька сезонних ARIMA. Модель, така як ця у статті, неможлива R, оскільки Rне має можливості працювати з багатосезонною ARIMA.
синоптик

2
@forecaster: класно, дякую! Схоже, вони роблять подвійне розходження в рівнянні 3.1. Мене якось непокоїть втрата великої кількості даних таким чином. На жаль, вони не порівнюють свої результати з простим орієнтиром, наприклад, вимогами минулого тижня. Мені подобається, як вони також досліджують комбінації прогнозів між DSARIMA та tbatsподібною моделлю.
S. Kolassa - Відновити Моніку

3
@StephanKolassa Я погоджуюся, я великий прихильник використання наївного прогнозу в якості еталону, який підтримується Армстронгом в Принципах прогнозування, і додавати складності лише, якщо це підвищує точність. Я опинився в топ-2 перцентилі в кількох змаганнях з кагл, використовуючи наївні методи у своїх ансамблях.
синоптик

4

Найкращий спосіб розкласти сезонні дані за допомогою існуючих пакетів R - це ceemdan () в Rlibeemd. Ця методика витягує сезонність декількох періодів. Значення за замовчуванням працюють добре. Він використовує перетворення Гільберта-Хуана замість перетворення Фур'є. Перетворення Фур'є має серйозний недолік тим, що він може обробляти стаціонарні лінійні дані лише тоді, коли більшість цікавих серій не мають жодного. Наприклад, випадкова хода y_t = y_ {t-1} + e_t - найпростіша випадкова хода і часто зустрічається. Інші методи фіксують амплітуду сезонних змін, коли вона часто змінюється на практиці.


1
Будь ласка, перегляньте основний підручник і довідник MathJax, щоб отримати допомогу щодо введення математики у відповіді. Будь ласка, запропонуйте також якесь обґрунтування твердження " найкращого " (або подумайте про зміну претензії) - воно повинно бути принаймні таким же хорошим, як і будь-який інший варіант, а не лише більшість із них.
Glen_b -Встановіть Моніку

2
Можливо, варто згадати, що цей пакет діє на CRAN
Glen_b -Встановити Моніку

3

Питання, які ви ставите, розглядалися в R Прогнозуванні часових рядів: Питання щодо мого результату . Будь ласка, уважно подивіться на мою детальну відповідь та всі коментарі до обговорення, включаючи коментарі до початкового питання, оскільки я вважаю, що вони стосуються вашої проблеми. Ви насправді можете взяти дані, які були надані на посаді, і використовувати їх як навчальний момент для себе. Використовуйте всю дискусію як буквар для того, що вам слід зробити.


1
Дуже дякую! Я буду використовувати дані з цієї публікації, щоб випробувати речі.
statBeginner
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.