我想使用滚动窗口生成协方差矩阵(和平均向量).但是在我的所有尝试中,rollapply堆叠协方差矩阵cov并用尽预先分配的空间(例如,如果我的原始数据有40个观察值,则rollapply不能返回超过40行).
有没有办法可以rollapply返回矩阵列表?或者返回一个data.frame大于原始的data.frame,我可以手动拆分成一个列表?我的最终目标是采用一个面板,将面板分成一个单独data.frame的列表,计算每个数据框的滚动协方差和平均值,然后使用这些协方差列表和下游方法与一群人进行比较.
这是一些代码.我的问题是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)
Run Code Online (Sandbox Code Playgroud)
浏览完rollapply.zoo代码后,我认为没有办法让它做你想要的事情。不过,滚动你自己的函数并不那么困难(双关语)。
rollcov <- function(x, width=10) {
len <- NROW(x)
add <- rep(1:(len-width)-1,each=width)
seq.list <- split(rep(1:width,len-width)+add, add)
lapply(seq.list, function(y) cov(x[y,]))
}
rollcov(data.list[[1]][,c("one","two","three")],10)
all <- lapply(data.list, function(x) rollcov(x[,c("one","two","three")],10))
Run Code Online (Sandbox Code Playgroud)