Прогнозирование часовых временных рядов с ежедневной, еженедельной и годовой периодичностью


12

Основная редакция: Я хотел бы сказать большое спасибо Дэйву и Нику за их ответы. Хорошая новость заключается в том, что у меня получился цикл (принцип заимствован из поста профессора Гиднмана о пакетном прогнозировании). Чтобы объединить невыполненные запросы:

а) Как мне увеличить максимальное число итераций для auto.arima - кажется, что при большом количестве экзогенных переменных auto.arima достигает максимальных итераций перед тем, как сойтись в конечной модели. Пожалуйста, поправьте меня, если я неправильно понимаю это.

б) В одном ответе Ника подчеркивается, что мои прогнозы для часовых интервалов основаны только на этих часовых интервалах и не зависят от событий, произошедших ранее в течение дня. Мои инстинкты, связанные с этими данными, говорят мне, что это не должно часто вызывать серьезную проблему, но я открыт для предложений относительно того, как справиться с этим.

в) Дейв указал, что мне требуется гораздо более сложный подход к определению времени опережения / отставания, связанного с моими переменными предиктора У кого-нибудь есть опыт с программным подходом к этому в R? Я, конечно, ожидаю, что будут ограничения, но я хотел бы продвинуть этот проект настолько далеко, насколько смогу, и я не сомневаюсь, что он должен быть полезен и для других здесь.

d) Новый запрос, но полностью связанный с поставленной задачей - учитывает ли auto.arima регрессоры при выборе заказов?

Я пытаюсь прогнозировать посещения магазина. Мне нужна способность учитывать движущиеся праздники, високосные годы и спорадические события (по сути, выбросы); Исходя из этого, я понимаю, что ARIMAX - моя лучшая ставка, использующая экзогенные переменные, чтобы попытаться смоделировать множественную сезонность, а также вышеупомянутые факторы.

Данные записываются 24 часа с почасовыми интервалами. Это оказывается проблематичным из-за количества нулей в моих данных, особенно во времена дня, когда количество посещений очень низкое, а иногда и вовсе отсутствует, когда магазин только что открылся. Кроме того, часы работы являются относительно неустойчивыми.

Кроме того, вычислительное время огромно при прогнозировании как один полный временной ряд с 3 годами + исторических данных. Я полагал, что это ускорило бы вычисление каждого часа дня в виде отдельных временных рядов, и при тестировании этого в более загруженные часы дня, как представляется, дает более высокую точность, но опять-таки оказывается проблема с ранними / поздними часами, которые не т постоянно получать посещения. Я полагаю, что этот процесс выиграл бы от использования auto.arima, но он не может сойтись в модели до достижения максимального числа итераций (следовательно, с использованием подбора вручную и предложения maxit).

Я попытался обработать «пропущенные» данные, создав экзогенную переменную для посещений = 0. Опять же, это прекрасно работает для более загруженного времени суток, когда нет единственных посещений, когда магазин закрыт в течение дня; в этих случаях экзогенная переменная успешно, кажется, справляется с этим для прогнозирования вперед и не включает в себя влияние дня, который был ранее закрыт. Однако я не уверен, как использовать этот принцип в отношении прогнозирования более тихих часов, когда магазин открыт, но не всегда получает посещения.

