固定滚动窗口

时间:2018-06-15 13:42:15

标签: r fixed rolling-computation

我想在r中构建一个固定的滚动窗口。假设我有这样的数据集:

      Apple Microsoft     Amazon      Tesla
2000 0.91903890 0.5454254 0.22267026 0.41857974
2001 0.13638076 0.7640585 0.56990815 0.04490846
2002 0.19977390 0.9170585 0.04391331 0.72987722
2003 0.70627675 0.2583974 0.03485766 0.35594681
2004 0.08069703 0.2085965 0.19865918 0.30194120
2005 0.03334810 0.7955248 0.75876036 0.28129544
2006 0.94652374 0.6095904 0.98855677 0.36792881
2007 0.90060660 0.3144541 0.78201742 0.02731390

我知道以下功能会给我一个扩展窗口:

 all.cov.matrix <- lapply(1:nrow(stocks), function(y) cov(stocks[1:y,]))

要获得一个内部有四个句点的固定窗口,我尝试了以下功能:

library(zoo)     
all.cov.matrix <- apply(rollapply(1:nrow(stocks), 4, c), 1, function(ix) cov(stocks[ix, ]))
    # However, this returns one big matrix, that is not what I am looking for. 
    # Ideally I want to get the following results:
     cov(stocks[1:4,]) # 1 period
     cov(stocks[2:5,]) # 2 period and so on

我希望每个矩阵分别存储在all.cov.matrix中,因此在thix示例all.cov.matrix中应该存储5个不同的矩阵。

2 个答案:

答案 0 :(得分:3)

您需要使用apply(..., margin = 2, ...)来获得柱状协方差。但是,我不推荐apply。您可以使用lapply代替,即

library(zoo)
lapply(as.data.frame(t(rollapply(1:nrow(stocks), 4, c))), function(i) cov(stocks[i,]))

另一种写这种方式(根据@ G.Grothendieck评论),

r <- rollapplyr(stocks, 4, function(x) c(cov(x)), by.column = FALSE)
lapply(split(r, row(r)), matrix, 4)

答案 1 :(得分:3)

如果您的扩展窗口示例接近您想要的,您可以通过稍微调整使其工作,以使“窗口”滚动您想要的方式:

all.cov.matrix <- lapply( 2:(nrow(stocks)-2),
                          function(y) {
                              cov(stocks[(y-1):(y+2),])
                          } )

您拥有1:y的方式意味着窗口始终以1开始,而y每次迭代都会增加,这意味着窗口会扩展。将其更改为(y-1):(y+2)表示窗口的起点和终点都与y一起移动,始终创建一个大小为4的窗口。

要注意不要超出数据的范围,我们还需要在X(第一个参数)中更改为lapply向量,以使窗口的边缘保持在数据范围内