Применить тест (Jarque-Bera) к подгруппам с map () - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь запустить тест (Jarque-Bera) для подгрупп моего набора данных.Я пытаюсь использовать purrr s функцию map() для этого, но почему-то у меня это не получается.

Для примера здесь я буду использовать встроенный набор данных ChickWeight:

Загрузка некоторых пакетов:

library(dplyr)
library(ggplot2)
library(tidyr)
library(purrr)
library(tseries)

Данные выглядят так:

ggplot(ChickWeight, aes(weight, fill = Diet)) +
  geom_histogram() +
  facet_wrap(~Diet)

enter image description here

Ясейчас пытаюсь использовать тест Жарк-Бера в подгруппах Диета 1, 2, 3 и 4.

Я знаю, как использовать его в одной из таких групп:

ChickWeight %>% 
  filter(Diet == 1) %>% 
  pull(weight) %>% 
  jarque.bera.test()

Что возвращает:

    Jarque Bera Test

data:  .
X-squared = 46.687, df = 2, p-value = 7.278e-11

Но сейчас я хотел бы сделать это для всех подгрупп.Поэтому я вкладываю данные следующим образом:

nst <- ChickWeight %>% 
  nest(-Diet)

Теперь я подумал, что мог бы сразу применить функцию purrr s map(), но кое-как это не сработало:

tsts <- nst %>% 
  map(jb = map(data, jarque.bera.test(weight)))

Что возвращает:

Error in as_mapper(.f, ...) : argument ".f" is missing, with no default

Я также пытался:

tsts <- nst %>% 
  mutate(jb = map(data, jarque.bera.test(weight)))

И это дает:

Error in mutate_impl(.data, dots) : 
  Evaluation error: object 'weight' not found.

1 Ответ

0 голосов
/ 02 июня 2018

Ваш объект nst является фреймом данных;под капотом фрейма данных находится список столбцов.Поэтому, если вы примените map к nst, он будет отображаться по столбцам, а не по группам в ваших данных.Также обратите внимание, что вторым аргументом map должна быть функция (или несколько других выражений, которые являются сокращением для функций - см. Документацию для purrr::map).

Существует много способовВы можете решить свою проблему.Мой любимый вариант - использовать group_by и do с dplyr вместе с tidy с метлой :

library(dplyr)
library(tidyr)
library(purrr)
library(tseries)
library(broom)

ChickWeight %>%
    group_by(Diet) %>%
    do(tidy(jarque.bera.test(.$weight)))
# # A tibble: 4 x 5
# # Groups:   Diet [4]
#   Diet  statistic  p.value parameter method          
#   <fct>     <dbl>    <dbl>     <dbl> <fct>           
# 1 1         46.7  7.28e-11         2 Jarque Bera Test
# 2 2         18.8  8.36e- 5         2 Jarque Bera Test
# 3 3         12.4  2.00e- 3         2 Jarque Bera Test
# 4 4          5.17 7.54e- 2         2 Jarque Bera Test

Обратите внимание, что tidy занимаетвывод jarque.bera.test и превращает его в однорядный фрейм данных, и это повторяется для каждой группы функцией do.Вот чистый подход dplyr :

ChickWeight %>%
    group_by(Diet) %>%
    summarize(p.value = jarque.bera.test(weight)$p.value)
# # A tibble: 4 x 2
#   Diet   p.value
#   <fct>    <dbl>
# 1 1     7.28e-11
# 2 2     8.36e- 5
# 3 3     2.00e- 3
# 4 4     7.54e- 2

Следующий подход, использующий nest и map.Обратите внимание, что второй столбец фрейма данных, созданный nest, является списком-столбцом.Мы используем pull, чтобы вытащить только столбец списка, а затем используем map, чтобы выполнить тест Jarque-Bera для каждой группы.

ChickWeight %>%
    nest(-Diet) %>%
    pull(data) %>%
    map(~ jarque.bera.test(.$weight))
# [[1]]
# 
#   Jarque Bera Test
# 
# data:  .$weight
# X-squared = 46.687, df = 2, p-value = 7.278e-11
# 
# 
# [[2]]
# 
#   Jarque Bera Test
# 
# data:  .$weight
# X-squared = 18.779, df = 2, p-value = 8.36e-05
# 
# 
# [[3]]
# 
#   Jarque Bera Test
# 
# data:  .$weight
# X-squared = 12.426, df = 2, p-value = 0.002003
# 
# 
# [[4]]
# 
#   Jarque Bera Test
# 
# data:  .$weight
# X-squared = 5.1686, df = 2, p-value = 0.07545

Обратите внимание, что карта принимает формулу как компактный способ написания анонимная функция .Наконец, вот несколько несколько более грубых подходов, которые сочетают map и dplyr :

map(1:4, ~ filter(ChickWeight, Diet == .) %>% pull(weight) %>% jarque.bera.test)

map(1:4, ~ filter(ChickWeight, Diet == .)) %>%
    map(~ pull(., weight)) %>%
    map(~ jarque.bera.test(.))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...