Jak dopasować model ARIMAX do R?

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

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

Chcę móc przewidzieć zużycie ciepła w domu . Istnieje wyraźny trend sezonowy, zarówno w ujęciu rocznym, jak i dziennym. 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ę na temat tej funkcji i przeczytać o funkcjach transferu, ale jak dotąd 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: tutaj wprowadź opis obrazu

gdzie czarna linia to rzeczywisty zmierzone dane, a zielona linia to mój dopasowany model w porównaniu. Nie tylko nie jest to dobry model, ale najwyraźniej coś jest nie tak.

Przyznam, że moja wiedza o modelach ARIMAX i funkcjach transferu jest ograniczona. W funkcji arimax () (o ile zrozumiałem), xtransf jest egzogenicznym szeregiem czasowym, którego chcę użyć (używając funkcji transferu) do przewidywania moich głównych szeregów czasowych. Ale jaka jest tak naprawdę różnica między xreg i xtransf?

Mówiąc bardziej ogólnie, co zrobiłem źle? Chciałbym móc uzyskać lepsze dopasowanie niż to osiągnięte z lm (ciepło ~ temp radi wiatr * czas).

Zmiany: 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 dayy to „numer dnia w roku”, a czas to godzina dnia. Temperatura to znowu temperatura na zewnątrz. Daje mi to następujący wynik:

tutaj wprowadź opis obrazu

co jest lepsze, ale nie prawie takie, jak się spodziewałem.

Odpowiedź

Będziesz miał trochę problemów z modelowaniem serii z 2 poziomami sezonowości przy użyciu modelu ARIMA . Uzyskanie tego w dużym stopniu zależy od prawidłowego ustawienia. Czy rozważałeś już prosty model liniowy? Są one dużo 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 Twój obiekt TS jest skonfigurowany z częstotliwością 24.
  2. Możesz modelować inne poziomy sezonowość przy użyciu zmiennych fikcyjnych. Na przykład możesz potrzebować zestawu manekinów 0/1 reprezentujących miesiąc roku.
  3. Uwzględnij zmienne fikcyjne w xreg argument, wraz ze wszystkimi zmiennymi towarzyszącymi (takimi jak temperatu re).
  4. Dopasuj model do funkcji arima w bazie R. Ta funkcja może obsługiwać modele ARMAX poprzez użycie argumentu xreg.
  5. Wypróbuj funkcje Arima i auto.arima w pakiecie prognozy. auto.arima jest fajne, ponieważ automatycznie znajdzie dobre parametry dla twojego modelu arima. Jednak dopasowanie do zbioru danych zajmie ZAWSZE.
  6. Wypróbuj funkcję tslm w pakiecie arima, używając fikcyjnych zmiennych dla każdego poziomu sezonowości. To będzie pasować dużo szybciej niż model Arima, a może nawet działać lepiej w Twojej sytuacji.
  7. Jeśli 4/5/6 nie zadziała, WTEDY zacznij się martwić o funkcje przenoszenia. Musisz się czołgać wcześniej możesz chodzić.
  8. Jeśli planujesz prognozować na przyszłość, najpierw musisz prognozować zmienne xreg. Jest to łatwe w przypadku manekinów sezonowych, ale musisz pomyśleć o tym, jak utworzyć dobre prognozy pogody. Może wykorzystasz medianę danych historycznych?

Oto przykład, jak podchodziłbym do tego:

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

Komentarze

  • Co to jest funkcja fit (). Jeśli go użyję, uzyskam znacznie lepsze wyniki niż w przypadku prognozy (model10, newxreg = regParams).
  • @utdiscant: predict() służy do prognozowania, podczas gdy fitted() zwraca dopasowanie modelu do okresu historycznego. Jeśli potrzebujesz bardziej szczegółowej pomocy, powinieneś opublikować odtwarzalny przykład z pewnym kodem.
  • @utdiscant: również, jeśli używasz dayy jako xreg, ryzykujesz nadmierne dopasowanie, ponieważ masz tylko 24 obserwacje na dzień. Możesz uzyskać lepsze wyniki prognozowania, jeśli użyjesz miesiąca w roku.
  • @utdiscant: Co więcej, twoje xregi oparte na czasie muszą być zmiennymi fikcyjnymi . Sposób, w jaki teraz to modelujesz, polega na tym, że oczekujesz, że heat będzie liniowo rosnąć wraz z godziną dnia, a następnie przeskakujesz z powrotem, gdy godzina powróci do 1. Jeśli używasz zmiennych fikcyjnych, godzina dnia będzie miała własny efekt '. Przeanalizuj mój przykładowy kod i zwróć szczególną uwagę na sposób konstruowania obiektu xreg.
  • Jedną wadą funkcji ARIMA w pakietach stats i forecast jest to, że nie pasują one do funkcji transferu prober . Dokumentacja funkcji stats::arima stwierdza, co następuje: Jeśli uwzględniony jest termin xreg, regresja liniowa (ze stałym członem, jeśli include.mean jest prawdą i nie ma różnic ) jest wyposażony w model ARMA dla składnika błędu. Tak więc, jeśli rzeczywiście potrzebujesz dopasować funkcje przenoszenia, wydaje się, że funkcja TSA::arimax jest dobrym rozwiązaniem w R.

Odpowiedź

Używałem R do przez chwilę prognozować obciążenie i mogę zasugerować użycie pakietu forecast i jego bezcennych funkcji (takich jak auto.arima).

Model ARIMA możesz zbudować za pomocą następującego polecenia:

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

z y swoim przewidywaniem (I załóżmy, że dayy), order kolejność modelu (z uwzględnieniem sezonowości) i exogenous_data Twój temperatura, promieniowanie słoneczne itp. Funkcja auto.arima pomaga znaleźć optymalną kolejność modeli. Krótki samouczek dotyczący pakietu „prognoza” znajduje się tutaj .

Komentarze

  • Przewidywane jest ciepło (zużycie ciepła w domu).

Odpowiedź

I osobiście nie rozumiem funkcji przesyłania, ale wydaje mi się, że odwrócono xtransf i xreg. Przynajmniej w bazie R „arima xreg zawiera Twoje zmienne egzogeniczne. Wydaje mi się, że funkcja transferu opisuje jak (opóźnione dane wpływają na przyszłe wartości) zamiast co .

Chciałbym użyć xreg do Twoje zmienne egzogeniczne, być może przy użyciu arima, jeśli arimax wymaga funkcji transferu. Problem polega na tym, że model działa codziennie, ale dane mają obie sezonowość dzienna i roczna, a teraz nie jestem pewien, czy pierwsza różnica (order=(*, 1, *)) wystarczy, czy nie. (Na pewno nie uzyskasz magicznych prognoz całorocznych na podstawie modelu uwzględniającego tylko dzienną sezonowość).

PS Czym jest time, którego używasz w Twój lm? Dosłowny czas zegarowy czy 1-upowy numer obserwacji? Myślę, że można by coś uzyskać, używając modelu z efektami mieszanymi (lmer w pakiecie lme4), chociaż nie wiem, czy zrobienie tego poprawnie uwzględnia autokorelację, która wystąpi w szeregu czasowym. Jeśli nie uwzględnisz tego, czego lm nie, możesz uzyskać interesujące dopasowanie, ale Twoja koncepcja dokładności przewidywań będzie zbyt optymistyczna.

Komentarze

  • Mam zarówno godzinę pomiaru, jak i " dzień roku " pomiaru.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *