【问题标题】:How to select groups with data that can be compared within multiple groups (using dplyr and rstatix)?如何选择具有可在多个组内进行比较的数据的组(使用 dplyr 和 rstatix)?
【发布时间】:2021-10-11 14:08:14
【问题描述】:

我想在组内按性别运行 t 检验。我有两个组变量(group_1 和 group_2)和多个结果变量(var1 和 var2 - 尽管在我的数据集中我有很多变量)。

  #Packages
library(dplyr)
library(reshape2)
library(rstatix)
##Dataset
group_1 <-c(rep("Group X", 40), rep("Group Y", 40), 
                      rep("Group Z", 60), rep("Group Y", 20),
                      rep("Group Z", 50), rep("Group Y", 10))
group_2 <- c(rep("A", 100), rep("B", 20), rep("C", 50), rep("A", 20), rep("B", 30))
var1 <- rnorm(n=220, mean=0, sd=1)
var2 <- rnorm(n = 220, mean = 1, sd=1.3)
gender <- c(rep("M", 30), rep("F", 30), rep("M", 40) , rep("F", 50), rep("M", 20), 
            rep("F", 20), rep("M", 30))
data <- as.data.frame(cbind(group_1, group_2, var1, var2, gender))

##Groupings
table(data$group_1, data$group_2, data$gender)

#Long format
g_long <- gather(data, variable, value, var1:var2)
g_long$value <- as.numeric(g_long$value)

#T-tests for each variable within groups
g_test <- g_long %>%
  group_by(variable, group_1, group_2) %>%
  t_test(value ~ gender, p.adjust.method = "holm", paired=FALSE)

上面的代码给了我下面的错误:

Error: Problem with `mutate()` input `data`.
x not enough 'y' observations
i Input `data` is `map(.data$data, .f, ...)`.

此代码仅适用于一组,或者如果我删除了正确的数据:

  #this works
  g_test <- g_long %>%
  group_by(variable, group_1) %>%
  t_test(value ~ gender, p.adjust.method = "holm", paired=FALSE)

#Manually remove category where I cannot calculate gender diff - this works
g_long1 <- g_long[!(g_long$group_1 == "Group Y" & g_long$group_2 == "B"),]

g_test <- g_long1 %>%
  group_by(variable, group_1, group_2) %>%
  t_test(value ~ gender, p.adjust.method = "holm", paired=FALSE)

Y 组和 B 组类别中没有女性,因此如果我手动删除它们,代码将有效。我尝试了类似下面的方法来自动检测和删除这些类别,但它没有帮助,因为如果每个类别没有男性或没有女性,它就无法删除数据。

  g_long<- g_long %>% 
  group_by(group_1, group_2, variable, gender) %>% 
  filter(n() >= 5) 

如何自动删除无法运行 t 检验的类别?我的数据集中的每个组都有超过 3 个类别,因此手动选择每个组会很困难。

【问题讨论】:

    标签: r dplyr rstatix


    【解决方案1】:

    我们可以使用nest_by 并创建一个list 列和transmute,使用逻辑条件检查每个组的“性别”中不同(n_distinct)元素的数量

    library(dplyr)
    library(rstatix)
    g_long %>% 
       nest_by(variable, group_1, group_2) %>%
       transmute(out = list(if(n_distinct(data$gender) > 1) data %>%
           t_test(value ~ gender, p.adjust.method = "holm", 
            paired=FALSE) else NA)) %>%
       ungroup
    

    -输出

    # A tibble: 14 x 4
       variable group_1 group_2 out                   
       <chr>    <chr>   <chr>   <list>                
     1 var1     Group X A       <rstatix_test [1 × 8]>
     2 var1     Group Y A       <rstatix_test [1 × 8]>
     3 var1     Group Y B       <lgl [1]>             
     4 var1     Group Y C       <rstatix_test [1 × 8]>
     5 var1     Group Z A       <rstatix_test [1 × 8]>
     6 var1     Group Z B       <rstatix_test [1 × 8]>
     7 var1     Group Z C       <rstatix_test [1 × 8]>
     8 var2     Group X A       <rstatix_test [1 × 8]>
     9 var2     Group Y A       <rstatix_test [1 × 8]>
    10 var2     Group Y B       <lgl [1]>             
    11 var2     Group Y C       <rstatix_test [1 × 8]>
    12 var2     Group Z A       <rstatix_test [1 × 8]>
    13 var2     Group Z B       <rstatix_test [1 × 8]>
    14 var2     Group Z C       <rstatix_test [1 × 8]>
    

    要提取list 元素,请使用unnest

    library(tidyr)
    > g_long %>% 
    +    nest_by(variable, group_1, group_2) %>%
    +    transmute(out = list(if(n_distinct(data$gender) > 1) data %>%
    +        t_test(value ~ gender, p.adjust.method = "holm", 
    +         paired=FALSE) else NA)) %>%
    +    ungroup %>% 
    +    unnest(out)
    # A tibble: 14 x 12
       variable group_1 group_2 .y.   group1 group2    n1    n2 statistic    df      p out  
       <chr>    <chr>   <chr>   <chr> <chr>  <chr>  <int> <int>     <dbl> <dbl>  <dbl> <lgl>
     1 var1     Group X A       value F      M         10    30  -0.350    30.7  0.729 NA   
     2 var1     Group Y A       value F      M         20    20  -0.0286   37.7  0.977 NA   
     3 var1     Group Y B       <NA>  <NA>   <NA>      NA    NA  NA        NA   NA     NA   
     4 var1     Group Y C       value F      M         10    10   0.221    17.0  0.828 NA   
     5 var1     Group Z A       value F      M         20    20  -0.0811   38.0  0.936 NA   
     6 var1     Group Z B       value F      M         20    20  -1.03     34.7  0.309 NA   
     7 var1     Group Z C       value F      M         20    10  -1.17     20.3  0.256 NA   
     8 var2     Group X A       value F      M         10    30  -0.601    13.0  0.558 NA   
     9 var2     Group Y A       value F      M         20    20  -0.824    36.8  0.415 NA   
    10 var2     Group Y B       <NA>  <NA>   <NA>      NA    NA  NA        NA   NA     NA   
    11 var2     Group Y C       value F      M         10    10  -0.00521  17.6  0.996 NA   
    12 var2     Group Z A       value F      M         20    20  -0.956    38.0  0.345 NA   
    13 var2     Group Z B       value F      M         20    20   0.593    31.2  0.557 NA   
    14 var2     Group Z C       value F      M         20    10  -1.57     17.0  0.136 NA   
    

    关于 OP 帖子中的错误,它与唯一 'gender' 元素的数量有关,即 group_1 'Y' 和 'group_2' 'B' 为 1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-27
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 2019-10-16
      • 1970-01-01
      相关资源
      最近更新 更多