Frage:
Vorhersage der Zeitreihenregression in R unter Verwendung von lm und lag
Andrew Mahurin
2014-04-04 11:28:49 UTC
view on stackexchange narkive permalink

Ich möchte anhand eines linearen Modells in R vorhersagen. Das Modell, das ich habe, hat die Form lm (y ~ lag (x)) . Es scheint, als ob ich in der Lage sein sollte, mithilfe der Vorhersagefunktion Vorhersagen zu treffen, aber dies blickt nicht in die Zukunft.

Hier ist die Verzögerungsfunktion, die ich innerhalb von R verwendet habe.

  lag1 = Funktion (x) c (NA, x [1: (Länge (x)) -1)])  

Diese Verzögerungsfunktion fügt am Anfang der Daten eine NA hinzu, verschiebt alles nach unten und schneidet die letzte Beobachtung ab.

Ich interessiere mich hauptsächlich für die Vorhersagen in der letzten Zeile der Daten. Diese Datenzeile scheint von den angepassten und Vorhersagefunktionen ignoriert zu werden.

Die beste Problemumgehung, die ich gefunden habe, bestand darin, jeden der Modellkoeffizienten mit jeder meiner abhängigen Variablen zu multiplizieren und sie für jede Vorhersage zu addieren. Keine der abhängigen Variablen ist zu diesem Zeitpunkt verzögert, als ich diese Gleichung aufstellte. Das Problem dabei ist, dass jedes Mal, wenn ich die Modellformel ändere, die Namen der Variablen geändert werden müssen, um mit der neuen Formel übereinzustimmen. Es scheint, dass es eine intuitivere Lösung dafür geben sollte.

Nicht sicher ob ich verstehe. Haben Sie der Funktion "dict ()" als zweites Argument neue "x" -Werte gegeben?
Geben Sie einfach die zukünftigen Regressorwerte in den Parameter "newdata" von "pred.lm ()" ein. Stellen Sie sicher, dass sie sich in einem "data.frame" mit denselben Namen befinden, wie sie in der Formel in "lm ()" verwendet werden.
@Stephan Kollasa, Für Zeitreihendaten funktioniert Ihre Lösung leider nicht.
Einer antworten:
mpiktas
2014-04-04 13:19:22 UTC
view on stackexchange narkive permalink

Das Schätzen mit Verzögerungen und das Verwenden des Modells zur Vorhersage ist ein wunder Punkt in der Basis R. Hier das Beispiel:

  set.seed (1) y<-ts (rnorm (10)) x< -ts (rnorm (10)) lm (y ~ x) Aufruf: lm (Formel = y ~ x) Koeffizienten: (Achsenabschnitt) x 0,2006 -0,2749 > lm (y ~ lag (x)) Aufruf: lm (Formel = y ~ lag (x)) Koeffizienten: (Intercept) lag (x) 0.2006 -0.2749  

Beachten Sie, dass das Ergebnis in beiden Fällen dasselbe ist. Dies geschieht aufgrund des etwas eigenartigen Verhaltens der Standardverzögerungsfunktion. Vergleichen Sie x und lag(x)

  xTime Series: Start = 1 End = 10 Frequency = 1 [1] 1.51178117 0.38984324 -0.62124058 -2.21469989 1.12493092 -0.04493361 -0.01619026 0.94383621 0.82122120 [10] 0.59390132> Verzögerung (x) Zeitreihe: Start = 0 Ende = 9 Frequenz = 1 [1] 1.51178117 0.38984324 -0.62124058 -2.2140129  

Wie Sie sehen, sind die Daten gleich, nur die Attribute, in diesem Fall die Zeit, sind unterschiedlich. Daher sieht der lm die gleichen Daten, da er die Attribute ignoriert. Es gibt verschiedene Möglichkeiten, um dieses Verhalten zu umgehen. Hier sind einige.

Zuerst können Sie die Daten in ein Zeitreihenformat konvertieren, für das das Verzögerungsverhalten "Standard" ist. Eines dieser Formate ist xts aus dem Paket xts :

  yy<-xts (y, as.Date (1:10)) xx< -xts (x, as.Date (1:10)) lm (yy ~ xx) Aufruf: lm (Formel = yy ~ lag (xx)) Koeffizienten: (Intercept) lag (xx) 0,2754 -0,2798  

