【问题标题】:Calculate rolling correlation using rollapply使用 rollapply 计算滚动相关性
【发布时间】:2014-01-08 13:25:34
【问题描述】:

我有超过 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

【问题讨论】:

    标签: r zoo


    【解决方案1】:

    对于您的简单情况,您可以使用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))
    

    【讨论】:

      【解决方案2】:

      试试这样的:

      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,则函数将分别应用于每一列,这是默认行为。

      【讨论】:

      • 它有效! by.column 选项到底是做什么的?如果我有一个 3x3 cor 矩阵,如何获得正确的相关性?
      • @Jota,感谢 cmets,我向 Joshua Ulrich 询问了关于更多专栏的相同问题,然后看到您的修改,所以我只是删除了它,抱歉。如果我有 100 列数据,是否有更有效的方法来运行 cor 函数而不是指定每一对?可以使用其中一种 apply 系列函数来实现这一点吗?
      • 你可以在rollapply中使用这个函数来处理任意数量的列:function(x) cor(x)[lower.tri(cor(x))]
      【解决方案3】:

      以下是使用 tidyquant 包中的 tq_transmute_xy 计算 6 个月运行相关性的方法:

      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")
      

      【讨论】:

      • 您需要在代码中添加解释以便更好地理解
      猜你喜欢
      • 1970-01-01
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 2018-12-29
      • 2014-05-22
      • 1970-01-01
      • 1970-01-01
      • 2019-11-06
      相关资源
      最近更新 更多