Как установить 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 - час дня. Температура снова температура снаружи. Это дает мне следующий результат:

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

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

Ответы:


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),]

Что такое встроенная функция (). Если я использую это, я получаю гораздо лучшие результаты, чем с помощью функции предиката (модель 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нет, вы можете получить интересную информацию, но ваша концепция точности прогноза будет слишком оптимистичной.


У меня есть как час измерения, так и «день года» измерения.
Utdiscant
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.