我正在尝试根据每日库存数据在五年窗口内计算滚动相关性。我的数据框test
由20列组成,其中"logRet3"
位于#17列中,而"logMarRet3"
位于#18中。我想计算这两种回报率的相关性。
让我感到困难的是,我希望将滚动相关性按列#1中的份额指标"PERMNO"
进行分组。我的意思是,只要特定股票的时间序列数据结束,滚动相关就会“重新开始”。
通过研究,我使用dplyr
,zoo
和magrittr
软件包得出了以下代码:
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指出了我的问题中的一些缺陷。我指的是他关于可重复输入的答案,并将在以后的帖子中牢记。
答案 0 :(得分:1)
有几个问题:
rollapply
,否则 by.column = FALSE
分别适用于每一列。
在test
中使用group_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
或仅使用Zoo的此代码。 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)