首页 > 解决方案 > 与“分组依据”滚动相关 - 错误:维度数不正确

问题描述

我正在尝试根据每日库存数据计算五年窗口的滚动相关性。我的数据框test由 20 列组成,"logRet3"位于第 17 列和"logMarRet3"第 18 列。我想计算这两个回报措施的相关性。

困难在于我希望滚动相关性按我"PERMNO"在第 1 列中的份额指标进行分组。我的意思是,每当特定股票的时间序列数据结束时,滚动相关性就会“重新开始”。

通过研究,我想出了以下代码,使用dplyr,zoomagrittr包:

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 指出我的问题中的一些缺陷。我指的是他对可重复输入的回答,并将在以后的帖子中记住这一点。

标签: rdplyrfinancerolling-computation

解决方案


有几个问题:

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

  • 使用testwithingroup_by不会导致test子集化。它将引用整个数据集。请改用单个列名。

  • 问题代码中的列名必须有引号;否则,就是说这些名称的变量包含列名。

  • 发布到 SO 时,您需要将问题简化为完整的可重现示例并发布。这次我已经在最后的注释中为您完成了。

参考注释,使用以下代码:

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)

推荐阅读