【问题标题】:calculate multiple t-tests for all the combinations of 2 list elements in R tidyverse environment计算 R tidyverse 环境中 2 个列表元素的所有组合的多个 t 检验
【发布时间】:2019-11-04 08:43:30
【问题描述】:

我正在寻找一种方法来计算 R tidyverse 环境中 2 个列表元素的所有组合的多个 t 检验。

我想根据 Cyl 和 vs 的每种组合的传输来测试英里/(美国)加仑的平均值。我的工作示例是以下代码:

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) 的东西 但它没有用。

【问题讨论】:

    标签: r purrr t-test


    【解决方案1】:

    列表列可能是一个可行的解决方案(参见书籍R for Data Science, chapter 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
    

    reprex package (v0.3.0) 于 2019 年 11 月 4 日创建

    【讨论】:

      【解决方案2】:

      编写一个函数,计算一个组合之间的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]>       
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-18
        • 1970-01-01
        • 2015-12-25
        • 1970-01-01
        • 2020-07-17
        • 2019-08-23
        • 2020-10-07
        • 2015-11-12
        相关资源
        最近更新 更多