zoo::rollapply不提供整个滚动相关性运行
我试图做一些体力劳动来计算我自己的一些股票日志回报的滚动贝塔,结果遇到了这个奇怪的问题。 为了真实再现这个问题,我粘贴了完整的数据集(zoo::rollapply不提供整个滚动相关性运行,r,dplyr,correlation,zoo,rolling-computation,R,Dplyr,Correlation,Zoo,Rolling Computation,我试图做一些体力劳动来计算我自己的一些股票日志回报的滚动贝塔,结果遇到了这个奇怪的问题。 为了真实再现这个问题,我粘贴了完整的数据集(csv文件) 此数据集有一个日期列,但当我进行计算时,已将其排除在外。下面的代码片段将创建与我所做实验相同的数据集 library(readr) library(dplyr) library(data.table) test <- read_csv(YOUR_PATH_TO_MY_DATASET) %>% select(-date)
csv
文件)
此数据集有一个日期列,但当我进行计算时,已将其排除在外。下面的代码片段将创建与我所做实验相同的数据集
library(readr)
library(dplyr)
library(data.table)
test <- read_csv(YOUR_PATH_TO_MY_DATASET) %>%
select(-date) %>%
as.data.table
我的输入列的长度是1724(我们将很快返回到这个数字。)
现在是有趣的一点。
我发现,rollingapply
只填充了输入矩阵的长度(不包括obs
的第一个width
数量),至少在stats::cor
(和corrr::correlate
)的情况下是如此
我的意思是:在我的示例中,我的窗口大小是50,因此第一次相关计算将采用矩阵的前50个obs
。e、 g.test$A[1:50]
vstest$B[1:50]
等等。第二次计算将向前滚动一个ob
,变成test$A[2:51]
vstest$B[2:51]
然后我们有test$A[3:52]
vstest$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
,并且rollappy
决定在达到该长度后停止。我们见证了这一点
tail(roll.cor, n=5)
cor(test$A[335:384), test$B[335:384], method="spearman")
# 0.6806554
因此,基本上,rollappy
在obs
的第335位停止,剩下的obs
被丢弃(至少看起来是这样)
尽管如此,我还是希望这种滚动机制会一直持续到我们到达最后50个obs
,即test$A[1675:1724]
vstest$B[1675:1724]
;通过这一点,我们可以获得1675*5=8375
行数(回想一下,每次运行stats::cor
都会得到5行)
这应该是滚动
在R
中的工作方式吗?或者这是以前没有发现过的东西?
给定我的
OB的数量(本例为8375行),如何获得“真实”的完整运行滚动相关性?函数应返回向量,而不是矩阵。使用以下命令(如果不希望结果中填充前导NAs,请省略fill参数):
我只是编辑了问题细节,没有注意箭头;谢谢你的require vs library,我从来没有真正深入研究过它们之间的区别!现在对我来说太晚了,我稍后会尝试一下,然后再给你回复。谢谢它确实像我上面描述的那样工作,尽管不是我想要的那样;它跨越了25个向量/列,而不是5乘5的矩阵,无法识别实际的对,我只能借助启发式来猜测该列代表什么对。但这将是一个单独的问题。看看nr,坦率地说,我说不出话来;你的代码明确地向我展示了baseR
的力量,尤其是aperm
tidyverse
很好,但现在我必须深入研究R
本身。非常感谢!我还尝试了corrr::correlate
;它给了我一个嵌套列表的基于列的结果:ccor2%tidyr::unnest()
<然而,代码>corrr::correlate
比您向我展示的基本R
实现至少多花了1秒的时间。
tail(roll.cor, n=5)
cor(test$A[335:384), test$B[335:384], method="spearman")
# 0.6806554
ccor <- function(x) c(cor(x, method = "spearman"))
rollapplyr(test, 50, ccor, by.column = FALSE, fill = NA)
# install.packages("zoo", repos="http://R-Forge.R-project.org")
rollapplyr(test, 50, cor, method = "spearman", by.column = FALSE, fill = NA)