Jetzt sehen, dass der Koeffizient anders ist, da lag die Daten jetzt korrekt verschiebt:

  lag (xx) [, 1] 1970-01- 02 NA1970-01-03 1.511781171970-01-04 0.389843241970-01-05 -0.621240581970-01-06 -2.214699891970-01-07 1.124930921970-01-08 -0.044933611970-01-09 -0.016190261970-01-10 0.94382 0,82122120  

Eine andere Möglichkeit besteht darin, die Regression mithilfe der Funktion dynlm aus dem Paket dynlm :

  dynlm (y ~ L (x) zu schätzen. ) Zeitreihenregression mit "ts" -Daten: Start = 2, Ende = 10 Anruf: Dynlm (Formel = y ~ L (x)) Koeffizienten: (Achsenabschnitt) L (x) 0,2754 -0,2798  

Dies deckt die Schätzung ab. Jetzt ist das Vorhersagen schwieriger. Um die angepassten Werte zu erhalten, können Sie einfach die Funktion Vorhersagen verwenden:

  vorhersagen (dynlm (y ~ L (x))) 2 3 4 5 6 7 8 9 10 -0,14757748 0,16632219 0,44920672 0,89503027 -0,03934318 0,28796556 0,27992365 0,01132412 0,04562977 Vorhersage (lm (yy ~ lag (xx))) 2 3 4 5 6 7 8 9 10 -0,14757748 0,16632219 0,44920672 0,8950346027000 > 

Voraussagen in der Zukunft sind jedoch ein Problem. Das Standardverhalten der Funktion vorhersagen besteht darin, das Argument newdata ​​code> zu erwarten. Für eine Prognose für einen Schritt voraus sind in diesem Fall jedoch keine neuen Daten erforderlich. Die Standardfunktion vorhersagen funktioniert in diesem Fall also nicht. Ich würde gerne eine allgemeine Lösung für dieses Problem sehen, aber meines Wissens bieten verschiedene Pakete verschiedene Möglichkeiten, um solche Prognosen zu erhalten. Wenn Sie die Funktion nicht selbst schreiben möchten, müssen Sie Ihr Modell in eine Form umwandeln, die von a gefordert wird spezifische Prognosefunktion aus einem bestimmten Paket. Und Sie müssen dieses Paket ziemlich gut kennen.

Eines dieser Pakete ist midasr (von denen ich Entwickler bin). Eine Schritt voraus Prognose für ein solches Modell würde folgendermaßen implementiert:

  midas_u (y ~ mls (x, 1,1)) Aufruf: lm (Formel = y ~ mls (x, 1, 1), Daten = ee) Koeffizienten: (Achsenabschnitt) mls (x, 1, 1) 0,2754 -0,2798 Prognose (midas_u (y ~ mls (x, 1,1)), neue Daten = Liste (x = NA)) [1] 0,1092301
 

Das Paket midasr arbeitet mit Daten mit gemischten Frequenzen. Die Funktion mls hat 3 Argumente, Daten, Verzögerungszahlen und Frequenzverhältnis. In diesem Fall ist die Häufigkeit gleich, daher ist das dritte Argument 1. In diesem Fall funktioniert die Funktion genau wie die Funktion lag für xts -Objekte. Für die Prognose müssen neue Daten angegeben werden. Da wir es nicht wissen, liefern wir die NA, die in diesem Fall funktioniert, da Prognosen mit einem Schritt voraus in diesem Fall nur die Daten benötigen, die wir bereits kennen.

Der letzte Wert von x ist 0,59390132, sodass Sie direkt überprüfen können, ob das Ergebnis das richtige ist.

  > 0,59390132 * (- 0,2798 ) +0.2754 [1] 0.1092264  

Die Antwort ist auf 4 Dezimalstellen korrekt, da ich die Koeffizienten mit 4-stelliger Genauigkeit verwendet habe.



Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...