#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)
и получил надлежащие результаты!