R Dplyr решение для корреляции summaze_at - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь вычислить корреляцию по (group_by) MktDate для всех столбцов в кадре данных с другим столбцом (Security Return).

Я попробовал несколько решений 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 ]

1 голос
/ 22 апреля 2019

Один из возможных подходов состоит в том, чтобы изменить ваши данные так, чтобы в одном столбце была переменная, которую вы всегда хотите видеть (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)
0 голосов
/ 22 апреля 2019

Это работает для меня.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...