С помощью сообщения профессора Хиндмана о пакетном прогнозировании в R я пытаюсь создать цикл для прогнозирования 24-й серии, но, похоже, он не хочет прогнозировать на 13:00 и не может понять, почему. Я получаю «Ошибка в optim (init [mask], armafn, method = optim.method, hessian = TRUE,: конечное разностное значение без конечных значений [1]», но все серии имеют одинаковую длину, и я, по сути, использую та же матрица, я не понимаю, почему это происходит. Это означает, что матрица не имеет полного ранга, нет? Как я могу избежать этого в этом подходе?

https://www.dropbox.com/s/26ov3xp4ayig4ws/Data.zip

date()

#Read input files
INPUT <- read.csv("Input.csv")
XREGFDATA <- read.csv("xreg.csv")

#Subset time series data from the input file
TS <- ts(INPUT[,2:25], f=7)


fcast <- matrix(0, nrow=nrow(XREGFDATA),ncol=ncol(TS))

#Create matrix of exogenous variables for forecasting.
xregf <- (cbind(Weekday=model.matrix(~as.factor(XREGFDATA$WEEKDAY)),
                    Month=model.matrix(~as.factor(XREGFDATA$MONTH)),
                Week=model.matrix(~as.factor(XREGFDATA$WEEK)),
                    Nodata=XREGFDATA$NoData,
                NewYearsDay=XREGFDATA$NewYearsDay,
                    GoodFriday=XREGFDATA$GoodFriday,
                EasterWeekend=XREGFDATA$EasterWeekend,
                    EasterMonday=XREGFDATA$EasterMonday,
                MayDay=XREGFDATA$MayDay,
                    SpringBH=XREGFDATA$SpringBH,
                SummerBH=XREGFDATA$SummerBH,
                    Christmas=XREGFDATA$Christmas,
                BoxingDay=XREGFDATA$BoxingDay))
#Remove intercepts
xregf <- xregf[,c(-1,-8,-20)]

NoFcast <- 0

for(i in 1:24) {

  if(max(INPUT[,i+1])>0) {

  #The exogenous variables used to fit are the same for all series except for the
  #'Nodata' variable. This is to handle missing data for each series
   xreg <- (cbind(Weekday=model.matrix(~as.factor(INPUT$WEEKDAY)),
                     Month=model.matrix(~as.factor(INPUT$MONTH)),
                 Week=model.matrix(~as.factor(INPUT$WEEK)),
                     Nodata=ifelse(INPUT[,i+1] < 1,1,0),
                     NewYearsDay=INPUT$NewYearsDay,
                 GoodFriday=INPUT$GoodFriday,
                     EasterWeekend=INPUT$EasterWeekend,
                 EasterMonday=INPUT$EasterMonday,
                     MayDay=INPUT$MayDay,
                 SpringBH=INPUT$SpringBH,
                     SummerBH=INPUT$SummerBH,
                 Christmas=INPUT$Christmas,
                     BoxingDay=INPUT$BoxingDay))
  xreg <- xreg[,c(-1,-8,-20)]

  ARIMAXfit <- Arima(TS[,i], 
                     order=c(0,1,8), seasonal=c(0,1,0),
                     include.drift=TRUE,
                     xreg=xreg,
                     lambda=BoxCox.lambda(TS[,i])
                     ,optim.control = list(maxit=1500), method="ML")  


  fcast[,i] <- forecast(ARIMAXfit, xreg=xregf)$mean

 } else{
  NoFcast <- NoFcast +1
 }
}

#Save the forecasts to .csv
write(t(fcast),file="fcasts.csv",sep=",",ncol=ncol(fcast))


date()

Я был бы полностью признателен за конструктивную критику того, как я поступаю по этому поводу, и любую помощь, чтобы этот скрипт работал. Я знаю, что есть другое доступное программное обеспечение, но я строго ограничен использованием R и / или SPSS здесь ...

Кроме того, я очень новичок в этих форумах - я постарался дать как можно более полное объяснение, продемонстрировать предыдущие исследования, которые я провел, а также привести воспроизводимый пример; Я надеюсь, что этого достаточно, но, пожалуйста, дайте мне знать, если есть что-то еще, что я могу предоставить, чтобы улучшить свой пост.

РЕДАКТИРОВАТЬ: Ник предложил мне использовать дневные итоги в первую очередь. Я должен добавить, что я проверил это, и экзогенные переменные действительно дают прогнозы, которые отражают ежедневную, еженедельную и годовую сезонность. Это было одной из других причин, по которым я думал прогнозировать каждый час как отдельную серию, хотя, как упоминал Ник, мой прогноз на 4 часа дня в тот или иной день не будет зависеть от предыдущих часов дня.

РЕДАКТИРОВАТЬ: 09/08/13, проблема с циклом была просто связана с первоначальными заказами, которые я использовал для тестирования. Я должен был заметить это раньше и уделить больше внимания попытке auto.arima работать с этими данными - см. Пункты а) и d) выше.


