Как установить 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?

В целом, что я сделал не так? Я хотел бы иметь возможность получить лучшее прилегание , чем тот достигается от пленки (тепло ~ температура Radi ветра * время).

Изменения: на основе некоторых комментариев я удалил перевод и добавил вместо него 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 - «число чисел года», а time - час дня. Температура снова температура снаружи. Это дает мне следующий результат:

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

что лучше, но не совсем то, что я ожидал увидеть.

utdiscant
источник

Ответы:

34

У вас будут небольшие проблемы при моделировании серии с 2 уровнями сезонности с использованием модели ARIMA. Получение этого права в значительной степени зависит от правильной настройки. Вы уже рассмотрели простую линейную модель? Они намного быстрее и легче приспосабливаются, чем модели ARIMA, и если вы используете фиктивные переменные для разных уровней сезонности, они часто бывают достаточно точными.

  1. Я предполагаю, что у вас есть почасовые данные, поэтому убедитесь, что ваш объект TS настроен с частотой 24.
  2. Вы можете смоделировать другие уровни сезонности, используя фиктивные переменные. Например, вам может потребоваться набор манекенов 0/1, представляющих месяц года.
  3. Включите в xregаргумент фиктивные переменные , а также любые ковариаты (например, температуру).
  4. Установите модель с помощью функции arima в базе R. Эта функция может обрабатывать модели ARMAX с помощью xregаргумента.
  5. Попробуйте функции Arima и auto.arima в пакете прогноза. auto.arima хорош, потому что он автоматически найдет хорошие параметры для вашей модели arima. Тем не менее, это займет навсегда, чтобы поместиться в ваш набор данных.
  6. Попробуйте использовать функцию tslm в пакете arima, используя фиктивные переменные для каждого уровня сезонности. Это будет соответствовать намного быстрее, чем модель 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),]
Zach
источник
Что такое встроенная функция (). Если я использую это, я получаю гораздо лучшие результаты, чем с помощью функции предиката (модель 10, newxreg = regParams).
Utdiscant
@utdiscant: predict()используется для прогнозирования, а fitted()возвращает модель, подходящую за исторический период. Если вам нужна более конкретная помощь, вы должны опубликовать воспроизводимый пример с некоторым кодом.
Зак
@utdiscant: также, если вы используете Dayy в качестве xreg, вы рискуете переобучиться, поскольку у вас есть только 24 наблюдения в день. Вы можете получить лучшие результаты прогнозирования, если используете месяц года.
Зак
@utdiscant: Кроме того, ваши временные ссылки должны быть фиктивными переменными . То, как вы сейчас это смоделировали, заключается в том, что вы ожидаете heatлинейного увеличения с часом дня, а затем спрыгиваете вниз, когда час возвращается к 1. Если вы используете фиктивные переменные, каждый час дня будет иметь свой собственный эффект. Запустите мой пример кода и обратите особое внимание на то, как я создаю свой объект xreg.
Зак
Недостатком функций ARIMA в пакетах statsand forecastявляется то, что они не соответствуют функциям передачи пробера. Документация по этой stats::arimaфункции гласит следующее: Если включен член xreg, линейная регрессия (с постоянным членом, если include.mean имеет значение true и разностей нет) снабжается моделью ARMA для термина ошибки. Так что, если вам действительно нужно установить передаточные функции, похоже, что TSA::arimaxфункция - это путь R.
Кристоффер
8

Я некоторое время использовал R для прогнозирования нагрузки и могу предложить вам использовать forecastпакет и его бесценные функции (например auto.arima).

Вы можете построить модель ARIMA с помощью следующей команды:

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

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

Маттео де Феличе
источник
То, что должно быть предсказано, - это тепло (потребление тепла в доме).
Utdiscant
3

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

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

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

Wayne
источник
У меня есть как час измерения, так и «день года» измерения.
Utdiscant