2009-08-21 117 views
11

什麼是最有效的方法,使R中滯後變量的對任意可變的矩陣(即,不是一個固定的時間系列)滯後變量

例如:

輸入

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

2滯後,輸出

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

回答

21

可以使用達到這個內置embed()功能,其中它的第二個「尺寸」的說法就相當於你「VE所謂的 '滯後':

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()由約書亞帝國在previous answer討論。 (請注意,我用NAs前綴x來複制所需的輸出)。

它不是特別有名,但對於涉及滑動窗口的操作(例如滾動平均值和移動平均值)非常有用且功能強大。

+2

更一般地說: lagmatrix < - function(x,max.lag){embed(c(rep(NA,max.lag),x),max.lag + 1)} 然後使用lagmatrix(1:4,2 ) – 2009-08-23 05:58:10

+0

感謝您指向嵌入函數的指針。這爲我節省了大量的計算時間。 – 2009-08-27 15:17:33

8

使用正確的class作爲對象;基地R有ts其中有一個lag()函數來操作。請注意,這些對象來自'delta'或'frequency'常數:宏觀經濟系列中的月度或季度數據。

對於不規則的數據,例如(business-)每天,使用zooxts包,這也可以處理(非常好!)滯後。要從那裏走得更遠,可以使用如dynlmdlm這樣的包,從而允許具有滯後的動態迴歸模型。

時間序列,計量經濟學,金融的任務觀點都有進一步的指示。

2

gtools包中的running功能也或多或少你想要什麼:

> 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

但詹姆斯想要一個矩陣不是列表。您可以使用矩陣(unlist(...))打包結果,但embed()函數只需一步即可完成。 – 2009-08-23 05:56:07

+0

完全正確,這就是爲什麼我upvoted的embed()解決方案,當它出來=)。但是,「跑步」仍然是一個有用的功能 - 大多數時候,當我想要創建詹姆斯要求的矩陣時,我真正想要做的就是運用它。 – 2009-08-23 16:46:01

1

最適合我的方法 是使用dplyr包中的lag函數。

例子:

> 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