Jak zamontować model ARIMAX z R?

33

Mam cztery różne serie czasowe pomiarów godzinnych:

  1. Zużycie ciepła w domu
  2. Temperatura na zewnątrz domu
  3. Promieniowanie słoneczne
  4. Prędkość wiatru

Chcę być w stanie przewidzieć zużycie ciepła w domu. Istnieje wyraźny trend sezonowy, zarówno w ujęciu rocznym, jak i codziennym. Ponieważ istnieje wyraźna korelacja między różnymi seriami, chcę je dopasować za pomocą modelu ARIMAX. Można to zrobić w R, używając funkcji arimax z pakietu TSA.

Próbowałem przeczytać dokumentację dotyczącą tej funkcji i przeczytać o funkcjach przesyłania, ale do tej pory mój kod:

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)

daje mi: wprowadź opis zdjęcia tutaj

gdzie czarna linia to faktycznie zmierzone dane, a zielona linia to mój dopasowany model w porównaniu. To nie tylko dobry model, ale oczywiście coś jest nie tak.

Przyznaję, że moja wiedza na temat modeli ARIMAX i funkcji przesyłania jest ograniczona. W funkcji arimax (), (o ile rozumiem), xtransf jest egzogenicznym szeregiem czasowym, którego chcę użyć (używając funkcji transferu) do przewidzenia moich głównych szeregów czasowych. Ale jaka jest naprawdę różnica między xreg i xtransf?

Mówiąc bardziej ogólnie, co zrobiłem źle? Chciałbym być w stanie uzyskać lepsze dopasowanie niż to osiągane z lm (ciepło ~ temperatura radi wiatr * czas).

Edycje: Na podstawie niektórych komentarzy usunąłem transfer i zamiast tego dodałem 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)

gdzie dzień jest „numerem dnia w roku”, a czas jest godziną dnia. Temp to znowu temperatura na zewnątrz. To daje mi następujący wynik:

wprowadź opis zdjęcia tutaj

co jest lepsze, ale nie prawie to, czego się spodziewałem.

utdiscant
źródło

Odpowiedzi:

34

Będziesz miał trochę problemów z modelowaniem serii z 2 poziomami sezonowości przy użyciu modelu ARIMA. Prawidłowe wykonanie tej czynności zależy w dużym stopniu od prawidłowej konfiguracji. Czy rozważałeś już prosty model liniowy? Są znacznie szybsze i łatwiejsze do dopasowania niż modele ARIMA, a jeśli używasz zmiennych fikcyjnych dla różnych poziomów sezonowości, są one często dość dokładne.

  1. Zakładam, że masz dane godzinowe, więc upewnij się, że obiekt TS jest skonfigurowany z częstotliwością 24.
  2. Możesz modelować inne poziomy sezonowości za pomocą zmiennych zastępczych. Na przykład możesz chcieć mieć zestaw manekinów 0/1 reprezentujących miesiąc w roku.
  3. Uwzględnij zmienne obojętne w xregargumencie wraz z wszelkimi zmiennymi towarzyszącymi (np. Temperaturą).
  4. Dopasuj model z funkcją arima w bazie R. Ta funkcja może obsługiwać modele ARMAX za pomocą xregargumentu.
  5. Wypróbuj funkcje Arima i auto.arima w pakiecie prognozy. auto.arima jest dobre, ponieważ automatycznie znajdzie dobre parametry dla twojego modelu arima. Jednak na zawsze zajmie, aby dopasować do zestawu danych.
  6. Wypróbuj funkcję tslm w pakiecie arima, używając zmiennych zastępczych dla każdego poziomu sezonowości. Będzie pasował znacznie szybciej niż model Arima, a może nawet lepiej działać w twojej sytuacji.
  7. Jeśli 4/5/6 nie działa, NASTĘPNIE zacznij martwić się funkcjami przesyłania. Musisz się czołgać, zanim będziesz mógł chodzić.
  8. Jeśli planujesz prognozować w przyszłości, najpierw musisz prognozować zmienne xreg. Jest to łatwe dla sezonowych manekinów, ale musisz pomyśleć o tym, jak zrobić dobre prognozy pogody. Może użyć mediany danych historycznych?

Oto przykład, jak do tego podejdę:

