Ich habe vier verschiedene Zeitreihen von Stundenmessungen:
- Der Wärmeverbrauch in einem Haus
- Die Temperatur außerhalb des Hauses
- Die Sonnenstrahlung
- Die Windgeschwindigkeit
Ich möchte den Wärmeverbrauch im Haus vorhersagen können. Es gibt einen klaren saisonalen Trend, sowohl auf jährlicher Basis als auch auf täglicher Basis. Da es eine eindeutige 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 und die Übertragungsfunktionen zu lesen, aber bisher meinen 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:
wo die schwarze Linie die tatsächlichen gemessenen Daten sind und die grüne Linie mein angepasstes Modell im Vergleich ist. Es ist nicht nur kein gutes Modell, sondern offensichtlich stimmt etwas nicht.
Ich gebe zu, dass meine Kenntnisse über ARIMAX-Modelle und Übertragungsfunktionen begrenzt sind. In der Funktion arimax () ist xtransf (soweit ich verstanden habe) die exogene Zeitreihe, mit der ich (unter Verwendung von Übertragungsfunktionen) meine Hauptzeitreihe vorhersagen möchte. 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 Passform zu erreichen als die, die ich mit lm (wärmetemp. Radi wind * time) erreicht habe.
Ä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)
Wobei dayy der "Zahlentag des Jahres" und time die Stunde des Tages ist. Temp ist wieder die Außentemperatur. Dies gibt mir das folgende Ergebnis:
Das ist besser, aber nicht annähernd das, was ich erwartet hatte.
quelle
predict()
wird für Prognosen verwendet, währendfitted()
das Modell über den historischen Zeitraum angepasst wird . Wenn Sie spezifischere Hilfe benötigen, sollten Sie ein reproduzierbares Beispiel mit Code veröffentlichen.heat
, mit der Stunde des Tages linear zuzunehmen und dann wieder nach unten zu springen, wenn die Stunde auf 1 zurückkehrt. Wenn Sie Dummy-Variablen verwenden, wird jede Stunde des Tages ihren eigenen Effekt bekommen. Führen Sie meinen Beispielcode durch und achten Sie sorgfältig darauf, wie ich mein xreg-Objekt konstruiere.stats
undforecast
ist, dass sie nicht für Prober-Transfer-Funktionen geeignet sind. Die Dokumentation derstats::arima
Funktion gibt Folgendes an: Wenn ein xreg-Term enthalten ist, wird eine lineare Regression (mit einem konstanten Term, wenn include.mean wahr ist und keine Differenzierung vorliegt) mit einem ARMA-Modell für den Fehlerterm ausgestattet. Wenn Sie also tatsächlich Übertragungsfunktionen anpassen müssen, ist die Funktion anscheinend derTSA::arimax
richtige WegR
.Ich verwende R schon seit einiger Zeit, um Lastprognosen zu erstellen, und ich kann Ihnen vorschlagen, das
forecast
Paket und seine unschätzbaren Funktionen (wieauto.arima
) zu verwenden.Sie können ein ARIMA-Modell mit dem folgenden Befehl erstellen:
mit
y
Ihrem Vorhersagewert (nehme ich andayy
),order
der Reihenfolge Ihres Modells (unter Berücksichtigung der Saisonalität) undexogenous_data
Ihrer Temperatur, Sonneneinstrahlung usw. Die Funktionauto.arima
hilft Ihnen, die optimale Modellreihenfolge zu finden. Ein kurzes Tutorial zum "Forecast" -Paket finden Sie hier .quelle
Ich persönlich verstehe keine Übertragungsfunktionen, aber ich denke, Sie haben die
xtransf
undxreg
umgekehrt. Zumindest in R-Basearima
ist es ,xreg
dass Ihre exogenen Variablen enthält. Ich habe den Eindruck, dass eine Übertragungsfunktion eher beschreibt, wie (verzögerte Daten zukünftige Werte beeinflussen), als was .Ich würde versuchen,
xreg
für Ihre exogenen Variablen zu verwenden, vielleicht mit,arima
wennarimax
eine Übertragungsfunktion verlangt. Das Problem ist, dass Ihr Modell täglich ist, Ihre Daten jedoch sowohl die tägliche als auch die jährliche Saison haben, und ich bin mir derzeit nicht sicher, ob ein erster Unterschied (dieorder=(*, 1, *)
) dies erledigen wird oder nicht. (Mit einem Modell, das nur die tägliche Saisonabhängigkeit berücksichtigt, werden Sie auf keinen Fall magische Prognosen für das ganze Jahr erhalten.)PS Was ist das
time
, was du in deinem verwendestlm
? Wörtliche Uhrzeit oder eine 1-fache Beobachtungszahl? Ich denke, Sie könnten etwas mit einem Mischeffektmodell (lmer
imlme4
Paket) erreichen, obwohl ich nicht herausgefunden habe, ob dies die Autokorrelation, die in einer Zeitreihe auftreten wird, korrekt berücksichtigt. Wenn dies nicht berücksichtigt wirdlm
, erhalten Sie möglicherweise eine interessante Übereinstimmung, aber Ihr Konzept, wie genau Ihre Vorhersage ist, ist viel zu optimistisch.quelle