r - 固定滚动窗口
问题描述
我想在 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 个不同的矩阵。
解决方案
您需要使用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)
推荐阅读
- mysql - MySQL 客户端连接
- ios - IONIC 应用程序未在 iPhone 设备 Xcode 10 中运行
- javascript - 如何在静态 yup 模式中使用动态变量?
- objective-c - 为什么我的 UILabels 文本会自动大写?
- javascript - 如何在云函数中使用 indexOn 从实时数据库中检索数据
- r - 使用 Rstudio 时解决这个问题的代码是什么?
- mongodb - 从 Google Compute Engine 通过远程连接 mongo
- javascript - 为什么 setState throw 对象作为 React 子对象无效?
- reactjs - 从 props 写入本地状态
- angular - 如何解决 Angular 6 中的路由和模块问题?