Wie passt man ein ARIMAX-Modell mit R an?

Ich habe vier verschiedene Zeitreihen stündlicher Messungen:

  1. Der Wärmeverbrauch in einem Haus
  2. Die Temperatur außerhalb des Hauses
  3. Die Sonneneinstrahlung
  4. Die Windgeschwindigkeit

Ich möchte den Wärmeverbrauch im Haus vorhersagen können . Sowohl auf jährlicher als auch auf täglicher Basis gibt es einen klaren saisonalen Trend. Da es eine klare Korrelation zwischen den verschiedenen Serien gibt, möchte ich sie mit einem ARIMAX-Modell anpassen. Dies kann in R mit der Funktion arimax aus dem Paket TSA erfolgen.

Ich habe versucht, die Dokumentation zu dieser Funktion zu lesen und die Übertragungsfunktionen zu lesen, aber bisher mein Code:

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) 

gibt mir: Geben Sie hier die Bildbeschreibung ein

, wobei die schwarze Linie die tatsächliche ist Messdaten, und die grüne Linie ist mein angepasstes Modell im Vergleich. Es ist nicht nur kein gutes Modell, sondern es stimmt eindeutig etwas nicht.

Ich gebe zu, dass meine Kenntnisse über ARIMAX-Modelle und Übertragungsfunktionen begrenzt sind. In der Funktion arimax () (soweit ich verstanden habe) ist xtransf die exogene Zeitreihe, die ich (unter Verwendung von Übertragungsfunktionen) verwenden möchte, um meine Hauptzeitreihen vorherzusagen. Aber was ist der Unterschied zwischen xreg und xtransf wirklich?

Was habe ich allgemein falsch gemacht? Ich möchte in der Lage sein, eine bessere Anpassung zu erzielen als die von lm (Wärme ~ Temperatur Radi Wind * Zeit).

Änderungen: Aufgrund einiger Kommentare habe ich die Übertragung entfernt und stattdessen xreg hinzugefügt:

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) 

abei ist dayy der „Zahlentag des Jahres“ und time die Stunde des Tages. Temp ist wieder die Außentemperatur. Dies gibt mir das folgende Ergebnis:

Geben Sie hier die Bildbeschreibung ein.

Das ist besser, aber nicht annähernd das, was ich erwartet hatte.

Antwort

Sie werden ein wenig Probleme haben, eine Serie mit zwei Saisonalitätsstufen mithilfe eines ARIMA-Modells zu modellieren Um dies richtig zu machen, müssen Sie die Dinge richtig einrichten. Haben Sie schon ein einfaches lineares Modell in Betracht gezogen? Sie sind viel schneller und einfacher anzupassen als ARIMA-Modelle, und wenn Sie Dummy-Variablen für Ihre verschiedenen Saisonalitätsstufen verwenden, sind sie es oft ziemlich genau.

  1. Ich gehe davon aus, dass Sie stündliche Daten haben. Stellen Sie daher sicher, dass Ihr TS-Objekt mit einer Häufigkeit von 24 eingerichtet ist.
  2. Sie können andere Ebenen von modellieren Saisonalität mithilfe von Dummy-Variablen. Beispielsweise möchten Sie möglicherweise eine Reihe von 0/1 Dummy-Werten, die den Monat des Jahres darstellen.
  3. Fügen Sie die Dummy-Variablen in xreg ein Argument, zusammen mit etwaigen Kovariaten (wie Temperatu re).
  4. Passen Sie das Modell mit der Arima-Funktion in Basis R an. Diese Funktion kann ARMAX-Modelle mithilfe des Arguments xreg verarbeiten.
  5. Probieren Sie die Funktionen Arima und auto.arima im Prognosepaket aus. auto.arima ist nett, weil es automatisch gute Parameter für Ihr Arima-Modell findet. Es wird jedoch FÜR IMMER dauern, bis es in Ihren Datensatz passt.
  6. Probieren Sie die tslm-Funktion im Arima-Paket aus und verwenden Sie Dummy-Variablen für jede Saisonalitätsstufe. Dies passt viel schneller als das Arima-Modell und funktioniert möglicherweise sogar besser in Ihrer Situation.
  7. Wenn 4/5/6 nicht funktioniert, machen Sie sich dann Gedanken über Übertragungsfunktionen. Sie müssen vorher crawlen Sie können laufen.
  8. Wenn Sie eine Prognose für die Zukunft planen, müssen Sie zuerst Ihre xreg-Variablen prognostizieren. Dies ist für saisonale Dummies einfach, aber Sie müssen sich überlegen, wie Sie eine erstellen können gute Wettervorhersagen. Verwenden Sie möglicherweise den Median historischer Daten?

