1

我正在尝试“应用”一个在 R 中对动物园对象执行“滞后”的函数。

如果我传递一个动物园矢量,该函数可以正常工作 - 它应用了滞后并且一切正常。

但是,如果我apply( data, 1, function )那么滞后不起作用。没有错误,只是相当于零延迟。

简单的情况也是如此apply( data, 1, lag )

谁能解释为什么会这样?我能做些什么来使滞后发生吗?

4

3 回答 3

3

这里有一些数据:

 > 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
于 2009-09-25T11:43:05.733 回答
1

你为什么不尝试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
于 2011-02-06T20:22:24.253 回答
0

@Marek - lag(data) 确实做了我想做的事,但我希望能够将其用作“应用”构造的一部分,以使 vector->matrix 抽象更容易一些。

于 2009-09-25T09:17:00.973 回答