Rolling correlation with 'grouped by' - Error: incorrect number of dimensions

Rolling correlation with 'grouped by' - Error: incorrect number of dimensions

我正在尝试根据每日库存数据计算五年 window 的滚动相关性。我的数据框 test 由 20 列组成,"logRet3" 位于第 17 列,"logMarRet3" 位于第 18 列。我想计算这两个 return 度量的相关性。

困难的是,我希望滚动相关性按第 1 列中的份额指标 "PERMNO" 分组。我的意思是,每当特定股票的时间序列数据结束时,滚动相关性 "restarts"。

通过研究,我使用 dplyrzoomagrittr 包得出了以下代码:

test <- test %>% 
  group_by(PERMNO) %>% 
  mutate(CorSecMar = zoo::rollapply(test, width = 1255, function(x) cor(x[,logRet3], x[,logMarRet3]), fill = NA, align = "right"))

但是,当我 运行 这段代码时,出现以下错误:

Error in x[,logMarRet3]: Incorrect number of dimensions

我是新手,我尝试通过删除 ,:

来调整代码
test <- test %>% 
  group_by(PERMNO) %>% 
  mutate(CorSecMar = zoo::rollapply(test, width = 1255, function(x) cor(x[logRet3], x[logMarRet3]), fill = NA, align = "right"))

导致以下错误(翻译成英文):

Error in x[logMarRet3]: Only zeros are allowed to be mixed with negative indices

任何有关如何修复这些错误的帮助或按组计算滚动相关性的替代方法将不胜感激。

编辑:感谢 G. Grothendieck 指出了我问题中的一些缺陷。我指的是他对可重复输入的回答,并将在以后的帖子中牢记这一点。

有几个问题:

  • rollapply 分别应用于每一列,除非使用 by.column = FALSE

  • group_by 中使用 test 不会导致 test 被子集化。它将引用整个数据集。请改用单独的列名称。

  • 问题代码中的列名必须用引号引起来;否则,它表示存在包含列名称的那些名称的变量。

  • 当 post 转向 SO 时,您需要将问题简化为一个完整的可重现示例,然后 post。这次我在最后的注释里给你做了。

参考注释,使用此代码:

library(dplyr)
library(zoo)

mycor <- function(x) cor(x[, 1], x[, 2])
DF %>%
  group_by(stock) %>%
  mutate(Cor = rollapplyr(cbind(a, b), 4, mycor, by.column = FALSE, fill = NA)) %>%
  ungroup

或者这个只使用动物园的代码。 mycor来自上方。

library(zoo)

n <- nrow(DF)
roll <- function(i) rollapplyr(DF[i, c("a", "b")], 4, mycor, by.column = FALSE, fill = NA)
transform(DF, Cor = ave(1:n, stock, FUN = roll))

备注

可重现形式的输入是:

DF <- data.frame(stock = rep(LETTERS[1:2], each = 6), a = 1:6, b = (1:6)^3)