Кроме того, я попытался использовать fourier, чтобы позаботиться о сезонности, но возвратил ту же ошибку «Ошибка в optim (init [mask], armafn, method = optim.method, hessian = TRUE,: не конечное разностное значение [1]» даже если он используется в качестве матрицы сам по себе без других экзогенных переменных. Пожалуйста, кто-нибудь может помочь мне объяснить, почему это так?
krcooke

Вы могли бы повторно загрузить данные?
MyHeadHurts

Ответы:


4

К сожалению, ваша миссия обречена на провал, поскольку вы ограничены R и SPSS. Вам необходимо определить структуру отношений между лидерами и лагами для каждого из событий / праздников / внешних переменных, которые могут вступить в игру. Вам необходимо определить возможные тренды времени, которые SPSS не может сделать. Вам необходимо включать ежедневные тренды / прогнозы в каждый из почасовых прогнозов, чтобы обеспечить сводный, согласованный прогноз. Вы должны быть обеспокоены изменением параметров и изменением дисперсии. Надеюсь это поможет. В течение многих лет мы моделировали данные такого рода в автоматическом режиме, при условии, конечно, необязательных пользовательских элементов управления.

РЕДАКТИРОВАТЬ: По просьбе OP я представлю здесь типичный анализ. Я взял один, если часы заняты, и разработал ежедневную модель. В полном анализе будут разработаны все 24 часа, а также ежедневная модель для согласования прогнозов. Ниже приведен частичный список модели введите описание изображения здесь. В дополнение к значительным регрессорам (обратите внимание, что фактические опережающие и запаздывающие структуры были опущены) были показатели, отражающие сезонность, сдвиги уровней, ежедневные эффекты, изменения ежедневных эффектов и необычные значения, не соответствующие истории. Модель статистики есть введите описание изображения здесь. График прогнозов на ближайшие 360 дней приведен здесь введите описание изображения здесь. График Actual / Fit / Forecast аккуратно суммирует результатывведите описание изображения здесь. Когда сталкиваешься с чрезвычайно сложной проблемой (такой, как эта!), Нужно проявить много смелости, опыта и компьютерной производительности. Просто сообщите своему руководству, что проблема решаема, но не обязательно с использованием примитивных инструментов. Я надеюсь, что это вдохновит вас на продолжение ваших усилий, так как ваши предыдущие комментарии были очень профессиональны, направлены на личное обогащение и обучение. Я хотел бы добавить, что нужно знать ожидаемую ценность этого анализа и использовать его в качестве ориентира при рассмотрении дополнительного программного обеспечения. Возможно, вам нужен более громкий голос, чтобы помочь вашим «директорам» найти реальное решение этой сложной задачи.

Изучив ежедневные итоги и каждую из 24-часовых моделей, я определенно пойму, что количество посещений серьезно снизилось! Этот вид анализа потенциальным покупателем предполагает отсутствие покупки, в то время как продавцу будет целесообразно удвоить свои усилия по продаже бизнеса на основе этого весьма негативного прогноза.


Привет Дэйв, большое спасибо, что нашли время, чтобы прочитать мой вопрос и ответить. Я понимаю, что ваше программное обеспечение выходит за рамки любых альтернатив, но, к сожалению, пока мне не подходит. Зная о возможностях R, есть ли какой-нибудь совет, который вы можете мне предложить, чтобы улучшить то, что я уже сделал? С уважением,
krcooke

@krcooke Вы можете проверить взаимную корреляцию между посещениями и альтернативными отведениями / лагами вокруг каждого из ваших регрессоров, чтобы определить соответствующий ответ. Я полностью согласен с Ником, что некоторые регрессоры могут быть полезны в течение некоторых часов, но не для других. Вы можете моделировать каждый час отдельно. Обнаружение 4 видов выбросов (импульсный, сдвиг уровня, сезонный импульсный и временной тренды) недоступно в SAS, если у вас есть причинно-следственные связи, и, вероятно, недоступно в SPSS. Я загрузил ваши данные и буду использовать AUTOBOX Мы всегда ищем такие «жесткие данные», как ваша, чтобы укрепить нашу аналитику.
IrishStat

Привет, Дэйв, я посмотрю, что я могу сделать в отношении анализа регрессоров. Я чувствовал, что регрессоры, которые я использовал, были очень «стандартными» и могли повлиять на все такие магазины. Я использовал юбилейные выходные в качестве праздничного выходного в комментарии Ника; это скорее всего выиграет от использования регрессоров, но я пока не включал это. И мне очень интересно посмотреть, что вы можете сделать с данными! Еще раз спасибо.
krcooke

7
« К сожалению, ваша миссия обречена на провал, поскольку вы ограничены R и SPSS. » - этот комментарий, к сожалению, заходит слишком далеко; любой язык, полный Тьюринга, может реализовывать любой алгоритм, написанный на любом другом, даже если он программируется только в машинном коде путем переключения переключателей и полностью реализован в Lego. Там нет расчета, который может быть реализован в одном, который нельзя сделать в другом. Если вы не претендуете на магические свойства для AUTOBOX, я думаю, что вы, скорее всего, хотите сказать что-то вроде «уже доступно как функции в распределении ванили» как различие.
Glen_b

@Glen_b Что я мог бы сказать, так это то, что огневой мощи в используемых вами ванильных дистрибутивах недостаточно для решения проблемы, если у вас нет много времени для написания новых процедур.
IrishStat

10

Это не более, чем набор комментариев, но это будет слишком долго для этого формата. Я не более чем любитель временного ряда, но у меня есть несколько простых предложений.

  1. Вы можете быть здесь по приказу, но я думаю, что это нуждается в некотором уточнении с точки зрения того, что вы ожидаете достичь и что является наиболее важным для вас. Прогнозирование посещений, к сожалению, нечеткая цель. Например, предположим, что сейчас 4 часа дня, а вы хотите прогнозировать посещения на час вперед. Вам действительно нужна супер-модель, включающая в себя обработку всей предыдущей серии? Это должно исходить из некоторого рассмотрения реальных практических и / или научных целей, которые могут быть установлены вашим начальством или клиентом или могут быть вашими собственными научными исследованиями. Я подозреваю, что более вероятно, что разные модели нужны для разных целей.

  2. Выделение почасовых рядов, по-видимому, обусловлено идеей сокращения вычислений без особого рассмотрения того, насколько это имеет смысл. Итак, вы подразумеваете, что вы не будете (не будете) использовать информацию, полученную ранее сегодня, для прогнозирования того, что происходит в 16:00, только все предыдущие наблюдения в 16:00? Мне кажется, что нужно много говорить через.

  3. Вы, очевидно, учитесь во временных рядах (и я ставлю себя вровень), но ни один ученик не должен начинать с такой большой проблемы. В самом деле! У вас много данных, у вас есть периодичность в нескольких масштабах, у вас есть неравномерность времени работы и праздников, у вас есть экзогенные переменные: вы выбрали очень сложную проблему. (А как насчет трендов?) Легко сказать, но до сих пор вас это явно обошло: вам, возможно, придется сначала поработать над очень упрощенными версиями задачи и понять, как подойти к более простым моделям. Бросить все в большую сложную модель, очевидно, не очень хорошо, и кажется, что требуется нечто радикально более простое, или осознание того, что проект, возможно, слишком амбициозен.


Привет, Ник, 1- Я действительно нахожусь под заказом Цель состоит в том, чтобы попытаться построить модель, чтобы она не имела тенденцию к чрезмерному прогнозированию (приводящему к потере рабочего времени персонала) или занижению прогноза (чтобы персонал не был перегружен). 2. Я обдумал это, но буду копать глубже, чтобы понять, что я получаю / теряю таким образом. Прогнозирование в виде одной серии выглядело как «супер модель», как вы выразились. 3. Я знаю, что это чрезвычайно сложно, и в данный момент я бью себя выше своего веса, но я полностью открыт для более простого решения, которое также подойдет мне здесь. Большое спасибо за ваши мысли, Ник.
krcooke

С точки зрения более простых решений, я не мог использовать методы экспоненциального сглаживания таким образом, чтобы юбилейные выходные в прошлом году вызывали переоценку в этом году (тот же период). Из-за того, что это связано с выбросами, я чувствовал, что мне абсолютно необходимо использовать экзогенные переменные. У вас есть другие идеи, которые я мог бы изучить?
krcooke

Все, что я могу сказать, это то, что я сделал бы, если бы я был по приказу и имел именно ту информацию, которую вы здесь даете. Мой инстинкт был бы первым, чтобы объединиться с ежедневными итогами и работать с ними. Это достаточно сложно. Здесь гораздо проще быть критичным ....
Ник Кокс

Привет Ник, Моя вина, я должен был уже заявить, что я попробовал это. С ежедневными итогами результаты оказались разумными. Разумно быть ключевым словом, потому что, как вы и Дейв заявили, здесь есть еще много вопросов, которые следует рассмотреть. Если это представляет интерес, я могу повторно выполнить ежедневные данные и продемонстрировать, что они фиксируют еженедельную, ежемесячную и годовую сезонность. Вот почему я тогда подумал прогнозировать каждый час как ежедневный ряд.
krcooke

Как упоминалось в первом посте, одна из проблем, с которыми я столкнулся, заключается в том, что auto.arima достигает максимума итераций перед сходимостью, поэтому я использую довольно обобщенные параметры с Arima (). Любое руководство о том, как я могу преодолеть это, будет очень признателен!
krcooke
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.