Я впечатлен forecast
пакетом R , а также, например, zoo
пакетом для нерегулярных временных рядов и интерполяции пропущенных значений.
Мое приложение находится в области прогнозирования трафика в колл-центре, поэтому данные о выходных (почти) всегда отсутствуют, что может быть легко обработано zoo
. Кроме того, некоторые дискретные точки могут отсутствовать, я просто использую R NA
для этого.
Дело в том, что все приятное волшебство пакета прогноза, например eta()
, и auto.arima()
т. Д., Похоже, ожидает простые ts
объекты, то есть равноправные временные ряды, не содержащие пропущенных данных. Я думаю, что приложения реального мира для равномерно распределенных временных рядов, безусловно, существуют, но, на мой взгляд, очень ограничены.
Проблема нескольких дискретных NA
значений может быть легко решена с помощью любой из предложенных функций интерполяции, zoo
а также с помощью forecast::interp
. После этого я запускаю прогноз.
Мои вопросы:
- Кто-нибудь предлагает лучшее решение?
(мой главный вопрос) По крайней мере, в моей прикладной области, прогнозирования трафика центра обработки вызовов (и, насколько я могу представить, большинство других проблемных областей), временные ряды не равны. По крайней мере, у нас есть схема "рабочих дней" или что-то в этом роде. Какой лучший способ справиться с этим и при этом использовать всю крутую магию пакета прогноза?
Должен ли я просто «сжать» временной ряд, чтобы заполнить выходные, сделать прогноз, а затем снова «раздувать» данные, чтобы заново вставить значения NA в выходные? (Это было бы позором, я думаю?)
Есть ли планы сделать пакет прогноза полностью совместимым с пакетами нерегулярных временных рядов, такими как zoo или его? Если да, то когда, а если нет, то почему нет?
Я довольно новичок в прогнозировании (и статистике в целом), поэтому я могу упустить из виду кое-что важное.
источник
auto.arima
может обрабатывать пропущенные значения.Ответы:
Я не эксперт по R, так что, возможно, есть более простой способ, но я сталкивался с этим раньше. Ранее я реализовал функцию, которая измеряет расстояние (в единицах времени) между фактическими датами и сохраняет его в новом столбце в существующем временном ряду. Итак, у нас есть что-то вроде:
Таким образом, если ваш временной ряд еще не связан с фактическим рядом точек во времени (или неправильным форматом или чем-то еще), то вы все равно можете работать с ним.
Затем вы пишете функцию, которая создает для вас новый временной ряд, например:
Во-первых, вы рассчитываете, сколько единиц времени фактически будет иметь временной ряд между датами вашего выбора, и создаете эту временную шкалу в зоопарке, в тс или в любом другом случае с пустыми значениями.
Во-вторых, вы берете свой массив неполных временных рядов и, используя цикл, заполняете значения в правильную временную шкалу в соответствии с ограничениями по вашему выбору. Когда вы наталкиваетесь на строку, в которой единичное расстояние не равно единице (дни (единицы) отсутствуют), вы вводите интерполированные значения.
Теперь, поскольку это ваша функция, вы можете выбрать способ интерполяции. Например, вы решили, что если расстояние меньше двух единиц, вы используете стандартную линейную интерполяцию. Если неделя отсутствует, вы делаете что-то еще, и если достигается определенный порог пропущенных дат, вы выдаете предупреждение о данных - действительно то, что вы хотите представить.
Если цикл достигает конечной даты, вы возвращаете свой новый тс.
Преимущество такой функции заключается в том, что вы можете использовать различные интерполяции или процедуры обработки в зависимости от длины зазора и возвращать чисто созданные серии в формате по вашему выбору. После того, как написано, это позволяет вам получать чистые и хорошие ts из любого вида табличных данных. Надеюсь, это поможет вам как-то.
источник
Вы должны быть очень осторожны, когда применяете интерполяцию перед дальнейшей статистической обработкой. Выбор, который вы делаете для своей интерполяции, вносит предвзятость в ваши данные. Это то, чего вы определенно хотите избежать, так как это может изменить качество ваших прогнозов. По моему мнению, для пропущенных значений, таких как те, которые вы упомянули, которые регулярно разнесены во времени и соответствуют остановке в действиях, было бы более правильным оставить эти дни вне вашей модели. В маленьком мире вашего колл-центра (модель, которую вы строите об этом), возможно, было бы лучше считать, что время просто остановилось, когда оно закрыто, вместо того, чтобы придумывать измерения несуществующей деятельности. С другой стороны, модель ARIMA была статистически построена на предположении, что данные расположены на одинаковом расстоянии. Насколько я знаю, нет никакой адаптации ARIMA к вашему делу. Если вам просто не хватает нескольких измерений в фактические рабочие дни, возможно, вам придется использовать интерполяцию.
источник
Я бы не стал интерполировать данные, прежде чем оценивать модель по этим данным, как заметил @Remi. Это плохая идея. Крайний пример: представьте, что у вас есть две точки данных за январь 2013 года и январь 2014 года. Теперь интерполируйте 10 месячных точек между: с февраля по декабрь 2013 года и выполните регрессию на месячной дате. На самом деле все будет не так плохо, но идея та же: в лучшем случае вы будете раздувать статистику.
Для этого нужно использовать методы временных рядов, которые обрабатывают недостающие данные. Например, методы пространства состояний. Посмотрите на пакет astsa R. Это идет с превосходной книгой по анализу временных рядов. Это хорошо справится с отсутствующими данными. Matlab теперь имеет похожую функциональность в пакете ssm . Вы должны научиться преобразовывать свои модели в форму пространства состояний, но вы должны научиться этому в любом случае, если хотите отойти от
auto.arima
«магии».источник