首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rollapply可以返回矩阵列表吗?

rollapply可以返回矩阵列表吗?
EN

Stack Overflow用户
提问于 2012-03-31 00:58:31
回答 3查看 2K关注 0票数 5

我想使用滚动窗口生成协方差矩阵(和均值向量)。但是在我的所有尝试中,rollapply堆叠了来自cov的协方差矩阵,并且用完了预先分配的空间(例如,如果我的原始数据有40个观察值,那么rollapply不能返回超过40行)。

有没有办法让rollapply返回一个矩阵列表?或者返回一个比原始data.frame更大的data.frame,我可以手动将其拆分为一个列表?我的最终目标是取一个面板,将面板分成一个单独的data.frame列表,计算每个数据帧的滚动协方差和均值,然后使用这些协方差列表和下游均值与一组个体进行比较。

下面是一些代码。我的问题是my.fun不会从所有协方差矩阵计算中返回数据。是我编写自己的rollapply的最佳选择吗?或者我自己的cov,它返回一个向量,然后再转换回一个矩阵?谢谢!

代码语言:javascript
复制
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)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-31 02:06:27

看了一下rollapply.zoo代码后,我认为没有办法让它做你想要的事情。不过,滚动你自己的函数并不那么困难(双关语)。

代码语言:javascript
复制
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))
票数 2
EN

Stack Overflow用户

发布于 2012-03-31 02:49:11

我意识到我可以欺骗rollapply返回一个向量,然后将该向量折回到一个矩阵中。诀窍是使用plyr包中的alply将向量折回矩阵。

代码语言:javascript
复制
library("plyr")
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$sic)
data.list <- lapply(data.list, zoo)
my.fun <- function(x) {
    x <- x[, c("one", "two", "three")]
    rollapply(x,
              width = 10, 
              function(x) as.vector(cov(x)),
              by.column = F, 
              align = "right")
}
my.fun.2 <- function(x) {
    alply(x, 1, matrix, nrow = sqrt(ncol(x)))
}
cov.list <- lapply(data.list, FUN = my.fun)
cov.list.2 <- lapply(cov.list, my.fun.2)

或者,对于数组列表,我可以用aaply替换alply

票数 2
EN

Stack Overflow用户

发布于 2012-03-31 02:54:28

删除第二个data.list<-并修改my.fun,以使给定的data.df具有以下内容(与原始内容相当接近):

代码语言:javascript
复制
data.list <- split(data.df, data.df$sic)
my.fun <- function(x) {
    z <- zoo(x[, c("one", "two", "three")], x$year)
    ccov <- function(x) c(cov(x))
    r <- rollapplyr(z, width = 10, FUN = ccov, by.column = FALSE)
    toMat <- function(tt) matrix(r[tt], ncol(z))
    sapply(paste(time(r)), toMat, simplify = FALSE) # sapply(char,...) adds names
}
cov.list <- lapply(data.list, FUN = my.fun)

编辑:略微简化。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9947301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档