#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
źródło
Jaka jest funkcja dopasowana (). Jeśli go użyję, uzyskam znacznie lepsze wyniki niż przy prognozowaniu (model10, newxreg = regParams).
utdiscant,
@utdiscant: predict()służy do prognozowania, a fitted()przywraca dopasowanie modelu do okresu historycznego. Jeśli potrzebujesz bardziej szczegółowej pomocy, powinieneś opublikować powtarzalny przykład z jakimś kodem.
Zach
@utdiscant: także, jeśli używasz dayy jako xreg, ryzykujesz nadmiernym dopasowaniem, ponieważ masz tylko 24 obserwacje dziennie. Możesz uzyskać lepsze wyniki prognozowania, jeśli użyjesz miesiąca roku.
Zach.
@utdiscant: Ponadto xregy oparte na czasie muszą być zmiennymi obojętnymi . Sposób, w jaki go teraz modelujesz, polega na tym, że spodziewasz heatsię liniowego wzrostu wraz z godziną dnia, a następnie zeskoczysz z powrotem, gdy godzina powróci do 1. Jeśli użyjesz zmiennych obojętnych, każda godzina dnia uzyska swój własny efekt. Uruchom mój przykładowy kod i zwróć szczególną uwagę na to, jak skonstruować mój obiekt xreg.
Zach.
Jedną wadą funkcji ARIMA w pakietach statsi forecastjest to, że nie pasują one do funkcji transferu sondy. Dokumentacja stats::arimafunkcji stwierdza, co następuje: Jeśli uwzględniony jest termin xreg, regresja liniowa (ze stałym terminem, jeśli parametr include.mean ma wartość true i nie ma różnicowania) jest dopasowywana do modelu ARMA dla terminu błędu. Tak więc, jeśli rzeczywiście potrzebujesz dopasować funkcje przesyłania, wygląda na TSA::arimaxto, że jest to sposób na wejście R.
Christoffer
8

Używam R do prognozowania obciążenia przez jakiś czas i mogę zasugerować, abyś użył forecastpakietu i jego nieocenionych funkcji (jak auto.arima).

Możesz zbudować model ARIMA za pomocą następującego polecenia:

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

z ytwoim przewidywaniem (przypuszczam dayy), orderkolejnością twojego modelu (biorąc pod uwagę sezonowość) i exogenous_datatwoją temperaturą, promieniowaniem słonecznym itp. Ta funkcja auto.arimapomaga ci znaleźć optymalną kolejność modeli. Można znaleźć krótki tutorial na temat prognozowanej”pakietu` tutaj .

Matteo De Felice
źródło
Należy przewidzieć ciepło (zużycie ciepła w domu).
utdiscant,
3

Ja osobiście nie rozumiem funkcji transferu, ale myślę, że dostał xtransfi xregodwrócony. Przynajmniej w bazie R jest arimato xreg, że zawiera zmiennych egzogenicznych. Mam wrażenie, że funkcja przesyłania opisuje, w jaki sposób (opóźnione dane wpływają na przyszłe wartości), a nie co .

Spróbowałbym użyć xregdla twoich zmiennych egzogenicznych, być może używając, arimajeśli arimaxwymaga funkcji przeniesienia. Problem polega na tym, że Twój model jest codzienny, ale twoje dane mają sezonowość zarówno dzienną, jak i roczną, i nie jestem teraz pewien, czy pierwsza różnica ( order=(*, 1, *)poradzi sobie z tym), czy nie. (Na pewno nie uzyskasz magicznych prognoz przez cały rok z modelu, który uwzględnia tylko codzienną sezonowość).

PS Jakiego timeużywasz w swoim lm? Dosłowny zegar lub 1-up numer obserwacji? Myślę, że można coś uzyskać za pomocą modelu z efektem mieszanym ( lmerw lme4pakiecie), chociaż nie zorientowałem się, czy prawidłowe wykonanie tej korelacji powoduje autokorelację, która wystąpi w szeregu czasowym. Jeśli nie zostanie to uwzględnione, co lmnie jest możliwe, możesz uzyskać ciekawe dopasowanie, ale Twoja koncepcja dokładności prognozy będzie zbyt optymistyczna.

Wayne
źródło
Mam zarówno godzinę pomiaru, jak i „dzień roku” pomiaru.
utdiscant