r - zoo::rollapply 没有给出滚动相关的整个运行
问题描述
我试图做一些体力劳动来计算我自己的一些股票日志回报的滚动贝塔,并遇到了这个特殊的问题。为了实际重现此问题,我已将完整的数据集(csv
文件)粘贴到此处。
该数据集有一个日期列,但是当我进行计算时,我已将其排除在外。下面的代码片段将创建与我试验过的相同的数据集。
library(readr)
library(dplyr)
library(data.table)
test <- read_csv(YOUR_PATH_TO_MY_DATASET) %>%
select(-date) %>%
as.data.table
然后我对典型stats::cor
函数运行滚动应用。
library(zoo)
roll.cor <- rollapplyr(test,
width=50,
function(x) cor(x,
method="spearman"),
by.column=F)
我的输入列的长度是 1724(我们稍后会提到这个数字。)
现在这是有趣的一点。我发现,至少在(and ) 的情况下,rollingapply
唯一能填满输入矩阵的长度(不包括 的第一个width
数字)。obs
stats::cor
corrr::correlate
这就是我的意思:在我的示例中,我的窗口大小为 50,因此第一个相关性计算将采用obs
矩阵的前 50 个。例如test$A[1:50]
vstest$B[1:50]
等等。然后第二个计算将向前滚动 1ob
并变为test$A[2:51]
vstest$B[2:51]
然后我们有test$A[3:52]
vs test$B[3:52]
,test$A[4:53]
vstest$B[4:53]
等等。我们可以通过以下方式轻松证明这一点:
# following results match up with the result we get from rollapply.
cor(testA$[1:50], test$B[1:50], method="spearman")
# 0.6520358
cor(testA$[2:51], test$B[2:51], method="spearman")
# 0.662828385
cor(testA$[3:52], test$B[3:52], method="spearman")
# 0.655938477
由于该stats::cor
函数返回的相关矩阵的行数与变量数一样多,stats:cor
因此在我的情况下,每次运行都会给我 5 行。rollapply
停在第 335 次运行stats:cor
仅仅是因为335 * 5 = 1675 (1724 - 49 = 1675)
。如果我们取出前 50 个obs
(ob
包括第一个),我们最终得到 1675个obs
,并rollapply
决定在达到这个长度后停止。我们见证了这一点,
tail(roll.cor, n=5)
cor(test$A[335:384), test$B[335:384], method="spearman")
# 0.6806554
因此基本上rollapply
在第 335 处停止,obs
其余的obs
只是被丢弃(至少似乎是这样)。
尽管如此,我还是希望这种滚动机制会一直持续到我们达到最后 50 名obs
,即test$A[1675:1724]
vs test$B[1675:1724]
; 通过这个我们可以获得1675 * 5 = 8375
行数(回想一下,每次运行stats::cor
都会给出 5 行)。
这应该是rolling
工作方式R
吗?或者这是以前没有发现的东西?obs
给定我的数量(本例中为 8375 行),如何获得“真正的”完整运行滚动相关性?
解决方案
该函数应该返回一个向量,而不是一个矩阵。使用以下内容(如果您不希望结果被前导 NA 填充,则省略填充参数):
ccor <- function(x) c(cor(x, method = "spearman"))
rollapplyr(test, 50, ccor, by.column = FALSE, fill = NA)
还
require
只能在 if (...) 中使用。library
在您的示例中使用。这将使调试丢失包的存在变得更容易,因为在这种情况下,它将在library
语句处停止,而不是稍后在更难确定原因时停止。右指的分配箭头应该是左指的
在 zoo 的开发版本中,从 中指定的函数输出的矩阵或数据框(但不是普通列表)
FUN=
将被分解为向量,因此这将为每个输入行生成一行:# install.packages("zoo", repos="http://R-Forge.R-project.org") rollapplyr(test, 50, cor, method = "spearman", by.column = FALSE, fill = NA)
推荐阅读
- django - Django REST Serializer 使用错误的模型进行序列化
- python - python文件写入程序运行时如何更新桌面上的文件大小
- javascript - 使用 d3.js 更新表数据
- c# - C#捕获从不在进程中的函数返回的异常?
- r - 如何设置仅在输入 3 时才显示集合向量的函数?
- javascript - 如果 URI 没有改变,例如在单页应用程序上,如何检测用户是否在新页面上?
- angular - Angular Kendo UI 全局访问
- php - 内连接循环通过
- git - 如何 git rebase 从另一个分支直接到 master 分支?
- javascript - 受控数字比例映射