R Dplyr解决方案,以summary_at相关

时间:2019-04-22 16:39:47

标签: r dplyr

我试图通过(group_by)MktDate计算数据帧中所有列与另一列的相关性(安全性返回)。

我尝试了许多dplyr解决方案,但不能完全使关联示例正常工作,但使用均值正常运行示例没有问题。

这可以通过指定的列计算平均值

MyMeanTest <- MyDataTest %>%
filter(MktDate >='2009-12-31') %>%
group_by(MktDate) %>%
summarize_at(c('RtnVol_EM','OCFROI_EM'),mean,na.rm=TRUE)

这不起作用。本质上,我想要指定的列的相关性,该列由MktDate与列FwdRet_12M分组。我收到以下错误消息- summarise_impl(.data,点)中的错误:   评估错误:并非所有参数的长度都相同。

MyCorTest <- MyDataTest %>%
  group_by(MktDate) %>% 
summarize_at(c('RtnVol_EM','OCFROI_EM'),funs(cor(.,MyDataTest$FwdRet_12M,use="pairwise.complete.obs", "spearman")))

在上面的代码示例中,我应该以这样的结尾 MktDate,RtnVol_EM,OCFROI_EM ...

这里有一些示例代码,应该有助于理解数据的结构和最终目标。

MyDataTest <- structure(list(MktDate = structure(c(17896, 17896, 17896, 17896, 
17927, 17927, 17927, 17927), class = "Date"), FwdRet = c(2, 3, 
4, 5, 5, 2, 1, 4), Fact1 = c(10, 30, 20, 15, 12, 25, 26, 28), 
    Fact2 = c(100, 500, 300, 400, 150, 400, 430, 420)), .Names = c("MktDate", 
"FwdRet", "Fact1", "Fact2"), row.names = c(NA, -8L), class = "data.frame")

在该数据集上运行按日期分组的成对相关时,应为以下结果。

MktDate,Fact1,Fact2
12/31/18,.2,.4
1/31/19,.4,-.8

2 个答案:

答案 0 :(得分:1)

一种可能的方法是重塑数据,以便在一列中具有始终在相关性(FwdRet)中想要的变量,而在另一列中具有更改的变量。像这样:

MyDataTest_reshape <- MyDataTest %>% 
  gather(factor, value, -MktDate, -FwdRet) 

MyDataTest_reshape

         MktDate FwdRet factor value
  1  2018-12-31      2  Fact1    10
  2  2018-12-31      3  Fact1    30
  3  2018-12-31      4  Fact1    20
  4  2018-12-31      5  Fact1    15
  5  2019-01-31      5  Fact1    12
  6  2019-01-31      2  Fact1    25
  7  2019-01-31      1  Fact1    26
  8  2019-01-31      4  Fact1    28
  9  2018-12-31      2  Fact2   100
  10 2018-12-31      3  Fact2   500
  11 2018-12-31      4  Fact2   300
  12 2018-12-31      5  Fact2   400
  13 2019-01-31      5  Fact2   150
  14 2019-01-31      2  Fact2   400
  15 2019-01-31      1  Fact2   430
  16 2019-01-31      4  Fact2   420

然后,您可以获取经过整形的数据并将其输入到您的关联中:

MyDataTest_reshape %>%
  group_by(MktDate, factor) %>% 
  summarize(correlation = cor(FwdRet, value)) %>% 
  spread(factor, correlation)

# A tibble: 2 x 3
# Groups:   MktDate [2]
  MktDate      Fact1  Fact2
  <date>       <dbl>  <dbl>
1 2018-12-31  0.0756  0.529
2 2019-01-31 -0.627  -0.736

当然,您也可以一步一步完成所有操作:

MyDataTest %>% 
gather(factor, value, -MktDate, -FwdRet) %>% 
group_by(MktDate, factor) %>% 
summarize(correlation = cor(FwdRet, value)) %>% 
spread(factor, correlation)

答案 1 :(得分:0)

这对我有用。

library(tidyverse)

MyDataTest <- structure(list(MktDate = structure(c(17896, 17896, 17896, 17896, 
                                                   17927, 17927, 17927, 17927), class = "Date"), FwdRet = c(2, 3, 
                                                                                                            4, 5, 5, 2, 1, 4), Fact1 = c(10, 30, 20, 15, 12, 25, 26, 28), 
                             Fact2 = c(100, 500, 300, 400, 150, 400, 430, 420)), .Names = c("MktDate", 
                                                                                            "FwdRet", "Fact1", "Fact2"), row.names = c(NA, -8L), class = "data.frame")


MyDataTest %>% 
  group_by(MktDate) %>% 
  summarize_at(c("Fact1", "Fact2"),  list(~cor(., FwdRet, use="pairwise.complete.obs", "spearman")))

#> # A tibble: 2 x 3
#>   MktDate    Fact1 Fact2
#>   <date>     <dbl> <dbl>
#> 1 2018-12-31   0.2   0.4
#> 2 2019-01-31  -0.4  -0.8