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.