簡體   English   中英

使用 rollapply 計算滾動相關性

[英]Calculate rolling correlation using rollapply

我有 10000+ 行的動物園對象。

> head(tt)
                      A             B
2007-01-04  0.005945924  0.0021167475
2007-01-05 -0.004201991 -0.0080020024
2007-01-08  0.001740897  0.0045804104
2007-01-09  0.000000000 -0.0008163931
2007-01-10 -0.004503531  0.0032615812
2007-01-11 -0.005841138  0.0043863282

我嘗試了以下行的變體,但無濟於事。

rollapply(tt, 21, function(x) cor(x[,1],x[,2]))

每個條目的相關性為 1,看起來像是從相關矩陣的對角線中取出 1。

2013-11-25  1  1
2013-11-26  1  1
2013-11-27  1  1
2013-11-29  1  1
2013-12-02  1  1
2013-12-03  1  1

我真正想要的是-0.4649,如下所示

> cor(tt)
           A          B
A  1.0000000 -0.4649881
B -0.4649881  1.0000000

對於您的簡單情況,您可以使用TTR::runCor

set.seed(21)
x <- rnorm(30)
y <- rnorm(30)
z <- zoo(cbind(x,y),Sys.Date()-1:30)
tail(rollapplyr(z, 21, function(x) cor(x[,1],x[,2]), by.column=FALSE))
tail(runCor(z[,1],z[,2],21))

嘗試這樣的事情:

x<-rnorm(100)
y<-rnorm(100)
rollapply(data.frame(x,y), 21 ,function(x) cor(x[,1],x[,2]), by.column=FALSE)

換句話說,我認為您可能只需要by.column=FALSE參數。 也適用於動物園對象

rollapply(zoo(cbind(x,y),Sys.Date()-1:100), 21 ,function(x) cor(x[,1],x[,2]), by.column=FALSE)

編輯以解決有關添加另一列的評論中的問題。

您可以指定要在cor函數中使用的列。

z<-rnorm(100)
rollapply(zoo(cbind(x,y,z),Sys.Date()-1:100), 21 ,function(x) cor(x[,1],x[,3]), by.column=FALSE)
rollapply(zoo(cbind(x,y,z),Sys.Date()-1:100), 21 ,function(x) cor(x[,2],x[,3]), by.column=FALSE)

by.column=FALSE表示該函數不應單獨應用於每一列。 如果by.column=TRUE ,則該函數將分別應用於每一列,這是默認行為。

以下是如何計算6個月使用運行相關tq_transmute_xytidyquant包:

library(tidyquant)
    
x<-rnorm(100)
y<-rnorm(100)
    
zoo(cbind(x,y),Sys.Date()-1:100)
    
tq_transmute_xy(x = x, y = y, 
                mutate_fun = runCor,
                n = 6,
                col_rename = "rolling.corr.6")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM