2009-08-21 9 views
11

Co to jest najbardziej skuteczny sposób, aby macierz opóźnionych zmiennych w R dla dowolnego zmiennej (czyli nie regularny szeregów czasowych)otulina Zmienne w R

Na przykład:

Wejście :

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

2 opóźnienia, wyjście:

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

Odpowiedz

21

Można to osiągnąć za pomocą wbudowanego w embed() funkcji, gdy jego drugi „wymiar” argument jest równoznaczne z tym, co Wcześniej nazywany 'lag':

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() został omówiony w previous answer Joshua Rzeszy. (Zauważ, że dodałem x z NA, aby powielić pożądane wyniki).

Nie jest szczególnie dobrze nazwany, ale jest bardzo użyteczny i wydajny w operacjach obejmujących okna przesuwne, takie jak sumy kroczące i średnie ruchome.

+2

Bardziej ogólnie: lagmatrix <- function (x, max.lag) {embed (c (rep (NA, max.lag), x), max.lag + 1)} Następnie użyj lagmatrix (1: 4,2) –

+0

Dzięki za wskaźnik do funkcji osadzania. Oszczędzało to dla mnie ogromną ilość czasu obliczeniowego. –

8

Użyj odpowiedniego class dla swoich obiektów; baza R ma ts, na której działa funkcja lag(). Należy zauważyć, że obiekty te pochodziły z czasu, gdy "delta" lub "częstotliwość", gdzie dane stałe: miesięczne lub kwartalne, jak w seriach makroekonomicznych.

W przypadku nieregularnych danych, takich jak dzienna (biznesowa), należy używać pakietów zoo lub xts, które mogą również (bardzo dobrze!) Z opóźnieniami. Aby przejść dalej, możesz użyć pakietów takich jak dynlm lub dlm, aby umożliwić modelom regresji dynamicznej z opóźnieniami.

Widoki zadań w szeregach czasowych, ekonometrii, finansach - wszystkie mają dalsze wskaźniki.

2

running funkcja w pakiecie gtools ma mniej więcej to, co chcesz:

> 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

Ale James nie chciał macierzy listy. Możesz spakować wynik przy użyciu macierzy (unlist (...)), ale funkcja embed() wykonuje ją w jednym kroku. –

+0

Zupełnie w porządku, dlatego wznowiłem rozwiązanie embed() po jego wyjściu =). Ale "bieganie" nadal jest przydatną funkcją, którą myślę - w większości przypadków, gdy chciałem stworzyć matrycę, o którą poprosił James, naprawdę chciałem uruchomić. –

1

Metoda, która najlepiej mi odpowiada to użycie funkcji lag z pakietu dplyr.

Przykład:

> 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