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 行案件。 rollapply
在 stats: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
因此基本上 rollapply
在 obs
的第 335 处停止,而 obs
的其余部分被丢弃(至少看起来是这样)。
我仍然希望这种滚动机制能够一直持续到我们达到最后 50 个 obs
,即 test$A[1675:1724]
vs test$B[1675:1724]
;通过这个我们将获得 1675 * 5 = 8375
行数(回想一下 stats::cor
的每个 运行 给出 5 行)。
这应该是 rolling
在 R
中的工作方式吗?或者这是以前没有发现的东西?
鉴于我的 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)
我试图做一些体力劳动来计算我自己的一些股票日志的滚动 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 行案件。 rollapply
在 stats: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
因此基本上 rollapply
在 obs
的第 335 处停止,而 obs
的其余部分被丢弃(至少看起来是这样)。
我仍然希望这种滚动机制能够一直持续到我们达到最后 50 个 obs
,即 test$A[1675:1724]
vs test$B[1675:1724]
;通过这个我们将获得 1675 * 5 = 8375
行数(回想一下 stats::cor
的每个 运行 给出 5 行)。
这应该是 rolling
在 R
中的工作方式吗?或者这是以前没有发现的东西?
鉴于我的 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)