在R中的滞后变量

11
什么是在R中创建滞后变量矩阵的最有效方法,针对于任意变量(即不是一个常规的时间序列)?
例如: 输入:
x <- c(1,2,3,4) 

2个滞后项,输出:

[1,NA, NA]
[2, 1, NA]
[3, 2,  1]
[4, 3,  2]
4个回答

21

你可以使用内置的embed()函数实现此功能,其中第二个“dimension”参数相当于您所称的“滞后”:

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

之前由Joshua Reich在另一个回答中讨论了embed()函数。(请注意,我在x之前添加了NA以复制您所需的输出结果)。

虽然名称不是特别恰当,但对于涉及滑动窗口(例如滚动总和和移动平均值)的操作非常有用且功能强大。


2
更一般地说: lagmatrix <- function(x,max.lag){embed(c(rep(NA,max.lag),x),max.lag+1)} 然后使用 lagmatrix(1:4,2) - Rob Hyndman
感谢您指向嵌入函数。这让我节省了大量的计算时间。 - James in Ottawa

9
请使用适当的class来处理你的对象;基础R语言中有ts,其中包含lag()函数。请注意,这些ts对象来自一个时间,当时“delta”或“frequency”是恒定的:例如宏观经济数据中的月度或季度数据。

对于不规则数据,如(商业)日常数据,请使用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

但是詹姆斯想要一个矩阵而不是一个列表。您可以使用matrix(unlist(...))将结果打包,但是embed()函数可以一步完成。 - Rob Hyndman
完全正确,这就是为什么我在embed()解决方案出现时点赞的原因=)。但是我认为“running”仍然是一个有用的函数---大多数时候,当我想要创建James所要求的矩阵时,我真正想做的是在其上运行apply。 - Jonathan Chang

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接