代码之家  ›  专栏  ›  技术社区  ›  Homer Jay Simpson

如何使用dplyr计算同一分组变量中每个变量的相关性?

  •  0
  • Homer Jay Simpson  · 技术社区  · 3 年前

    假设我有一个包含8只股票的财务历史数据集,它们属于3类。我想使用dplyr软件包计算R中每组股票的相关性。

    library(tidyverse)
    library(tidyquant)
    Category = c("Social","Social","Internet","Technology",
                 "Technology","Internet","Internet")
    symbol = c("TWTR","FB","GOOG","TSLA","NOK","AMZN","AAPL")
    A = tibble(Category,symbol)
    B = tq_get(symbol, 
           from = "2021-01-01", 
           to = "2022-01-01")
    BA = left_join(B,A,by="symbol")
    BA%>%select(symbol,Category,close)
    

    几天前我发布了 this 类似的问题,但分组变量是数字,我的真实世界数据集不适用。理想的输出是这样的:

    类别 库存1 库存2 cor
    社会的 TWTR FB cor(TWTR,FB)
    互联网 谷歌 AMZN cor(GOOG,AMZN)
    互联网 谷歌 AAPL cor(GOOG,AMZN)
    互联网 AMZN AAPL cor(GOOG,AAPL)
    技术 TSLA NOK cor(TSLA,NOK)

    有什么帮助我可以用dplyr在R中做到这一点吗?

    可选数据

    var2 = c(rep("A",3),rep("B",3),rep("C",3),rep("D",3),rep("E",3),rep("F",3),
             rep("H",3),rep("I",3))
    
    y2 = c(-1.23, -0.983, 1.28, -0.268, -0.46, -1.23,
           1.87, 0.416, -1.99, 0.289, 1.7, -0.455,
           -0.648, 0.376, -0.887,0.534,-0.679,-0.923,
           0.987,0.324,-0.783,-0.679,0.326,0.998);length(y2)
    group2 = as.character(c(rep("xx",6),rep("xy",6),rep("xz",6),rep("xx",6)))
    data2 = tibble(var2,group2,y2);data2
    
    0 回复  |  直到 3 年前
        1
  •  2
  •   r2evans    3 年前

    一个简单的辅助功能,

    fun <- function(ticker, value, ...) {
      com <- combn(unique(ticker), 2)
      L <- split(value, ticker)
      data.frame(
        Stock1 = com[1,], Stock2 = com[2,],
        Corr = mapply(function(a, b) cor(a, b, ...), L[com[1,]], L[com[2,]])
      )
    }
    

    以及工作:

    library(dplyr)
    data2 %>%
      group_by(group2) %>%
      summarize(fun(var2, y2), .groups = "drop")
    # # A tibble: 8 x 4
    #   group2 Stock1 Stock2   Corr
    #   <chr>  <chr>  <chr>   <dbl>
    # 1 xx     A      B      -0.995
    # 2 xx     A      H      -0.958
    # 3 xx     A      I       0.853
    # 4 xx     B      H       0.982
    # 5 xx     B      I      -0.901
    # 6 xx     H      I      -0.967
    # 7 xy     C      D       0.469
    # 8 xz     E      F      -0.186
    

    快速验证:

    cor(filter(data2, var2 == "A")$y2, filter(data2, var2 == "B")$y2)
    # [1] -0.9949738