вычислить несколько t-тестов для всех комбинаций 2 элементов списка в среде R tidyverse - PullRequest
1 голос
/ 04 ноября 2019

Я ищу способ вычисления нескольких t-тестов для всех комбинаций из 2 элементов списка в среде tidyverse R.

Я хотел бы проверить средние значения миль / (США) галлона на основеПередача для каждой комбинации цил и против. Мой рабочий пример - это код:

mtcars %>%
  filter(cyl==8 & vs == 0) %>%
  mutate(am = as.factor(am)) %>%

  # independent t-test
  t.test(mpg ~ am, data = ., paired = FALSE)%>%
  broom::tidy() %>%

  mutate(cyl = 8) %>%
  mutate(vs  = 0)   %>%
  select(cyl, vs, everything())

Я написал этот фрагмент кода:

cyl_list <- list(unique(mtcars$cyl)) # 6 4 8
vs_list  <- list(unique(mtcars$vs))  # 0 1


complete_t_test <- function(cyl_par, vs_par){

  mtcars %>%
    filter(cyl=={cyl_par} & vs == {vs_par}) %>%
    mutate(am = as.factor(am)) %>%

    # independent t-test
    t.test(mpg ~ am, data = ., paired = FALSE) %>%
    broom::tidy() %>%

    mutate(cyl = {cyl_par}) %>%
    mutate(vs  = {vs_par})   %>%
    select(cyl, vs, everything())}

Я думал о чем-то похожем на purrr::map2(cyl_list, vs_list, complete_t_test) но это не сработало.

Ответы [ 2 ]

3 голосов
/ 04 ноября 2019

Столбцы списка могут быть жизнеспособным решением (см. Книгу R для Data Science, глава 25 ). Я создаю столбец списка, используя nest(), затем выполняю t-тесты и unnest() снова, чтобы увидеть результаты.

Примечание: ваш пример не выполняется для нескольких комбинаций в данных mtcars, и поэтому я используюpossibly() для проведения t-теста, только если имеются соответствующие данные.

library("tidyverse")

f1 <- possibly(~t.test(mpg ~ am, data = .x), otherwise = NULL)

mtcars %>% 
    group_by(cyl, vs) %>% 
    nest() %>%                                 # create list columns
    mutate(res = map(data, ~f1(.x))) %>%       # do t-tests
    mutate(res = map(res, broom::tidy)) %>%    # tidy()
    unnest(res) %>%                            # unnest list columns
    select(1:8)                                # show some columns for stackoverflow
#> # A tibble: 2 x 8
#> # Groups:   cyl, vs [2]
#>     cyl    vs           data estimate estimate1 estimate2 statistic p.value
#>   <dbl> <dbl> <list<df[,9]>>    <dbl>     <dbl>     <dbl>     <dbl>   <dbl>
#> 1     4     1       [10 x 9]   -5.47       22.9      28.4    -2.76   0.0254
#> 2     8     0       [14 x 9]   -0.350      15.0      15.4    -0.391  0.704

Создано в 2019-11-04 пакетом Представления (v0.3.0)

1 голос
/ 04 ноября 2019

Напишите функцию, которая вычисляет t.test между одной комбинацией. Используйте cross_df для создания всех комбинаций и применяйте функцию complete_t_test к каждой комбинации.

library(tidyverse)

complete_t_test <- function(cyl_par, vs_par) {
   tryCatch({
      mtcars %>%
       filter(cyl== cyl_par & vs == vs_par) %>%
       t.test(mpg ~ am, data = ., paired = FALSE) %>%
       broom::tidy()
   }, error = function(e) return(NA))
}

cyl_list <- unique(mtcars$cyl)
vs_list  <- unique(mtcars$vs)

cross_df(list(a = cyl_list, b = vs_list)) %>%
   mutate(t_test = map2(a, b, complete_t_test))

#     a     b   t_test           
#   <dbl> <dbl> <list>           
#1     6     0 <lgl [1]>        
#2     4     0 <lgl [1]>        
#3     8     0 <tibble [1 × 10]>
#4     6     1 <lgl [1]>        
#5     4     1 <tibble [1 × 10]>
#6     8     1 <lgl [1]>       
...