【发布时间】:2012-04-14 09:27:23
【问题描述】:
我想使用滚动窗口生成协方差矩阵(和均值向量)。但在我所有的尝试中,rollapply 将来自cov 的协方差矩阵堆叠起来并用完预分配的空间(例如,如果我的原始数据有 40 个观察值,那么rollapply 不能返回超过 40 行)。
有没有办法让rollapply 返回矩阵列表?或者返回大于原始data.frame 的data.frame,我可以手动将其拆分为列表?我的最终目标是制作一个面板,将面板拆分为一个单独的data.frames 列表,计算每个数据框的滚动协方差和均值,然后使用这些协方差列表和均值下游与一群人进行比较。
这是一些代码。我的问题是my.fun 不会从所有协方差矩阵计算中返回数据。编写自己的rollapply 是我最好的选择吗?还是我自己的cov 返回一个我转换回矩阵的向量?谢谢!
library("zoo")
data.df <- data.frame(sic = rep(1:10, each = 40),
year = rep(1:40, len = 10*40),
one = rnorm(10*40),
two = 2*rnorm(10*40),
three = 3*rnorm(10*40))
data.list <- split(data.df, data.df$sic)
data.list <- lapply(data.list, zoo)
my.fun <- function(x) {
x <- x[, c("one", "two", "three")]
rollapply(x,
width = 10,
FUN = cov,
by.column = F,
align = "right")
}
cov.list <- lapply(data.list, FUN = my.fun)
【问题讨论】:
-
你能试着让你的目标更明确吗?之间的协方差究竟是什么?它没有出现在代码中您认为 data.list 有多少组?这会产生一个动物园系列:
my.fun(data.list[[1]])。这是您对 sic==1 小组的期望吗? -
@DWin 我想要一个基于 10 年移动窗口的每年每个 sic 的协方差矩阵。在这里拥有
zoo对象并没有什么神圣之处,我只是已经熟悉如何使用rollapply来生成标量。