2013-05-20 12 views
6

Próbuję lag matrycy:Dlaczego opóźnienie w r nie działa dla macierzy?

> B = matrix(c(2, 4, 3, 1, 5, 7), nrow=3, ncol=2) 
> B 
    [,1] [,2] 
[1,] 2 1 
[2,] 4 5 
[3,] 3 7 
> lag(B) 
    [,1] [,2] 
[1,] 2 1 
[2,] 4 5 
[3,] 3 7 

Dlaczego lag(B) nie poddawaj:

> lag(B) 
    [,1] [,2] 
[1,] 0 0 
[2,] 2 1 
[3,] 4 5 
+0

Zobacz także: http://r.789695.n4.nabble.com/Odd-results-with-lag-td3434712.html – harkmug

Odpowiedz

1
l <- matrix(0,nrow(B),nrow(B)) 
l[-1,-nrow(B)] <- diag(nrow(B)-1) 
l 
##  [,1] [,2] [,3] 
## [1,] 0 0 0 
## [2,] 1 0 0 
## [3,] 0 1 0 

l %*% B 
##  [,1] [,2] 
## [1,] 0 0 
## [2,] 2 1 
## [3,] 4 5 
+0

Dziękuję, ale staram się zrozumieć, dlaczego opóźnienie nie wydaje się działać – ManInMoon

+0

' lag' działa. Ponieważ jest przeznaczony do użycia w szeregach czasowych, zmienia atrybuty. –

+0

Nie rozumiem, co masz na myśli przez to, że zadziałało ... kiedy to robię, opóźnienie pracy "atrybuty" nie pojawiają się – ManInMoon

2

Nigdy nie rozumiałem lag funkcję, zamiast użyję Lag z quantmod pakietu :

> # library(quantmod) 
> apply(B, 2, Lag) 
    [,1] [,2] 
[1,] NA NA 
[2,] 2 1 
[3,] 4 5 

Jeśli chcesz (lub potrzebujesz) pozostawić macierz bez atrybutów ts w jedną stronę, możesz użyć apply i Lag z pakietu quantmod, ale jeśli nie chcesz instalować pakietu dla jednej funkcji, możesz napisać własną funkcję, pomysłem byłoby tak:

lag.matrix <- function(x, k=1){ 
    N <- ncol(B) 
    l <- matrix(embed(x,k+1)[, -c(1:(k*N))], ncol=N) 
    NAs <- matrix(rep(NA, k*N), ncol=N) 
    rbind(NAs, l) 
} 
> lag.matrix(B, k=1) 
    [,1] [,2] 
[1,] NA NA 
[2,] 2 1 
[3,] 4 5 
> lag.matrix(B, k=2) 
    [,1] [,2] 
[1,] NA NA 
[2,] NA NA 
[3,] 2 1 

Innym soluction może być wysłana jako jeden komentarz przez @GSee który wykorzystuje lag jak chcesz.

> lag(xts(B, .POSIXct(0)+0:(nrow(B)-1))) 
        [,1] [,2] 
1970-01-01 01:00:00 NA NA 
1970-01-01 01:00:01 2 1 
1970-01-01 01:00:02 4 5 
+0

Należy zauważyć, że 'Lag' i' lag.xts' są zasadniczo przeciwieństwem 'lag.zoo'. na przykład zauważ różnicę między 'lag (xts (B, .POSIXct (0) +0: 2))' i 'lag (zoo (B, .POSIXct (0) +0: 2))' – GSee

+0

@GZapraszamy dzięki za wyjaśnienie tego punkt, usunąłem tę część z mojej odpowiedzi, aby uniknąć nieporozumień. –

3

To właśnie z powodu opóźnienia przesuwa razy od obiektu, a nie wartości danych. Jest to naprawdę przeznaczone dla obiektów z szeregów czasowych.

Gdy lag jest używany na zwykłej macierzy, B, wywoływana jest metoda lag.default. Ponieważ nie ma czasu wiąże się ze zwykłego matrycy zakłada czasy są 1, 2, ..., NROW(B):

> time(B) 
[1] 1 2 3 
attr(,"tsp") 
[1] 1 3 1 

i przesuwa razy przez jednego tak, że teraz zaczynają się od 0:

> time(lag(B)) 
[1] 0 1 2 
attr(,"tsp") 
[1] 0 2 1 

użyć klasy szeregi czasowe jeśli chcesz łączyć obiekty, które mają czasy. (Pierwsza kolumna to razy w wyświetlaczach poniżej.)

> library(zoo) 
> 
> # zooreg - regular series or almost so 
> B.zr <- zooreg(B) 
> merge(B.zr, lag(B.zr)) 
    B.zr.1 B.zr.2 lag(B.zr).1 lag(B.zr).2 
0  NA  NA   2   1 
1  2  1   4   5 
2  4  5   3   7 
3  3  7   NA   NA 

> # zoo - irregular series 
> B.z <- zoo(B) 
> merge(B.z, lag(B.z)) 
    B.z.1 B.z.2 lag(B.z).1 lag(B.z).2 
1  2  1   4   5 
2  4  5   3   7 
3  3  7   NA   NA 

zauważyć różnicę pomiędzy lag.zooreg które mogą wykraczać poza zakres pierwotnych czasach wytwarzające 0 czas i lag.zoo który nie może, bo nie ma założenie regularności w ten drugi.

Możemy również użyć klasy ts, która zakłada regularność, więc można wyprodukować 0 razy, ale nie ma tutaj żadnej potrzeby.

1

EASIEST sposobem na opóźnienie macierzy w R jest użycie funkcji `embed() '. Oto krótki, powtarzalny przykład:

> # Create a 5x2 matrix 
> m <- replicate(2, 1:5) 
> m 
    [,1] [,2] 
[1,] 1 1 
[2,] 2 2 
[3,] 3 3 
[4,] 4 4 
[5,] 5 5 
> 
> # Use the 'embed()' function to lag the matrix 
> lag_m <- embed(m, 3) 
> lag_m 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 3 3 2 2 1 1 
[2,] 4 4 3 3 2 2 
[3,] 5 5 4 4 3 3 

Kilka ważnych słów o funkcji embed() i jej wynikach.

  • Funkcja ta jest wykorzystywana w następujący sposób: do umieszczenia (Matrix pozostają + 1)

Pierwszy argument funkcji jest macierzą chcemy opóźnienia. Drugi argument; jest to jednak liczba opóźnień, które chcemy "plus 1".Dlatego osadzenie (macierz, 3) oznacza, że ​​chcemy opóźnić matrycę o 2 okresy czasu.

  • Wyjście funkcji jest opóźniony matrycy i przebiega w następujący sposób:

. pierwsze dwie kolumny reprezentują oryginalną m macierz, ale liczba wierszy jest dostosowywana do liczby opóźnień (5 rzędów pierwotnie minus 2-okresowe opóźnienie)

. drugi zestaw kolumn (kolumny 3 i 4) to macierz opóźniona o 1 okres czasu

. trzeci zestaw kolumn (kolumny 5 i 6) to macierz opóźniona o 2 okresy czasu.