2012-08-23 67 views
1

我想創建一個函數,該函數生成一個包含多個變量滯後的矩陣。一個可行的簡單的例子是do.call用cbind和變量的延遲

a <- ts(1:10) 
cbind(a, lag(a, -1)) 

爲多個滯後做到這一點,我有

lagger <- function(var, lags) { 

    ### Create list of lags 
    lagged <- lapply(1:lags, function(x){ 
    lag(var, -x) 
    }) 

    ### Join lags together 
    do.call(cbind, list(var, lagged)) 
} 

使用上面的例子給出了意想不到的效果;

lagger(a, 1) 

給出了長度爲20列表與原來的時間序列分解成單獨的列表時隙和最後10各自爲滯後系列的一個複製。

有任何建議來獲得幫助?謝謝!

回答

3

這給出了0和1的滯後

library(zoo) 
a <- ts(11:13) 
lags <- -(0:1) 

a.lag <- as.ts(lag(as.zoo(a), lags)) 

Now a.lag是這樣的:

> a.lag 
Time Series: 
Start = 1 
End = 4 
Frequency = 1 
    lag0 lag-1 
1 11 NA 
2 12 11 
3 13 12 
4 NA 13 

如果你不想NA條目,然後使用:as.ts(na.omit(lag(as.zoo(a), lags)))

+0

嗯,我想我現在可以停止對嵌入代碼的黑客行爲了。這是我認爲OP的想法。 –

1

我不確定你的功能有什麼問題,但你可以用embed代替。

> embed(a,4) 
    [,1] [,2] [,3] [,4] 
[1,] 4 3 2 1 
[2,] 5 4 3 2 
[3,] 6 5 4 3 
[4,] 7 6 5 4 
[5,] 8 7 6 5 
[6,] 9 8 7 6 
[7,] 10 9 8 7 
2

基於@Joshua Ulrich的回答。

我認爲嵌入是正確的答案,但你以相反的方式得到載體。我的意思是使用embed你會得到滯後的一系列不按正確的順序,請參閱以下

lagged <- embed(a,4) 
colnames(lagged) <- paste('t', 3:0, sep='-') 
lagged 
    t-3 t-2 t-1 t-0 
[1,] 4 3 2 1 
[2,] 5 4 3 2 
[3,] 6 5 4 3 
[4,] 7 6 5 4 
[5,] 8 7 6 5 
[6,] 9 8 7 6 
[7,] 10 9 8 7 

這給正確的答案給你,但不是在正確的順序,因爲滯後按降序排列。

但你重新排列就像這樣:

lagged_OK <- lagged[,ncol(lagged):1] 
colnames(lagged_OK) <- paste('t', 0:3, sep='-') 
lagged_OK 
    lag.0 lag.1 lag.2 lag.3 
[1,]  1  2  3  4 
[2,]  2  3  4  5 
[3,]  3  4  5  6 
[4,]  4  5  6  7 
[5,]  5  6  7  8 
[6,]  6  7  8  9 
[7,]  7  8  9 10 

然後,你得到正確的滯後矩陣。

我只爲說明目的添加colnames,你可以這樣做:

embed(a,4)[ ,4:1] 

如果你真的想要一個lagger功能,試試這個

lagger <- function(x, lag=1){ 
     lag <- lag+1 
     Lagged <- embed(x,lag)[ ,lag:1] 
     colnames(Lagged) <- paste('lag', 0:(lag-1), sep='.') 
     return(Lagged) 
     } 


lagger(a, 4) 
    lag.0 lag.1 lag.2 lag.3 lag.4 
[1,]  1  2  3  4  5 
[2,]  2  3  4  5  6 
[3,]  3  4  5  6  7 
[4,]  4  5  6  7  8 
[5,]  5  6  7  8  9 
[6,]  6  7  8  9 10 

lagger(a, 1) 
     lag.0 lag.1 
[1,]  1  2 
[2,]  2  3 
[3,]  3  4 
[4,]  4  5 
[5,]  5  6 
[6,]  6  7 
[7,]  7  8 
[8,]  8  9 
[9,]  9 10