【问题标题】:Ignore n=1 subgroups when using t.test comparisons in R在 R 中使用 t.test 比较时忽略 n=1 子组
【发布时间】:2020-05-22 23:53:52
【问题描述】:

我编写了一个 Shiny 应用程序,它根据用户输入计算数据子集之间的 t.tests 并选择 data.frame。输入将是可变的,因此我试图提出一个在比较涉及n=1 观察时不会失败的代码。换句话说,我想计算t.tests 并产生结果,但只是忽略用户选择变量时可能出现的 n=1 子组。我尝试使用tryCatch 抑制错误,但我的方法完全阻止了代码评估。

下面是我正在尝试做的事情。我使用ggpubr 来计算统计数据和随后的绘图,但失败发生在t.test 步骤。谢谢!




library(ggpubr)
#> Loading required package: ggplot2

df1 <- data.frame( y = rnorm(30), 
                  x = rep(c("a", "b", "c"), 10),
                  grp = c(rep("grp1", 14),  rep("grp2", 14), rep("grp3", 2)))
head(df1)
#>             y x  grp
#> 1 -0.13492634 a grp1
#> 2 -0.61828715 b grp1
#> 3 -0.63773980 c grp1
#> 4 -0.37607819 a grp1
#> 5 -1.38494920 b grp1
#> 6 -0.02036611 c grp1



compare_means(y~x, data = df1, method = "t.test")
#> # A tibble: 3 x 8
#>   .y.   group1 group2      p p.adj p.format p.signif method
#>   <chr> <chr>  <chr>   <dbl> <dbl> <chr>    <chr>    <chr> 
#> 1 y     a      b      0.0241 0.072 0.024    *        T-test
#> 2 y     a      c      0.319  0.32  0.319    ns       T-test
#> 3 y     b      c      0.0934 0.19  0.093    ns       T-test

compare_means(y~x, data = df1, method="t.test", group.by = "grp")
#> Error in t.test.default(xi, xj, paired = paired, alternative = alternative, : not enough 'x' observations





# Data frame that will not fail to demonstrate what I want at the end
df2 <- data.frame( y = rnorm(30), 
                   x = rep(c("a", "b", "c"), 10),
                   grp = c(rep(c("grp1", "grp2", "grp3"), each=10)))
head(df2)
#>            y x  grp
#> 1  0.6382919 a grp1
#> 2 -0.2909966 b grp1
#> 3  0.8555486 c grp1
#> 4 -1.3737311 a grp1
#> 5 -0.8560113 b grp1
#> 6 -1.2295995 c grp1

# I want an output like this with NAs where computation isn't possible due to n=1
compare_means(y~x, data = df2, method="t.test", group.by = "grp")
#> # A tibble: 9 x 9
#>   grp   .y.   group1 group2      p p.adj p.format p.signif method
#>   <chr> <chr> <chr>  <chr>   <dbl> <dbl> <chr>    <chr>    <chr> 
#> 1 grp1  y     a      b      0.635   1    0.635    ns       T-test
#> 2 grp1  y     a      c      0.607   1    0.607    ns       T-test
#> 3 grp1  y     b      c      0.375   1    0.375    ns       T-test
#> 4 grp2  y     a      b      0.984   1    0.984    ns       T-test
#> 5 grp2  y     a      c      0.719   1    0.719    ns       T-test
#> 6 grp2  y     b      c      0.371   1    0.371    ns       T-test
#> 7 grp3  y     a      b      0.542   1    0.542    ns       T-test
#> 8 grp3  y     a      c      0.0853  0.77 0.085    ns       T-test
#> 9 grp3  y     b      c      0.178   1    0.178    ns       T-test

reprex package (v0.3.0) 于 2020-05-22 创建

【问题讨论】:

    标签: r error-handling statistics


    【解决方案1】:

    而不是使用 tryCatch,只是对数据集进行子集化并使用

    compare_means(y~x, data = subset(df1,ave(y,grp,x,FUN=length)>1), method="t.test", group.by = "grp")
    # A tibble: 6 x 9
      grp   .y.   group1 group2      p p.adj p.format p.signif method
      <chr> <chr> <chr>  <chr>   <dbl> <dbl> <chr>    <chr>    <chr> 
    1 grp1  y     a      b      0.805   1    0.805    ns       T-test
    2 grp1  y     a      c      0.686   1    0.686    ns       T-test
    3 grp1  y     b      c      0.817   1    0.817    ns       T-test
    4 grp2  y     a      b      0.568   1    0.568    ns       T-test
    5 grp2  y     a      c      0.153   0.77 0.153    ns       T-test
    6 grp2  y     b      c      0.0215  0.13 0.021    *        T-test
    

    【讨论】:

    • 非常好!关于如何将ave 与字符串一起使用的任何建议?即我想将列名作为字符传递(来自用户输入,例如input$selected_text
    • 我刚刚想通了。用get() 包裹字符串似乎有效。谢谢!
    • @Atakan 确保在使用 get 时指定环境为 df1 这样可以避免很多问题。虽然你需要使用substitute 而不是get
    • 如果有机会,您能否使用substitute 编辑您的答案?我认为可能会为 Shiny 应用程序找到这篇文章的人(比如我自己)会很感激。
    猜你喜欢
    • 2016-11-01
    • 2014-05-14
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    • 2018-07-05
    • 2013-01-31
    相关资源
    最近更新 更多