R сгруппированы временные ряды корреляции с Tidyverse - PullRequest
0 голосов
/ 08 февраля 2020

Мне нужны корреляции временных рядов в сгруппированном фрейме данных. Вот примерный набор данных:

x <- cbind(expand.grid(type = letters[1:4], time = seq(1:4), kind = letters[5:8]), value = rnorm(64)) %>% arrange(type, time, kind)

, который производит 64 строки переменных type, time, kind и value.

Я хочу корреляцию временных рядов значения для каждого kind сгруппированы по type. Представьте, что каждая комбинация type и time представляет собой упорядоченный вектор из 4 значений. Я группирую по type и time, затем упорядочиваю по kind, затем удаляю kind.

y <- x %>% group_by(type) %>% arrange(type, time, kind) %>% select(-kind)

Затем я могу сгруппировать y по типу и времени и вложить так, чтобы все значения находятся вместе в переменной данных, перегруппируются только по type и создают новую переменную, которая является опережением data.

z <- y %>% group_by(type, time) %>% nest(value) %>% group_by(type) %>% mutate(ahead = lead(data))

Теперь я хочу запустить mutate(R = cor(data, ahead)), но не могу кажется, получить правильный синтаксис.

Я также пытался mutate(R = cor(data$value, ahead$value)) и mutate(R = cor(data[1]$value, ahead[1]$value)), но безрезультатно.

Ошибка, которую я получаю от cor: supply both 'x' and 'y' or a matrix-like 'x'.

Как ссылаться на данные и переменные впереди как векторы для запуска с cor?

В конечном счете, я ищу 16-строчный фрейм данных со столбцами type, time и R, где R - это одно значение корреляции.

Спасибо за внимание.

1 Ответ

1 голос
/ 08 февраля 2020

Мы можем использовать map2_dbl из purrr для передачи data и ahead одновременно в cor функцию.

library(dplyr)

z %>%
  mutate(R = purrr::map2_dbl(data, ahead, cor)) %>%
  select(-data, -ahead)

#  type   time     R
#  <fct> <int>   <dbl>
# 1 a         1  0.358 
# 2 a         2 -0.0498
# 3 a         3 -0.654 
# 4 a         4  1     
# 5 b         1 -0.730 
# 6 b         2  0.200 
# 7 b         3 -0.928 
# 8 b         4  1     
# 9 c         1  0.358 
#10 c         2  0.485 
#11 c         3 -0.417 
#12 c         4  1     
#13 d         1  0.140 
#14 d         2 -0.448 
#15 d         3 -0.511 
#16 d         4  1     

В базе R мы можем использовать mapply

z$R <- mapply(cor, z$data, z$ahead)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...