ggpubr 的 compare_means 和 base R 的 pairwise.t.test 给出不同的结果

Posted

技术标签:

【中文标题】ggpubr 的 compare_means 和 base R 的 pairwise.t.test 给出不同的结果【英文标题】:ggpubr's compare_means and base R's pairwise.t.test give different results 【发布时间】:2020-08-24 03:50:22 【问题描述】:

第一次在***上发帖,希望有人能帮助我。提前致谢!

我想使用 R 包 ggpubr 创建一个条形图,显示不同治疗组中基因的表达,但我注意到包含的函数 compare_meansstat_compare_means 返回更高的 p 值来比较除了 R 基函数 pairwise.t.test 之外的所有组。实际上,有些值要高一些,有些值要低一些。 ggpubr 函数是否使用了一些更保守的假设?这是我的数据和代码示例:

   Target.Name Group     CT   dCT   f.change
81        Gen1   300 23.911 1.900 0.26794337
82        Gen1   300 24.990 3.190 0.10957572
83        Gen1   300 24.504 2.646 0.15965172
84        Gen1    30 26.379 4.486 0.04462512
85        Gen1    30 26.576 4.366 0.04852930
86        Gen1    30 27.154 4.912 0.03321549
87        Gen1     3 27.317 4.923 0.03298605
88        Gen1     3 27.119 5.288 0.02559490
89        Gen1     3 27.313 5.691 0.01935701
90        Gen1   0.3 27.388 5.857 0.01725311
91        Gen1   0.3 26.911 5.104 0.02909671
92        Gen1   0.3 26.872 5.816 0.01773816
93        Gen1     0 26.371 5.502 0.02206648
94        Gen1     0 27.283 5.778 0.01822421
95        Gen1     0 27.168 5.618 0.02034757

#-----------------------------------------
compare_means(dat_subset, formula = f.change ~ Group, method = "t.test")
pairwise.t.test(dat_subset$f.change, dat_subset$Group)

输出是

> compare_means(dat_subset, formula = f.change ~ Group, method = "t.test")
# A tibble: 10 x 8
   .y.      group1 group2      p p.adj p.format p.signif method
   <chr>    <chr>  <chr>   <dbl> <dbl> <chr>    <chr>    <chr> 
 1 f.change 0      0.3    0.799   0.9  0.799    ns       T-test
 2 f.change 0      3      0.278   0.83 0.278    ns       T-test
 3 f.change 0      30     0.0351  0.32 0.035    *        T-test
 4 f.change 0      300    0.0767  0.54 0.077    ns       T-test
 5 f.change 0.3    3      0.450   0.9  0.450    ns       T-test
 6 f.change 0.3    30     0.0271  0.27 0.027    *        T-test
 7 f.change 0.3    300    0.0767  0.54 0.077    ns       T-test
 8 f.change 3      30     0.0573  0.46 0.057    ns       T-test
 9 f.change 3      300    0.0809  0.54 0.081    ns       T-test
10 f.change 30     300    0.0980  0.54 0.098    ns       T-test
> pairwise.t.test(dat_subset$f.change, dat_subset$Group)

    Pairwise comparisons using t tests with pooled SD 

data:  dat_subset$f.change and dat_subset$Group 

    0      0.3    3      30    
0.3 1.0000 -      -      -     
3   1.0000 1.0000 -      -     
30  1.0000 1.0000 1.0000 -     
300 0.0034 0.0034 0.0036 0.0071

P value adjustment method: holm 

【问题讨论】:

【参考方案1】:

要获得相同的结果,您必须指定不希望合并方差 (pool.sd=FALSE),因为 pairwise.t.test 的默认值为 TRUE,但 compare_means 的默认值为错误的。 (反之亦然)

pairwise.t.test(x=dat_subset$f.change, g=dat_subset$Group, pool.sd = FALSE)

data:  dat_subset$f.change and dat_subset$Group 

    0    0.3  3    30  
0.3 0.90 -    -    -   
3   0.83 0.90 -    -   
30  0.32 0.27 0.46 -   
300 0.54 0.54 0.54 0.54

