Отсутствующие значения - модель Арима

У меня есть ежедневные временные ряды о продажах продукта, мои серии начинаются с 01.01.2016 по 31.08.2017.

Учитывая, что это шестидневная неделя (моя неделя начинается в понедельник и заканчивается в субботу), данных по воскресеньям нет, я понимаю, что перед запуском модели Arima мне нужно сначала заполнить недостающие значения. Здесь мне нужна помощь: я читал, что могу заполнить отсутствующие значения na.approx или NA, но я не знаю, как это сделать.

Вы могли увидеть мою серию здесь:

https://drive.google.com/file/d/0BzIf8XvzKOGWSm1ucUdYUVhfVGs/view?usp=sharing

Как видите, данных по воскресеньям нет. Мне нужно знать, как заполнить недостающие значения, чтобы запустить модель Arima и уметь прогнозировать, что осталось от 2017 года.


person Jose R.    schedule 29.09.2017    source источник
comment
Посмотрите, подходят ли вам здесь решения для вас?   -  person Z.Lin    schedule 30.09.2017
comment
Итак, вы по сути хотите удалить все воскресенья из календаря и предположить, что понедельник следует непосредственно за субботой? Возможно, вы можете просто пронумеровать свои дни так: 1 = первый понедельник, 7 = следующий понедельник и так далее? В качестве примечания: я немного скептически отношусь к тому, что чистый ARIMA может хорошо описать недельный цикл.   -  person Ott Toomet    schedule 02.10.2017
comment
Привет, спасибо за комментарий. Я имел в виду, что моя серия имеет нулевые значения каждое воскресенье, потому что речь идет о продажах продукта, а этот магазин не работает по воскресеньям, поэтому ожидаемое значение для всех воскресений в будущем равно нулю. У меня есть данные с понедельника по субботу, но я действительно не понимаю, как запускать модель арима, учитывая, что у меня есть эти нулевые значения по воскресеньям.   -  person Jose R.    schedule 02.10.2017
comment
Мне мой ответ кажется вам полезным?   -  person acylam    schedule 04.10.2017
comment
Да !! Большое вам спасибо за ваш ответ !! .. Это было именно то, что мне нужно !!! Большое спасибо !!!   -  person Jose R.    schedule 04.10.2017
comment
Привет ! Спасибо за помощь !. Прошу прощения, что снова побеспокоился, но когда я запускаю эту часть кода: df $ Date = mdy (df $ Date), я продолжаю получать эту ошибку: объект типа «закрытие» не является подмножеством. Подскажите, пожалуйста, что я делаю не так?   -  person Jose R.    schedule 05.10.2017
comment
Вы не уведомили меня своим комментарием (@useR), поэтому я его тогда не видел. Но вполне вероятно, что вы запустили какой-то код, который использует то же имя, что и df для другого объекта. Попробуйте очистить рабочее пространство и повторно запустить только свои данные и мой код. Вы также можете протестировать с test = mdy(df$Date), чтобы не заменять df$Date каждый раз, когда вы запускаете код.   -  person acylam    schedule 13.11.2017


Ответы (2)


Вот три способа сделать это:

library(lubridate)
library(xts)
library(dplyr)
library(forecast)

df$Date = mdy(df$Date)

Удаление воскресенья:

ts_no_sunday = df %>%
  filter(wday(df$Date) != 1) %>%
  {xts(.$Units, .$Date)}

plot(ts_no_sunday)

no_sunday_arima = auto.arima(ts_no_sunday)

plot(forecast(no_sunday_arima, h = 10))

введите здесь описание изображения  введите описание изображения здесь

Заменить воскресенья на НП:

ts_sunday = df %>%
  mutate(Units = replace(Units, which(wday(df$Date) == 1), NA)) %>%
  {xts(.$Units, .$Date)}

plot(ts_sunday)

sunday_arima = auto.arima(ts_sunday)

plot(forecast(sunday_arima, h = 10))

введите описание изображения здесь  введите описание изображения здесь

Интерполировать воскресенье:

ts_interp = df %>%
  mutate(Units = replace(Units, which(wday(df$Date) == 1), NA),
         Units = na.approx(Units)) %>%
  {xts(.$Units, .$Date)}

plot(ts_interp)

interp_arima = auto.arima(ts_interp)

plot(forecast(interp_arima, h = 10))

введите здесь описание изображения  введите описание изображения здесь

Примечания:

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

См. Это обсуждение Как обрабатывать несуществующие или отсутствующие данные? и это на Использование пакета прогнозов R с отсутствующими значениями и / или нерегулярными временными рядами

person acylam    schedule 02.10.2017

В принципе, вы можете использовать комбинацию imputeTS (для заполнения НП) - прогноз (для выполнения прогноза).

Сделать это довольно просто:

library("imputeTS")
library("forecast")
ts_sunday %>% na_kalman() %>% auto.arima() %>% forecast(h=10)

Сделал бы эту работу. Но в этом конкретном случае это было бы плохой идеей. Если данные будут отсутствовать случайно, вы можете рассмотреть это решение. Но это не так - всегда не хватает воскресенья. Некоторые модели временных рядов также могут иметь дело с НА и по-прежнему строить модель (но недостатки почти такие же, как и в предыдущем решении). Как модель должна относиться к воскресеньям, поскольку они никогда не соблюдаются ... Вероятно, лучшее решение (с точки зрения статистики) - это то, что avid_useR описал в другом ответе как полное удаление воскресенья. Если вам не нужны воскресенья - и в любом случае нет значений для воскресенья, просто удалите их. Но обычно это рано или поздно приводит к следующему вопросу… «как относиться к государственным праздникам», которые также часто являются АН. Также всегда помните о своей проблеме - одно решение может подходить для одной ситуации, а для другого это может не иметь смысла.

person Steffen Moritz    schedule 09.10.2019