Рассчитать объемную попарную корреляцию, используя purrr и вложенные data.frame - PullRequest
1 голос
/ 13 апреля 2020

Я хочу рассчитать попарные корреляции между "mpg" и всеми другими числовыми c переменными, представляющими интерес для каждой cyl в mtcars набор данных. Я хотел бы принять принцип аккуратных данных.

Это довольно просто с corrr::correlate().

library(dplyr)
library(tidyr)
library(purrr)
library(corrr)
data(mtcars)

mtcars2 <- mtcars[,1:7] %>%
  group_nest(cyl) %>%
  mutate(cors = map(data, corrr::correlate),
         stretch = map(cors, corrr::stretch)) %>%
  unnest(stretch)

mtcars2 %>%
  filter(x == "mpg")

. Используя corrr::correlate(), все доступные парные корреляции были вычислены. Я мог бы использовать dplyr::filter(), чтобы выбрать интересующие корреляции.

Однако, когда наборы данных велики, много вычислений go для нежелательных корреляций, что делает этот подход очень трудоемким. Поэтому я попытался рассчитать только mpg против других. Я не очень знаком с purrr , и следующий код не работает.

mtcars2 <- mtcars[,1:7] %>%
  group_nest(cyl) %>%
  mutate(comp = map(data, ~colnames),
         corr = map(comp, ~cor.test(data[["mpg"]], data[[.]])))

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

Если вам нужно использовать cor.test, ниже приведен вариант использования метлы:

library(broom)
library(tidyr)
library(dplyr)

mtcars[,1:7] %>% 
pivot_longer(-c(mpg,cyl)) %>% 
group_by(cyl,name) %>% 
do(tidy(cor.test(.$mpg,.$value)))

# A tibble: 15 x 10
# Groups:   cyl, name [15]
     cyl name  estimate statistic p.value parameter conf.low conf.high method
   <dbl> <chr>    <dbl>     <dbl>   <dbl>     <int>    <dbl>     <dbl> <chr> 
 1     4 disp   -0.805     -4.07  0.00278         9   -0.947   -0.397  Pears…
 2     4 drat    0.424      1.41  0.193           9   -0.236    0.816  Pears…
 3     4 hp     -0.524     -1.84  0.0984          9   -0.855    0.111  Pears…
 4     4 qsec   -0.236     -0.728 0.485           9   -0.732    0.424  Pears…
 5     4 wt     -0.713     -3.05  0.0137          9   -0.920   -0.198  Pears…
 6     6 disp    0.103      0.232 0.826           5   -0.705    0.794  Pears…
 7     6 drat    0.115      0.258 0.807           5   -0.699    0.799  Pears…

Если вам просто нужна корреляция, для больших наборов данных вложение et c может быть дорогостоящим и ненужным потому что вы можете просто сделать cor (,) и расплавить это:

#define columns to correlate
cor_vars = setdiff(colnames(mtcars)[1:7],"cyl")
split(mtcars[,1:7],mtcars$cyl) %>% 
map_dfr(~data.frame(x="mpg",y=cor_vars,
cyl=unique(.x$cyl),rho=as.numeric(cor(.x$mpg,.x[,cor_vars]))))

     x    y cyl         rho
1  mpg  mpg   4  1.00000000
2  mpg disp   4 -0.80523608
3  mpg   hp   4 -0.52350342
4  mpg drat   4  0.42423947
5  mpg   wt   4 -0.71318483
6  mpg qsec   4 -0.23595389
7  mpg  mpg   6  1.00000000
8  mpg disp   6  0.10308269
9  mpg   hp   6 -0.12706785
10 mpg drat   6  0.11471598
11 mpg   wt   6 -0.68154982
12 mpg qsec   6 -0.41871779
13 mpg  mpg   8  1.00000000
14 mpg disp   8 -0.51976704
15 mpg   hp   8 -0.28363567
16 mpg drat   8  0.04793248
17 mpg   wt   8 -0.65035801
18 mpg qsec   8 -0.10433602
0 голосов
/ 13 апреля 2020

Будет ли это работать для вас? Я делал это в прошлом, но на маленьких sh наборах данных, и я не отмечал это, так что не уверен в производительности. Я использую pivot_longer, чтобы изменить данные перед вложением. Переменные, которые вы передаете, по существу работают как этап фильтрации, вроде

mtcars2 <- mtcars[,1:7] %>%
  pivot_longer(c(-mpg, -cyl), names_to = "y.var", values_to = "value" ) %>% 
  group_nest(cyl, y.var) %>%
  mutate(x.var  = "mpg", #just so you  can see this in the output
    cor = map_dbl(data, ~ {cor <- cor.test(.x$mpg, .x$value)
                                cor$estimate})) %>%
  select(data, cyl, x.var , y.var, cor) %>% 
  arrange(cyl, y.var)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...