【问题标题】:fixed rolling window固定滚动窗口
【发布时间】:2018-11-25 08:58:02
【问题描述】:

我想在 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 个不同的矩阵。

【问题讨论】:

  • 错误:找不到函数“rollapply”
  • @AndreElrico 现在应该可以工作了

标签: r fixed rolling-computation


【解决方案1】:

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

【讨论】:

  • @Sotos 谢谢,我尝试了你的建议,它似乎按我想要的方式工作
【解决方案2】:

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

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

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

【讨论】:

  • 当我尝试你的建议时,当我想查看矩阵时它返回 NULL
  • 为了简单起见:lapply(4:nrow(stocks), function(i) cov(stocks[(i-3):i,]))
  • 我检查了@rosscova 的答案,它返回的结果与 Sotos 的解决方案相同。
猜你喜欢
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
  • 2018-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多