固定滚动窗口

问题描述 投票:0回答:2

我想构建R A固定的滚动窗口。说我有一个这样的数据集:

      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.matrixshould 5个不同的矩阵。

r fixed rolling-computation
2个回答
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)

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的窗口。

要小心,不要超越数据的范围,我们还需要改变Xlapply向量(第一个参数),使得数据中的窗口逗留的边缘。

© www.soinside.com 2019 - 2024. All rights reserved.