2009-08-21 18 views
11

Was die effizienteste Art und Weise ist eine Matrix von verzögerten Variablen in R für eine beliebige Variable (dh keine reguläre Zeitreihe)Lagging Variablen in R

Zum Beispiel zu machen:

Eingang :

x <- c(1,2,3,4) 

2 lags, Ausgabe:

[1,NA, NA] 
[2, 1, NA] 
[3, 2, 1] 
[4, 3, 2] 

Antwort

21

Sie dies erreichen können mit dem eingebauten in embed() Funktion, wo sein zweites ‚Dimension‘ Argument, was Sie entspricht Lag 'habe genannt':

x <- c(NA,NA,1,2,3,4) 
embed(x,3) 

## returns 
    [,1] [,2] [,3] 
[1,] 1 NA NA 
[2,] 2 1 NA 
[3,] 3 2 1 
[4,] 4 3 2 

embed() wurde in einem previous answer von Joshua Reich diskutiert. (Beachten Sie, dass ich x mit NAs vorangestellt habe, um die gewünschte Ausgabe zu replizieren).

Es ist nicht besonders gut benannt, aber es ist sehr nützlich und leistungsfähig für Operationen mit gleitenden Fenstern, wie rollende Summen und gleitende Durchschnitte.

+2

Allgemeiner: Lagmatrix <- Funktion (x, max.Lage) {Einbetten (c (rep (NA, max.Lage), x), max.Lage + 1)} Dann Lagmatrix (1: 4,2) –

+0

Danke für den Zeiger auf die Embed-Funktion. Das hat mir eine Menge Rechenzeit gespart. –

8

Verwenden Sie eine geeignete class für Ihre Objekte; Base R hat ts, die eine lag() Funktion hat, um zu arbeiten. Beachten Sie, dass diese ts Objekte aus einer Zeit stammen, in der "Delta" oder "Häufigkeit" konstant ist: monatliche oder vierteljährliche Daten wie in makroökonomischen Reihen.

Für unregelmäßige Daten wie (Geschäfts-) täglich, verwenden Sie die zoo oder xts Pakete, die auch (sehr gut!) Mit Verzögerungen umgehen können. Um von dort weiter zu gehen, können Sie Pakete wie dynlm oder dlm für dynamische Regressionsmodelle mit Verzögerungen zulassen.

Die Task Ansichten auf Zeitreihe, Ökonometrie, Finanzen haben alle weitere Hinweise.

2

Die running Funktion im gtools Paket nicht mehr oder weniger, was Sie wollen:

> require("gtools") 
> running(1:4, fun=I, width=3, allow.fewer=TRUE) 

$`1:1` 
[1] 1 

$`1:2` 
[1] 1 2 

$`1:3` 
[1] 1 2 3 

$`2:4` 
[1] 2 3 4 
+0

Aber James eine Matrix keine Liste wollte. Sie könnten das Ergebnis mit Hilfe von Matrix (unlist (...)) verpacken, aber die embed() Funktion macht es in einem Schritt. –

+0

Völlig richtig, weshalb ich die embed() Lösung upvoted, als es herauskam =). Aber "running" ist immer noch eine nützliche Funktion, denke ich. Die meiste Zeit, wenn ich die Matrix erstellen wollte, nach der James gefragt hat, was ich wirklich machen wollte, war, dass ich sie anwenden sollte. –

1

Die am besten für mich geeignete Methode ist die Verwendung der lag-Funktion aus dem dplyr-Paket.

Beispiel:

> require(dplyr) 
> lag(1:10, 1) 
[1] NA 1 2 3 4 5 6 7 8 9 
> lag(1:10, 2) 
[1] NA NA 1 2 3 4 5 6 7 8