Це довгий пост, тому я сподіваюся, що ви можете перенести зі мною, і, будь ласка, виправте мене там, де я помиляюся.
Моя мета - складати щоденний прогноз на основі 3 або 4 тижнів історичних даних.
Дані - це 15-хвилинні дані локального навантаження однієї з трансформаторних ліній. У мене виникають проблеми з порядком моделювання сезонного ARIMA-процесу. Розглянемо часовий ряд попиту на електроенергію:
Оригінальний часовий ряд http://i.share.pho.to/80d86574_l.png
Коли перші 3 тижні приймаються як підмножина та розрізняються наступні графіки ACF / PACF:
Підмножина http://i.share.pho.to/5c165aef_l.png
Перша різниця http://i.share.pho.to/b7300cc2_l.png
Сезонна та перша різниця http://i.share.pho.to/570c5397_l.png
Це виглядає так, що серія начебто нерухома. Але сезонність також може бути щотижневою (див. Сезонні різниці тижня та різниці в другому порядку [тут] http://share.pho.to/3owoq , як ти думаєш?)
Отже, зробимо висновок, що модель має форму:
На останньому малюнку чіткий сплеск при відставанні 96 вказує на сезонний компонент МА (1) (можливо, АР (1) також може бути відмінне, оскільки в ПАКФ також є чіткий сплеск). Шипи при відставанні 1: 4 вказують на компонент МА (4), який відповідає експоненціальному розпаду в PACF з трохи фантазії. Таким чином, початковою моделлю, обраною вручну, можуть бути:
с
Series: x
ARIMA(0,1,4)(0,1,1)[96]
Coefficients:
ma1 ma2 ma3 ma4 sma1
-0.2187 -0.2233 -0.0996 -0.0983 -0.9796
s.e. 0.0231 0.0234 0.0257 0.0251 0.0804
sigma^2 estimated as 364612: log likelihood=-15138.91
**AIC=30289.82 AICc=30289.87 BIC=30323.18**
Функція auto.arima обчислює наступну модель (з кроком та наближенням на TRUE, інакше потрібно довго конвергенцію):
з
Series: x
ARIMA(1,1,1)(2,0,2)[96]
Coefficients:
ar1 ma1 sar1 sar2 sma1 sma2
0.7607 -1.0010 0.4834 0.4979 -0.3369 -0.4168
s.e. 0.0163 0.0001 0.0033 0.0116 0.0216 0.0255
sigma^2 estimated as 406766: log likelihood=-15872.02
**AIC=31744.99 AICc=31745.05 BIC=31784.25**
Що означає, що не застосовується сезонне розмежування. Ось залишки обох моделей. Статистика Ljung Box дає дуже мале значення p, вказуючи на те, що все ще існує деяка автокореляція («виправте мене, якщо я помиляюся).
Прогнозування
Таким чином, щоб визначити, що краще, найкращим є тест точності на вибірці. Тож для обох моделей прогноз робиться на 24 години вперед, що порівнюється між собою. Результати: auto.arima http://i.share.pho.to/5d1dd934_l.png ручна модель http://i.share.pho.to/7ca69c97_l.png
Авто:
ME RMSE MAE MPE MAPE MASE ACF1 Theil's U
Training set -2.586653 606.3188 439.1367 -1.284165 7.599403 0.4914563 -0.01219792 NA
Test set -330.144797 896.6998 754.0080 -7.749675 13.268985 0.8438420 0.70219229 1.617834
Посібник
ME RMSE MAE MPE MAPE MASE ACF1 Theil's U
Training set 2.456596e-03 589.1267 435.6571 -0.7815229 7.509774 0.4875621 -0.002034122 NA
Test set 2.878919e+02 919.7398 696.0593 3.4756363 10.317420 0.7789892 0.731013599 1.281764
Запитання
Як ви можете подумати, це аналіз за перші три тижні набору даних. Я боюсь у своєму розумі з такими питаннями:
- Як вибрати найкращу модель ARIMA (спробувавши всі різні замовлення та перевіривши найкращі MASE / MAPE / MSE? Де вибір вимірювання продуктивності може бути дискусією у власній ..)
- Якщо я генерую нову модель та прогноз для кожного нового прогнозу на день (як в онлайн-прогнозуванні), чи потрібно мені враховувати річну тенденцію та як? (як у такому невеликому підмножині, я гадаю, що тенденція незначна)
- Чи сподіваєтесь ви, що замовлення моделі залишатиметься однаковим у всьому наборі даних, тобто, якщо приймати інший підмножина, це дасть мені ту саму модель?
- Який хороший спосіб в рамках цього методу впоратися зі святами? Або для цього потрібен ARIMAX із зовнішніми муляжами відпочинку?
- Чи потрібно використовувати підхід серії Фур'є, щоб спробувати моделі,
seasonality=672
про які говорилося в Довгих сезонних періодах ? - Якщо так, це було б так
fit<-Arima(timeseries,order=c(0,1,4), xreg=fourier(1:n,4,672)
(де функція фур'є є такою, як визначено в публікації блогу Hyndman) - Чи включаються початкові компоненти P і Q до серії фур’є?
Більшість теоретичних знань, отриманих від FPP , чудові речі!
Перш ніж порадити щодо використання експоненціального згладжування або (динамічної) лінійної регресії, це також працює над порівнянням.
Дані
https://www.dropbox.com/sh/mzx61sskya5ze6x/Zq3A7Q6htH/trafo.txt
Код
data<-read.csv("file", sep=";")
load<-data[,3]
Я видалив кілька нульових значень за тиждень до значень
stepback<-672
load[is.na(load)] <- 0 # Assumed no 0's in first 672 values!
idx <- which(load == 0)
idx <- idx[which(idx>stepback)]
load[idx] <- load[idx-stepback]
ED<-ts(load,start=0, end=c(760,96),frequency=96)
x<-window(ED,start=0, end=c(20,96))
Можна також розмістити відтворюваний приклад, але це зробить публікацію ще довшою, але можливою, якщо це потрібно. Тож, якщо я можу щось надати, будь ласка, повідомте мене про це.