使用 Tidy and Do 时处理多个 T 检验的错误

Handling Errors for Multiple T-tests when using Tidy and Do

我一直在使用函数 dotidy 对提前按类别分组的数据框执行多个 t 检验。然而,数据框中的一些值是恒定的,我通常必须过滤掉这些值才能使测试工作,因为它 returns Error in t.test.default(.$y) : data are essentially constant。我正在寻找一种方法来像往常一样使用 do 和 tidy 来执行 t 检验,但不是过滤我们的常量类别,而是使用估计列使用该类别的值,其他类别为 NA。

示例数据框:

trial<-data.frame(
  type=rep(c("A","B","C"),times=2,length.out=10),
  y=c(1,2,3,1,3,2,1,2,3,1)
)

数据框:

   type y
1     A 1
2     B 2
3     C 3
4     A 1
5     B 3
6     C 2
7     A 1
8     B 2
9     C 3
10    A 1

过滤后的 T 检验:

trial.ttest<-trial %>% 
  group_by(type) %>% 
  filter(!type=="A") %>% 
  do(tidy(t.test(.$y))))

过滤后的 T 检验结果:

  type estimate statistic    p.value parameter  conf.low
1    B 2.333333         7 0.01980394         2 0.8991158
2    C 2.666667         8 0.01526807         2 1.2324491
  conf.high            method alternative
1  3.767551 One Sample t-test   two.sided
2  4.100884 One Sample t-test   two.sided

我尝试使用以下代码,其中使用 trycatchtribble 来执行此操作,但我最终得到了 Error: C stack usage 15923504 is too close to the limit 作为错误。

trial.ttest<-trial %>% 
  group_by(type) %>% 
  do(tidy(tryCatch(t.test(.$y),error=function(e){
    tribble(
      ~estimate,
      .$y,NA,NA,NA,NA,NA,NA,NA
    )
  })))

如果我放弃使用 tribble 而只使用 tryCatch return 值,它会将其添加到名为 x 的新列中。

代码:

trial.ttest<-trial %>% 
  group_by(type) %>% 
  do(tidy(tryCatch(t.test(.$y),error=function(e){
    .$y
  })))

结果:

  type  x estimate statistic    p.value parameter  conf.low
1    A  1       NA        NA         NA        NA        NA
2    A  1       NA        NA         NA        NA        NA
3    A  1       NA        NA         NA        NA        NA
4    A  1       NA        NA         NA        NA        NA
5    B NA 2.333333         7 0.01980394         2 0.8991158
6    C NA 2.666667         8 0.01526807         2 1.2324491
  conf.high            method alternative
1        NA              <NA>        <NA>
2        NA              <NA>        <NA>
3        NA              <NA>        <NA>
4        NA              <NA>        <NA>
5  3.767551 One Sample t-test   two.sided
6  4.100884 One Sample t-test   two.sided

有没有办法让常量值进入估计列,方法列导致 Constant Value 而所有其他列为 NA 而不是最后一位中的新列代码?

编辑 1:

我忘记添加所需的结果数据框。

期望的结果:

  type estimate statistic    p.value parameter  conf.low conf.high            method alternative
1    A 1.000000        NA         NA        NA        NA        NA    Constant Value        <NA>
2    B 2.333333         7 0.01980394         2 0.8991158  3.767551 One Sample t-test   two.sided
3    C 2.666667         8 0.01526807         2 1.2324491  4.100884 One Sample t-test   two.sided

编辑 2:解决方案尝试 A

代码:

library(dplyr)
library(purrr)
library(broom)
trial %>% 
  split(.$type) %>% 
  map_if(.p = ~length(unique(.$y))>1, 
         .f = ~tidy(t.test(.$y)), 
         .else = ~tibble(estimate=.$y[1], method="Constant Value")) %>% 
  bind_rows(.id = 'type')

结果:

  type type  y estimate statistic    p.value parameter  conf.low
1    A    A  1       NA        NA         NA        NA        NA
2    A    A  1       NA        NA         NA        NA        NA
3    A    A  1       NA        NA         NA        NA        NA
4    A    A  1       NA        NA         NA        NA        NA
5    B <NA> NA 2.333333         7 0.01980394         2 0.8991158
6    C <NA> NA 2.666667         8 0.01526807         2 1.2324491
  conf.high            method alternative
1        NA              <NA>        <NA>
2        NA              <NA>        <NA>
3        NA              <NA>        <NA>
4        NA              <NA>        <NA>
5  3.767551 One Sample t-test   two.sided
6  4.100884 One Sample t-test   two.sided

这是一个使用 purrr::map_if 的选项,我们仅在 length(unique(y))>1n_distinct(y)>1[=15= 时应用 t.test ]

library(dplyr)
library(purrr)
library(broom)
trial %>% 
  split(.$type) %>% 
  map_if(.p = ~length(unique(.$y))>1, 
         .f = ~tidy(t.test(.$y)), 
         .else = ~tibble(estimate=.$y[1], method="Constant Value")) %>% 
  bind_rows(.id = 'type')

# A tibble: 3 x 9
  type  estimate method            statistic p.value parameter conf.low conf.high alternative
  <chr>    <dbl> <chr>                 <dbl>   <dbl>     <dbl>    <dbl>     <dbl> <chr>      
1 A         1    Constant Value          NA  NA             NA   NA         NA    NA         
2 B         2.33 One Sample t-test        7.  0.0198         2    0.899      3.77 two.sided  
3 C         2.67 One Sample t-test        8   0.0153         2    1.23       4.10 two.sided

PS:使用 purrr >= 0.3.2