zoo::rollapply 没有给出完整的 运行 滚动相关性

zoo::rollapply does not give the entire run of rolling correlation

我试图做一些体力劳动来计算我自己的一些股票日志的滚动 beta returns 并遇到了这个特殊问题。 为了实际重现这个问题,我粘贴了我的完整数据集(csv 文件)here.

此数据集有一个日期列,但在我进行计算时已将其排除。下面的代码片段将创建与我试验过的相同的数据集。

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(我们稍后会提到这个数字。)

下面是有趣的部分。 我发现 rollingapply 只填满了输入矩阵的长度(不包括 obs 的第一个 width 数),至少在 stats::cor 的情况下是这样(和 corrr::correlate)。

这就是我的意思:在我的例子中,我的 window 大小是 50,因此第一个相关计算将采用矩阵的前 50 obs。例如test$A[1:50]test$B[1:50] 等等。然后第二个计算将向前滚动一个 ob 并变成 test$A[2:51] vs test$B[2:51] 然后我们有 test$A[3:52] vs test$B[3:52], test$A[4:53] vs test$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 函数 returns 一个与变量数量一样多的行的相关矩阵,stats:cor 的每个 运行 都会给我 5 行案件。 rollapplystats:cor 的第 335 运行 处停止,仅仅是因为 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

因此基本上 rollapplyobs 的第 335 处停止,而 obs 的其余部分被丢弃(至少看起来是这样)。

我仍然希望这种滚动机制能够一直持续到我们达到最后 50 个 obs,即 test$A[1675:1724] vs test$B[1675:1724];通过这个我们将获得 1675 * 5 = 8375 行数(回想一下 stats::cor 的每个 运行 给出 5 行)。

这应该是 rollingR 中的工作方式吗?或者这是以前没有发现的东西? 鉴于我的 obs 数量(本例为 8375 行),如何获得“真实的”完整 运行 滚动相关性?

该函数应该 return 一个向量,而不是矩阵。使用以下内容(如果您不想用前导 NA 填充结果,则省略 fill 参数):

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)