Hier ist ein Beispiel, wie ich dies angehen würde:

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

Kommentare

  • Was ist die Funktion fit ()? Wenn ich das verwende, erhalte ich weitaus bessere Ergebnisse als mit vorhersagen (model10, newxreg = regParams).
  • @utdiscant: predict() wird für die Vorhersage verwendet, während fitted() gibt die Modellanpassung über den historischen Zeitraum zurück. Wenn Sie spezifischere Hilfe benötigen, sollten Sie ein reproduzierbares Beispiel mit einem Code veröffentlichen.
  • @utdiscant: Wenn Sie dayy als xreg verwenden, besteht außerdem die Gefahr einer Überanpassung, da Sie nur 24 Beobachtungen haben pro Tag. Wenn Sie den Monat des Jahres verwenden, erhalten Sie möglicherweise bessere Prognoseergebnisse.
  • @utdiscant: Außerdem müssen Ihre zeitbasierten xregs Dummy-Variablen sein. Sie haben es jetzt so modelliert, dass Sie erwarten, dass heat linear mit der Stunde des Tages zunimmt, und dann wieder nach unten springen, wenn die Stunde auf 1 zurückkehrt. Wenn Sie Dummy-Variablen verwenden, jeweils Stunde des Tages wird es ' eigenen Effekt bekommen. Führen Sie meinen Beispielcode durch und achten Sie genau darauf, wie ich mein xreg-Objekt konstruiere.
  • Ein Nachteil der ARIMA-Funktionen in den Paketen stats und forecast ist, dass sie nicht für Prober-Übertragungsfunktionen geeignet sind . In der Dokumentation der Funktion stats::arima heißt es: Wenn ein xreg-Term enthalten ist, eine lineare Regression (mit einem konstanten Term, wenn include.mean wahr ist und es keine Differenzierung gibt ) ist mit einem ARMA-Modell für den Fehlerterm ausgestattet. Wenn Sie also tatsächlich Übertragungsfunktionen anpassen müssen, scheint die Funktion TSA::arimax der richtige Weg zu sein R.

Antwort

Ich habe R to verwendet Laden Sie die Vorhersage für eine Weile und ich kann Ihnen vorschlagen, das Paket forecast und seine unschätzbaren Funktionen (wie auto.arima) zu verwenden.

Sie können ein ARIMA-Modell mit dem folgenden Befehl erstellen:

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

mit y Ihrem Predictand (I. Angenommen, dayy), order die Reihenfolge Ihres Modells (unter Berücksichtigung der Saisonalität) und exogenous_data Ihre Temperatur, Sonneneinstrahlung usw. Die Funktion auto.arima hilft Ihnen, die optimale Modellreihenfolge zu finden. Ein kurzes Tutorial zum „Prognose“ -Paket finden Sie hier .

Kommentare

  • Was vorhergesagt werden soll, ist Wärme (der Wärmeverbrauch des Hauses).

Antwort

I. Ich persönlich verstehe die Übertragungsfunktionen nicht, aber ich denke, Sie haben die xtransf und xreg umgekehrt. Zumindest in Rs Basis arima enthält xreg Ihre exogenen Variablen. Ich habe den Eindruck, dass eine Übertragungsfunktion wie (verzögerte Daten wirken sich auf zukünftige Werte aus) und nicht wie was .

Ich würde versuchen, xreg für zu verwenden Ihre exogenen Variablen verwenden möglicherweise arima, wenn arimax eine Übertragungsfunktion erfordert. Das Problem ist, dass Ihr Modell täglich ist, Ihre Daten jedoch beides haben tägliche und jährliche Saisonalität, und ich bin mir derzeit nicht sicher, ob ein erster Unterschied (die order=(*, 1, *)) dafür sorgen wird oder nicht. (Mit einem Modell, das nur die tägliche Saisonalität berücksichtigt, erhalten Sie mit Sicherheit keine ganzjährigen Prognosen.)

PS Was ist die time, in der Sie verwenden Ihre lm? Wörtliche Uhrzeit oder eine 1-up-Beobachtungsnummer? Ich denke, Sie könnten etwas erhalten, wenn Sie ein Modell mit gemischten Effekten verwenden (lmer im lme4 -Paket), obwohl ich nicht herausgefunden habe, ob dies korrekt die Autokorrelation berücksichtigt, die in einer Zeitreihe auftreten wird. Wenn dies nicht berücksichtigt wird, was eine lm nicht tut, erhalten Sie möglicherweise eine interessante Anpassung, aber Ihr Konzept, wie genau Ihre Vorhersage ist, wird viel zu optimistisch sein.

Kommentare

  • Ich habe sowohl die Stunde der Messung als auch den " Tag des Jahres " der Messung.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.