【问题标题】:Executing a statistical test across multiple subsets using purrr map使用 purrr map 跨多个子集执行统计测试
【发布时间】:2020-01-28 18:04:34
【问题描述】:

我正在尝试使用 purr map 功能从数据框创建多个子组,以便我可以对每个子组运行统计测试。因此,使用mtcars 作为样本数据集,我可以从以下位置确定唯一碳水化合物值集:

mtcars %>% {unique(.$carb)}

[1] 4 1 2 3 6 8

同样,唯一齿轮值的集合:

mtcars %>% {unique(.$gear)}   

[1] 4 3 5

我想遍历 carbgear 的独特组合,并将其用作mtcars 中的子集值的一种方式,以便我可以对每个子集执行统计测试(由gearcarb)。所以测试将是:

data_subset %>% kruskal.test(.$mpg, .$am, data = .)

我尝试使用来自 purrr 的 map 来执行此操作。大致如下:

library(purrr)
mtcars %>% 
  {unique(.$carb)} %>%
  map2(mtcars, ~filter(.y, am == .x))

【问题讨论】:

    标签: r dictionary purrr


    【解决方案1】:

    对于mtcars 中的大多数碳水化合物/齿轮组合,am 只有一个值。根据我对帮助和错误消息的有限理解,您需要多个组(在您的示例中为am)来运行测试。

    library(tidyverse)
    
    # Step 1 - limit to testable data
    count(mtcars, carb, gear, am) %>%
      count(carb, gear) %>% # Count am possibilities w/in each carb/gear group
      filter(n > 1) %>%
      left_join(mtcars) -> mtcars_mult_am 
    
    # Step 2 - nest, map each group to test, unnest
    mtcars_mult_am %>%
      nest(data = -c(carb, gear)) %>%
      mutate(kruskal_raw = map(data, ~ kruskal.test(.x$mpg, .x$am)),
             kruskal = map(kruskal_raw, broom::tidy)) %>%
      select(-data) %>%
      unnest(kruskal)
    
    # A tibble: 2 x 7
       carb  gear kruskal_raw statistic p.value parameter method                      
      <dbl> <dbl> <list>          <dbl>   <dbl>     <int> <chr>                       
    1     2     4 <S3: htest>      0      1             1 Kruskal-Wallis rank sum test
    2     4     4 <S3: htest>      2.67   0.102         1 Kruskal-Wallis rank sum test
    

    【讨论】:

    • 这很好,很抱歉,我没有意识到 am 变量的数据不足 - 我正在寻找一个可以将数据分成两组的变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 2020-09-22
    • 2017-08-18
    • 2020-07-18
    • 1970-01-01
    • 2017-10-04
    相关资源
    最近更新 更多