我正在尝试“应用”一个在 R 中对动物园对象执行“滞后”的函数。
如果我传递一个动物园矢量,该函数可以正常工作 - 它应用了滞后并且一切正常。
但是,如果我apply( data, 1, function )
那么滞后不起作用。没有错误,只是相当于零延迟。
简单的情况也是如此apply( data, 1, lag )
。
谁能解释为什么会这样?我能做些什么来使滞后发生吗?
我正在尝试“应用”一个在 R 中对动物园对象执行“滞后”的函数。
如果我传递一个动物园矢量,该函数可以正常工作 - 它应用了滞后并且一切正常。
但是,如果我apply( data, 1, function )
那么滞后不起作用。没有错误,只是相当于零延迟。
简单的情况也是如此apply( data, 1, lag )
。
谁能解释为什么会这样?我能做些什么来使滞后发生吗?
这里有一些数据:
> x <- zoo(matrix(1:12, 4, 3), as.Date("2003-01-01") + 0:3)
> x
2003-01-01 1 5 9
2003-01-02 2 6 10
2003-01-03 3 7 11
2003-01-04 4 8 12
如果你想滞后这个多元时间序列,只需调用 lag (即无需申请):
> lag(x)
2003-01-01 2 6 10
2003-01-02 3 7 11
2003-01-03 4 8 12
如果你想跨行应用一个函数,它需要是明智的。例如,要获取行值的平均值:
> apply(x, 1, mean)
2003-01-01 2003-01-02 2003-01-03 2003-01-04
5 6 7 8
您不能应用动物园对象并取回动物园对象。apply 的输出是“一个向量或数组或值列表”。在上面的例子中:
> class(apply(x, 1, mean))
[1] "numeric"
您需要将其重新创建为动物园对象,然后将其滞后:
> lag(zoo(apply(coredata(x), 1, mean), index(x)))
2003-01-01 2003-01-02 2003-01-03
6 7 8
您需要稍微注意输出的方向。但是,如果需要,您可以使用该t()
功能对其进行转置。例如:
> zoo(t(apply(coredata(x), 1, quantile)), index(x))
0% 25% 50% 75% 100%
2003-01-01 1 3 5 7 9
2003-01-02 2 4 6 8 10
2003-01-03 3 5 7 9 11
2003-01-04 4 6 8 10 12
您也可以将其包装在一个函数中。或者,您可以使用xts
时间序列库中的应用函数之一(这将在过程中保留时间序列对象):
> x <- as.xts(x)
> apply.daily(x, mean)
[,1]
2003-01-01 5
2003-01-02 6
2003-01-03 7
2003-01-04 8
你为什么不尝试quantmod::Lag
生成一个矩阵的函数,该矩阵由一系列的各种滞后序列组成,具有不同的滞后值?例如
> quantmod::Lag (1:10, k=c(0,5,2))
将返回
Lag.0 Lag.5 Lag.2 [1,] 1 NA NA [2,] 2 NA NA [3,] 3 NA 1 [4,] 4 NA 2 [5,] 5 NA 3 [6,] 6 1 4 [7,] 7 2 5 [8,] 8 3 6 [9,] 9 4 7 [10,] 10 5 8
@Marek - lag(data) 确实做了我想做的事,但我希望能够将其用作“应用”构造的一部分,以使 vector->matrix 抽象更容易一些。