compare_means(dat_subset, formula = f.change ~ Group, method = "t.test")
# A tibble: 10 x 8
   .y.      group1 group2      p p.adj p.format p.signif method
   <chr>    <chr>  <chr>   <dbl> <dbl> <chr>    <chr>    <chr> 
 1 f.change 300    30     0.0980  0.54 0.098    ns       T-test
 2 f.change 300    3      0.0809  0.54 0.081    ns       T-test
 3 f.change 300    0.3    0.0767  0.54 0.077    ns       T-test
 4 f.change 300    0      0.0767  0.54 0.077    ns       T-test
 5 f.change 30     3      0.0573  0.46 0.057    ns       T-test
 6 f.change 30     0.3    0.0271  0.27 0.027    *        T-test
 7 f.change 30     0      0.0351  0.32 0.035    *        T-test
 8 f.change 3      0.3    0.450   0.9  0.450    ns       T-test
 9 f.change 3      0      0.278   0.83 0.278    ns       T-test
10 f.change 0.3    0      0.799   0.9  0.799    ns       T-test

【讨论】:

非常感谢您的出色回答。但是现在我可以选择将汇总方差设置为真并获得更符合我的假设的 p 值,这是危险的领域:D 但我想这超出了问题范围,所以我要阅读有点关于选择什么。非常感谢!【参考方案2】:

好吧,他们都声称使用holm 作为默认p.adjust,但他们在是否假设方差相等方面似乎有所不同。没有足够的数据来真正检验我的假设,但根据这个基本上取自帮助文件的示例,它们会产生不同的结果...

data("ToothGrowth")
df <- ToothGrowth
ggpubr::compare_means(len ~ supp, df, method = "t.test")
#> # A tibble: 1 x 8
#>   .y.   group1 group2      p p.adj p.format p.signif method
#>   <chr> <chr>  <chr>   <dbl> <dbl> <chr>    <chr>    <chr> 
#> 1 len   OJ     VC     0.0606 0.061 0.061    ns       T-test
ggpubr::compare_means(len ~ supp, df, method = "t.test", var.equal = TRUE)
#> # A tibble: 1 x 8
#>   .y.   group1 group2      p p.adj p.format p.signif method
#>   <chr> <chr>  <chr>   <dbl> <dbl> <chr>    <chr>    <chr> 
#> 1 len   OJ     VC     0.0604  0.06 0.06     ns       T-test
pairwise.t.test(df$len, df$supp)
#> 
#>  Pairwise comparisons using t tests with pooled SD 
#> 
#> data:  df$len and df$supp 
#> 
#>    OJ  
#> VC 0.06
#> 
#> P value adjustment method: holm
pairwise.t.test(df$len, df$supp, pool.sd = FALSE)
#> 
#>  Pairwise comparisons using t tests with non-pooled SD 
#> 
#> data:  df$len and df$supp 
#> 
#>    OJ   
#> VC 0.061
#> 
#> P value adjustment method: holm

由reprex package (v0.3.0) 于 2020 年 5 月 8 日创建

【讨论】:

感谢 Chuck 的出色回答。就是这样 哈哈,不过你没有选择我的答案。

以上是关于ggpubr 的 compare_means 和 base R 的 pairwise.t.test 给出不同的结果的主要内容,如果未能解决你的问题,请参考以下文章

使用 ggpubr - R 标记每个图

R语言使用ggpubr包的ggarrange函数组合多张结论图:使用ggpubr包将图像文本表格组合在一起展示

R语言使用ggpubr包的ggarrange函数组合多张结论图:使用ggpubr包将表格嵌套在可视化图像中

R语言使用ggpubr包的ggarrange函数组合多张结论图:使用ggpubr包将多个可视化结论嵌套起来输出(ggarrange组合ggarrange组合后的图像)

ggplot / ggpubr:导出绘图时忽略annotate_figure

ggpubr:更改 stat_compare_means Kruskal-Wallis p 值的字体大小