Прогноз большого временного ряда не распознает ежедневные шаблоны. Каким может быть решение?

#r #time-series #forecasting

#r #временные ряды #прогнозирование

Вопрос:

У меня есть большой временной ряд, учитывающий почасовую потребность страны в электроэнергии за 10-летний период времени (2006-2015). Исходя из этого, я хочу прогнозировать будущие значения вплоть до 2020 года на почасовой основе.

Я попробовал несколько функций, основанных на некоторых исследованиях, и в итоге получил stl модель. Результаты, которые я получаю, выглядят следующим образом: введите описание изображения здесь

Как вы можете видеть, временной ряд спроса на электроэнергию показывает суточную закономерность с локальным пиком в утренние и одним в вечерние часы соответственно. Однако прогнозируемый профиль (здесь синим цветом) не показывает эту характеристику, и я, кажется, затрудняюсь с тем, как правильно найти модель / или подогнать временной ряд для учета этой характеристики.

Далее я предоставил вам свой код, чтобы вы лучше поняли, что я на самом деле сделал.

 ## Import Dummy Data
inputfile <- "C:/xxx/ForecastingTool/01_Testing/ConsumptionDataPT2006_2015/ConsumptionData.csv"
mygenerationdata <- read.csv(inputfile)

mygenerationdata$ConsumptionProfile <- ts(mygenerationdata$ConsumptionProfile, start = c(2006,1), frequency = 8764)

## Estimating model
fit.myprofile <- stl(mygenerationdata$ConsumptionProfile, s.window = "periodic", robust = "TRUE")
summary(fit.myprofile)

# Forecasting
## Alternative 1 stl   forecast
fit.forecast <- forecast(fit.myprofile, method="naive", h = 500)
plot(forecast(fit.myprofile, method="naive", h = 500), include = 500)
  

Итак, в двух словах, что я могу сделать, чтобы соответствующим образом настроить модель для учета суточной закономерности профиля электроэнергии?

Ответ №1:

Основываясь на вашей рекомендации, я нашел функцию msts, которая позволила мне учитывать различные сезонности в моем временном ряду. Я изменил следующую строку моего предыдущего кода:

 mygenerationdata$ConsumptionProfile <- 
  ts(mygenerationdata$ConsumptionProfile, start = c(2006,1), frequency = 8764); 
  

используя:

 mygenerationdata$ConsumptionProfile <-
  msts(mygenerationdata$ConsumptionProfile,
       start = c(2006,1),
       seasonal.periods = c(24, 168, 730.5, 8764.8),
       ts.frequency = 8764.8)
  

и получил надлежащие результаты:
Прогнозирование многосезонных временных рядов

Ответ №2:

Ваши данные имеют несколько сезонных зависимостей: определенно существует дневной тренд, но, вероятно, также недельный и годовой тренд. В настоящее время ваш ts объект имеет частоту 8764, что означает, что вы фиксируете только годовой тренд. Чтобы учитывать ежедневную сезонность, вы можете установить частоту равной 24 (игнорируя еженедельные и годовые тренды в пользу ежедневных тенденций), или вы можете подобрать модель с несколькими сезонностями. Второй вариант, вероятно, даст лучшие результаты. Для дальнейшего чтения я бы посоветовал книгу «Прогнозирование» Роба Хайндмана, в частности, главу 11, в которой предлагается несколько методов работы со сложными сезонностями. Я бы также посоветовал вам заглянуть в prophet пакет.

Комментарии:

1. Большое вам спасибо за ваш быстрый ответ! Я уже много читал о Робе Хайндмане и о нем самом, но не смог найти решение своей «проблемы». Я взгляну на книгу и пакет prophet, который вы предложили. Большое спасибо!

2. Если предоставленная мной информация была полезной, не могли бы вы отметить вопрос как ответ? Если у вас возникнут дополнительные вопросы, дайте мне знать, какая дополнительная информация вам нужна, или, возможно, задайте новый вопрос.

3. Основываясь на вашей рекомендации, я нашел функцию msts , которая позволила мне учитывать различные сезонности в моем временном ряду. Я изменил следующую строку моего предыдущего кода: mygenerationdata$ConsumptionProfile <- ts(mygenerationdata$ConsumptionProfile, start = c(2006,1), frequency = 8764) ; используя: mygenerationdata$ConsumptionProfile <- msts(mygenerationdata$ConsumptionProfile, start = c(2006,1), seasonal.periods = c(24, 168, 730.5, 8764.8),ts.frequency = 8764.8) и получил надлежащие результаты!