固定滚动 window

fixed rolling window

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

      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

我知道下面的函数会给我一个扩展window:

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

为了得到固定的 window 内部有四个句点,我尝试了以下函数:

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 中,因此在这个例子中 all.cov.matrix 应该存储 5 个不同的矩阵。

您需要使用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)

如果您的扩展 window 示例接近您想要的,您可以通过一些细微的调整使其工作,让 "window" 以您想要的方式滚动:

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

1:y 的方式意味着 window 总是从 1 开始,而 y 每次迭代都会增加,这意味着 window 会扩展.将其更改为 (y-1):(y+2) 意味着 window 的起点和终点都与 y 一起移动,始终使 window 的大小为 4

注意不要超出数据的边界,我们还需要将lapply(第一个参数)中的向量改为X,使得[=26]的边缘=]留在数据内。