我想创建一个函数,生成一个包含多个变量滞后的矩阵。一个有效的简单例子是
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个列表是滞后序列的复制。
有任何关于让这项工作的建议吗?谢谢!
答案 0 :(得分:3)
这给出了0和1的滞后。
library(zoo)
a <- ts(11:13)
lags <- -(0:1)
a.lag <- as.ts(lag(as.zoo(a), lags))
现在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)))
。
答案 1 :(得分: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
答案 2 :(得分: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