Ежедневный анализ временных рядов


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 <- арима (мыц, порядок = c (p, d, q)

***** Обновлены результаты Auto.Arima ******

Когда я изменить частоту данных 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 он выдает false. Достаточно ли этого, чтобы сделать вывод об отсутствии годовой сезонности?

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)дает?
С. Коласса - Восстановить Монику

Это дает число [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()будет делать с вашими данными. Он может выбрать одну из сезонностей или вообще не учитывать их.


РЕДАКТИРОВАТЬ, чтобы ответить на дополнительные вопросы из комментария:

  1. Как я могу проверить, имеют ли данные годовую сезонность или нет? Могу ли я создать еще одну серию общего количества событий в месяц и использовать ее ACF, чтобы решить это?

Расчет модели по ежемесячным данным может быть возможным. Тогда вы могли бы, например, сравнить AIC между моделями с сезонностью и без нее.

Однако я бы предпочел использовать несогласованную выборку для оценки моделей прогнозирования. Протяните последние 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. Как я могу проверить, имеют ли данные годовую сезонность или нет? Могу ли я создать еще одну серию общего количества событий в месяц и использовать ее для решения этой проблемы? 2. Таким образом, сезонные модели ARIMA обычно не могут обрабатывать несколько сезонностей? Это свойство самой модели или просто так написаны функции в R?
statBeginner

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

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

2
@ Forecaster: круто, спасибо! Кажется, что они делают двойное различие в уравнении 3.1. Я немного обеспокоен потерей большого количества данных таким образом. К сожалению, они не сравнивают свои результаты с простым тестом, например требованиями прошлой недели. Что мне нравится, так это то, как они также исследуют прогнозные комбинации между DSARIMA и аналогичной tbatsмоделью.
С. Коласса - Восстановить Монику

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.