Используйте Tidyverse, чтобы найти средние временные ряды поперечных корреляций - PullRequest
0 голосов
/ 21 мая 2018

Я пытаюсь найти среднее значение временных сечений по временным рядам.

До tidyverse я бы:

  1. преобразовал dat в списокгодовых фреймов данных
  2. используйте lapply(), чтобы найти годовые поперечные корреляции
  3. , используйте Reduce(), чтобы найти средства вручную

Эта логика работает,но это не tidy.

set.seed(2001)
dat <- data.frame(year = rep(2001:2003, each = 10),
                  x = runif(3*10))
dat <- transform(dat, y = 5*x + runif(3*10))
dat_list <- split(dat[c('x', 'y')], dat$year)
dat_list2 <- lapply(dat_list, cor)
dat2 <- Reduce('+', dat_list2) / length(dat_list2)
dat2

##           x         y
## x 1.0000000 0.9772068
## y 0.9772068 1.0000000

Для решения tidyerse моя лучшая (и неудачная) попытка состоит в следующем:

  1. group_by() переменная year
  2. использовать do() и cor() каждый год
  3. использовать map() и mean() для поэлементного поиска означает

Эта логика не работает и возвращает NULL.

library(tidyverse)
dat2 <- dat %>%
  group_by(year) %>% 
  do(cormat = cor(.$x, .$y)) %>% 
  map(.$cormat, mean)
dat2

## $year
## NULL
## 
## $cormat
## NULL

Существует ли идиома tidyverse для замены идиомы Reduce() в моем решении, отличном от tidyverse выше?

1 Ответ

0 голосов
/ 21 мая 2018
dat %>% 
  group_by(year) %>% 
  do(correl = cor(.data[c('x', 'y')])) %>% 
  {reduce(.$correl, `+`)/nrow(.)}



          x         y
x 1.0000000 0.9772068
y 0.9772068 1.0000000

Обратите внимание, что это то же самое, что и cor(dat[c('x', 'y')]), поэтому, если вам не нужны матрицы для каждого года отдельно, нет необходимости группировать по годам, а затем сокращать.Это также верно для> 2 переменных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...