【问题标题】:R - Rolling correlation of each column with each other columnR - 每列与其他列的滚动相关性
【发布时间】:2021-01-16 04:19:28
【问题描述】:

您好,很抱歉提出这个问题,因为我认为这个问题的变体已经回答了很多次,但我似乎无法将这些应用于我的具体问题。

我有许多不同公司的大量股票回报时间序列,看起来像这样

library(tidyquant)
library(PerformanceAnalytics)

df = data.frame(tq_get("AAPL"))

ts = df[ , 3:8] %>%
     xts(order.by = as.Date(df[ , 2], "%Y-%m-%d")) %>%
     Return.calculate()

现在我需要在我的时间序列中将每一列与其他列进行滚动关联。 对于只有两列,以下工作完美

rollcor = rollapply(ts, 63, function(x) cor(x[ , 1],x[ , 2]), by.column=FALSE)

但我无法让它与 apply() 在列上一起工作,所以我尝试了一个 for 循环来将至少第一列与所有其他列关联起来

rollcors = data.frame(ts)
for(j in ncol(rollcors)) {
  rollcors[ , j] = rollapply(rollcors, 63, function(x) cor(x[ , 1],x[ , j]), by.column=FALSE, fill = NA)
}

但这不会像我希望的那样用包含相关性的新列替换每一列。

我还希望像现在一样保持输出垂直方向,以提高可读性。我的完美结果将是一个数据帧/时间序列列表,每个都包含一列与所有其他列的相关性,然后我可以进一步操作(每日中位数等)。

【问题讨论】:

    标签: r xts


    【解决方案1】:

    这提供了每个日期分解成一行的相关矩阵。将有 n*n 列,其中 ts 有 n 列:

    r1 <- rollapplyr(ts, 63, cor, fill = NA, by.column = FALSE)
    

    或者这将只显示下三角形并且将有选择(n,2)列:

    ccor <- function(x) { cc <- cor(x); cc[lower.tri(cc)] }
    r2 <- rollapplyr(X, 63, ccor, fill = NA, by.column = FALSE)
    

    如果需要,这可用于分配列名。

    paste_ <- function(...) paste(..., sep = "_")
    names_mat <- do.call("outer", list(names(ts), names(ts), paste_))
    names(r1) <- names_mat
    names(r2) <- names_mat[lower.tri(names_mat)]
    

    【讨论】:

    • 非常感谢,这正是我想要的。这是一件我从未想过的小事。
    • @Grothendieck 谢谢,解决方案很棒。但是,列名更改为 V1、V2 等,因此很难了解哪些列具有哪些相关性。您知道如何保留有意义的名称吗?
    • 最后添加了。
    猜你喜欢
    • 1970-01-01
    • 2014-06-26
    • 2021-09-05
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    相关资源
    最近更新 更多