r - 与“分组依据”滚动相关 - 错误:维度数不正确
问题描述
我正在尝试根据每日库存数据计算五年窗口的滚动相关性。我的数据框test
由 20 列组成,"logRet3"
位于第 17 列和"logMarRet3"
第 18 列。我想计算这两个回报措施的相关性。
困难在于我希望滚动相关性按我"PERMNO"
在第 1 列中的份额指标进行分组。我的意思是,每当特定股票的时间序列数据结束时,滚动相关性就会“重新开始”。
通过研究,我想出了以下代码,使用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 指出我的问题中的一些缺陷。我指的是他对可重复输入的回答,并将在以后的帖子中记住这一点。
解决方案
有几个问题:
rollapply
除非使用,否则分别适用于每一列by.column = FALSE
。使用
test
withingroup_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)
推荐阅读
- css - 旋转元素上的 Safari 渲染问题
- objective-c - 使用 URL 传递参数
- c++ - 从 cmd 运行 cl.exe
- php - 如果日期是 20/2/1998 和 51,如何从 php 示例中的日期获取天数(如年份)?
- excel - 如何在excel中比较一个句子中的多个单词
- node.js - 由于身份验证失败,参考私有存储库 vsts git 存储库在 docker 中运行 package.json 失败
- python - Pandas 读取 JSON 导致值转换为科学计数法
- authentication - 令牌格式无效
- ios - 屏幕锁定时推送通知到达后是否执行操作?
- amazon-web-services - 停止 ec2 实例后,sonarqube docker 容器的设置丢失