用于summarize_at相关性的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, dots) : 计算错误:并非所有参数都具有相同的长度。

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

一种可能的方法是重塑数据,以便在一列中具有相关性(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)

这对我有用。

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

最新更新