首页 > 解决方案 > 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数字)。obsstats::corcorrr::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 个obsob包括第一个),我们最终得到 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 行),如何获得“真正的”完整运行滚动相关性?

标签: rdplyrcorrelationzoorolling-computation

解决方案


该函数应该返回一个向量,而不是一个矩阵。使用以下内容(如果您不希望结果被前导 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)
    

推荐阅读