2009-08-21 122 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