Як підігнати модель ARIMAX з R?


33

У мене є чотири різні часові ряди погодинних вимірювань:

  1. Витрата тепла всередині будинку
  2. Температура поза домом
  3. Сонячне випромінювання
  4. Швидкість вітру

Я хочу мати можливість передбачити споживання тепла всередині будинку. Існує чітка сезонна тенденція, як щорічно, так і щоденно. Оскільки між різними серіями існує чітка кореляція, я хочу їх встановити за допомогою моделі ARIMAX. Це можна зробити в R, використовуючи функцію arimax з пакету TSA.

Я намагався прочитати документацію на цю функцію та прочитати функції передачі, але поки що мій код:

regParams = ts.union(ts(dayy))
transferParams = ts.union(ts(temp))
model10 = arimax(heat,order=c(2,1,1),seasonal=list(order=c(0,1,1),period=24),xreg=regParams,xtransf=transferParams,transfer=list(c(1,1))
pred10 = predict(model10, newxreg=regParams)

дає мені: введіть тут опис зображення

де чорна лінія є фактично вимірюваними даними, а зелена лінія - це моя відповідна модель порівняно. Це не лише гарна модель, але явно щось не так.

Я визнаю, що мої знання про ARIMAX-моделі та функції передачі обмежені. У функції arimax (), (наскільки я зрозумів), xtransf - це екзогенний часовий ряд, який я хочу використовувати (використовуючи функції передачі) для прогнозування мого основного часового ряду. Але в чому насправді різниця між xreg і xtransf?

Загалом, що я зробив неправильно? Я хотів би мати можливість краще пристосуватись, ніж той, який досягнуто з lm (тепловий ~ темп радіальний вітер * час).

Редагування: На основі деяких коментарів я видалив передачу і замість цього додав xreg:

regParams = ts.union(ts(dayy), ts(temp), ts(time))
model10 = arimax(heat,order=c(2,1,1),seasonal=list(order=c(0,1,1),period=24),xreg=regParams)

де dayy - це "число числа року", а час - година дня. Температура - знову температура зовні. Це дає мені такий результат:

введіть тут опис зображення

що краще, але майже не те, що я очікував побачити.

Відповіді:


34

У вас виникнуть невеликі труднощі при моделюванні серії з двома рівнями сезонності за допомогою моделі ARIMA. Виконання цього права дуже залежить від правильної настройки. Ви ще розглядали просту лінійну модель? Вони набагато швидше і легше підходять, ніж моделі ARIMA, і якщо ви використовуєте фіктивні змінні для різних рівнів сезонності, вони часто досить точні.

  1. Я припускаю, що у вас є погодинні дані, тому переконайтеся, що ваш об’єкт TS встановлений з частотою 24.
  2. Можна моделювати інші рівні сезонності, використовуючи фіктивні змінні. Наприклад, вам може знадобитися набір 0/1 манекенів, що представляють місяць року.
  3. Включіть в xregаргумент фіктивні змінні разом з будь-якими коваріатами (наприклад, температура).
  4. Встановити модель з функцією arima в базу R. Ця функція може обробляти моделі ARMAX за допомогою xregаргументу.
  5. Спробуйте функції Arima та auto.arima у пакеті прогнозів. auto.arima хороший тим, що автоматично знайде хороші параметри для вашої моделі arima. Однак, FOREVER підходить для вашого набору даних.
  6. Спробуйте функцію tslm в пакеті arima, використовуючи фіктивні змінні для кожного рівня сезонності. Це підійде набагато швидше, ніж модель «Аріма», та може навіть краще працювати у вашій ситуації.
  7. Якщо 4/5/6 не працює, ТОГО почніть турбуватися про функції передачі. Ви повинні повзати, перш ніж ви зможете ходити.
  8. Якщо ви плануєте прогнозувати майбутнє, спочатку потрібно буде спрогнозувати ваші змінні xreg. Для сезонних муляжів це легко, але вам доведеться подумати, як зробити хороший прогноз погоди. Може використовувати медіану історичних даних?

Ось приклад того, як я підійшов би до цього:

#Setup a fake time series
set.seed(1)
library(lubridate)
index <- ISOdatetime(2010,1,1,0,0,0)+1:8759*60*60
month <- month(index)
hour <- hour(index)
usage <- 1000+10*rnorm(length(index))-25*(month-6)^2-(hour-12)^2
usage <- ts(usage,frequency=24)

#Create monthly dummies.  Add other xvars to this matrix
xreg <- model.matrix(~as.factor(month))[,2:12]
colnames(xreg) <- c('Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')

#Fit a model
library(forecast)
model <- Arima(usage, order=c(0,0,0), seasonal=list(order=c(1,0,0), period=24), xreg=xreg)
plot(usage)
lines(fitted(model),col=2)

#Benchmark against other models
model2 <- tslm(usage~as.factor(month)+as.factor(hour))
model3 <- tslm(usage~as.factor(month))
model4 <- rep(mean(usage),length(usage))

#Compare the 4 models
library(plyr) #for rbind.fill
ACC <- rbind.fill(  data.frame(t(accuracy(model))),
                    data.frame(t(accuracy(model2))),
                    data.frame(t(accuracy(model3))),
                    data.frame(t(accuracy(model4,usage)))
                )
ACC <- round(ACC,2)
ACC <- cbind(Type=c('Arima','LM1','Monthly Mean','Mean'),ACC)
ACC[order(ACC$MAE),]

Що таке функція (). Якщо я використовую це, я отримую набагато кращі результати, ніж за прогноз (model10, newxreg = regParams).
відверто

@utdiscant: predict()використовується для прогнозування, тоді як fitted()повертає модель, що відповідає історичному періоду. Якщо ви хочете отримати більш конкретну допомогу, слід надіслати відтворюваний приклад з деяким кодом.
Зак

@utdiscant: також, якщо ви використовуєте dayy як xreg, ви ризикуєте переобладнати, оскільки у вас є лише 24 спостереження на день. Ви можете отримати кращі результати прогнозування, якщо використовувати місяць року.
Зак

@utdiscant: Крім того, ваші часові xregs мають бути фіктивними змінними . Те, що ви зараз моделювали, полягає в тому, що ви очікуєте heatлінійно збільшуватися з годиною дня, а потім стрибати назад, коли година повернеться до 1. Якщо ви використовуєте фіктивні змінні, кожна година дня отримуватиме власний ефект. Перегляньте мій прикладний код і зверніть пильну увагу на те, як я будую свій об'єкт xreg.
Зак

Одним із недоліків функцій ARIMA в пакетах statsта forecastпакетах є те, що вони не відповідають функціям передачі зонду. Документація stats::arimaфункції зазначає наступне: Якщо включений термін xreg, лінійна регресія (з постійним терміном, якщо include.mean є істинним і немає розрізнення) оснащується моделлю ARMA для терміна помилки. Отже, якщо вам насправді потрібно підходити до функцій передачі, здається, TSA::arimaxфункція - це спосіб ввійти R.
Крістофер

8

Я деякий час використовую R для прогнозування завантаження, і я можу запропонувати вам використовувати forecastпакет та його безцінні функції (наприклад auto.arima).

Можна створити модель ARIMA за допомогою наступної команди:

model = arima(y, order, xreg = exogenous_data)

з yвашим передбаченням (я думаю dayy), orderпорядком вашої моделі (враховуючи сезонність) та exogenous_dataтемпературою, сонячним випромінюванням тощо. Функція auto.arimaдопоможе вам знайти оптимальний порядок моделі. Короткий посібник з пакетом "прогнозування" ви можете знайти тут .


Що передбачити - це тепло (споживання тепла в будинку).
відверто

3

Я особисто не розумію функції передачі, але думаю, що ви отримали xtransfта xregзмінили. Принаймні, в базі R саме arimaте, xregщо містить ваші екзогенні змінні. Моє враження, що функція передачі описує, як (відсталі дані впливають на майбутні значення), а не на що .

Я б спробував використовувати xregдля ваших екзогенних змінних, можливо, використовуючи, arimaякщо arimaxвимагає функції передачі. Проблема полягає в тому, що ваша модель є щоденною, але ваші дані мають як щоденну, так і щорічну сезонність, і зараз я не впевнений, чи буде перша різниця (це order=(*, 1, *)) подбати про це чи ні. (Ви точно не отримаєте магічні цілорічні прогнози з такої моделі, яка враховує лише щоденну сезонність.)

PS Що timeви використовуєте у своєму lm? Буквальний годинник або 1-ого числа спостереження? Я думаю, ви можете щось отримати, використовуючи модель зі змішаним ефектом ( lmerв lme4пакеті), хоча я не зрозумів, чи правильно це пояснюється автокореляцією, яка відбуватиметься в часовому ряду. Якщо не враховувати, що lmне відповідає, ви можете отримати цікаву форму, але ваша концепція того, наскільки точний ваш прогноз, буде занадто оптимістичною.


У мене є і година вимірювання, і "день року" вимірювання.
виголошення
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.