R-ggplot2-箱图系列(2) 注释P值与组间比较

R-ggplot2-箱图系列(1) basic - 简书 (jianshu.com)
R-ggplot2-箱图系列(2) 注释P值与组间比较 - 简书 (jianshu.com)

组间比较分析时可能会涉及到以下的分析情况:
1、两组间比较:(1)选择有参法还是无参法;(2)能否进行配对比较
2、多组间比较:(1)多组间两两比较/多组整体比较(方差分析)
ggpubr包提供了组间比较的分析函数与可视化函数,主要参考自http://www.sthda.com/english/articles/24-ggpubr-publication-ready-plots/76-add-p-values-and-significance-levels-to-ggplots/

0、加载包与示例数据

library(ggpubr)
library(patchwork)

#组别名最好是字符型;如果是数值类型,最好转为因子化
ToothGrowth$dose = factor(ToothGrowth$dose)
summary(ToothGrowth)
#       len        supp     dose   
# Min.   : 4.20   OJ:30   0.5:20  
# 1st Qu.:13.07   VC:30   1  :20  
# Median :19.25           2  :20  
# Mean   :18.81                   
# 3rd Qu.:25.27                   
# Max.   :33.90

head(ToothGrowth)
#    len supp dose
# 1  4.2   VC  0.5
# 2 11.5   VC  0.5
# 3  7.3   VC  0.5
# 4  5.8   VC  0.5
# 5  6.4   VC  0.5
# 6 10.0   VC  0.5

1、组间分析函数

ggpubr::compare_means()

  • 两组的情况
# (1)Wilcoxon
compare_means(len ~ supp, data = ToothGrowth) #default
# # 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.0645 0.064 0.064    ns       Wilcoxon

# (2)t检验
compare_means(len ~ supp, data = ToothGrowth,
              method = "t.test") 
# 1 len   OJ     VC     0.0606 0.061 0.061    ns       T-test

# (3) 修改adjP的计算方法
compare_means(len ~ supp, data = ToothGrowth,
              p.adjust.method = "BH") #default "holm"
# 1 len   OJ     VC     0.0645 0.064 0.064    ns       Wilcoxon

# (4)考虑其它变量的影响
compare_means(len ~ supp, data = ToothGrowth,
              group.by = "dose") 
# # A tibble: 3 x 9
# dose  .y.   group1 group2       p p.adj p.format p.signif method  
# <fct> <chr> <chr>  <chr>    <dbl> <dbl> <chr>    <chr>    <chr>   
# 1 0.5   len   OJ     VC     0.0232  0.046 0.023    *        Wilcoxon
# 2 1     len   OJ     VC     0.00403 0.012 0.004    **       Wilcoxon
# 3 2     len   OJ     VC     1       1     1.000    ns       Wilcoxon

# (5)如果进行配对分析
#那么需要保持每组的样本排列顺序是一致的
compare_means(len ~ supp, data = ToothGrowth,
              paired = T) 
# 1 len   OJ     VC     0.00431 0.0043 0.0043   **       Wilcoxon

# (6)修改标签阈值
compare_means(len ~ supp, data = ToothGrowth,
              symnum.args = list(cutpoints = c(0, 0.01, 0.05, 1), 
                                  symbols = c("***", "*", "not"))) 
# 1 len   OJ     VC     0.0645 0.064 0.064    not      Wilcoxon
  • 多组的情况
#(1)所有两两间比较
compare_means(len ~ dose, data = ToothGrowth) 
# .y.   group1 group2            p      p.adj p.format p.signif method  
# <chr> <chr>  <chr>         <dbl>      <dbl> <chr>    <chr>    <chr>   
# 1 len   0.5    1      0.00000702   0.000014   7.0e-06  ****     Wilcoxon
# 2 len   0.5    2      0.0000000841 0.00000025 8.4e-08  ****     Wilcoxon
# 3 len   1      2      0.000177     0.00018    0.00018  ***      Wilcoxon

# (2)都和0.5的组进行比较
compare_means(len ~ dose, data = ToothGrowth,
              ref.group = "0.5") 
# .y.   group1 group2            p      p.adj p.format p.signif method  
# <chr> <chr>  <chr>         <dbl>      <dbl> <chr>    <chr>    <chr>   
# 1 len   0.5    1      0.00000702   0.000007   7.0e-06  ****     Wilcoxon
# 2 len   0.5    2      0.0000000841 0.00000017 8.4e-08  ****     Wilcoxon

# (3)方差分析-有参
compare_means(len ~ dose, data = ToothGrowth,
              method = "anova") #有参
# .y.          p   p.adj p.format p.signif method
# <chr>    <dbl>   <dbl> <chr>    <chr>    <chr> 
# 1 len   9.53e-16 9.5e-16 9.5e-16  ****     Anova

# (4)方差分析-无参
compare_means(len ~ dose, data = ToothGrowth,
              method = "kruskal.test") #无参
# .y.               p        p.adj p.format p.signif method        
# <chr>         <dbl>        <dbl> <chr>    <chr>    <chr>         
# 1 len   0.00000000148 0.0000000015 1.5e-09  ****     Kruskal-Wallis

2、箱图可视化

2.1 两组比较
  • (1) 不同比较方法
p <- ggboxplot(ToothGrowth, x = "supp", y = "len",
               # 配色方案 ?ggboxplot
               color = "supp", palette = "aaas",
               add = "jitter")
#  Add p-value
p1 = p + stat_compare_means() #default Wilcoxon
p2 = p + stat_compare_means(method = "t.test")
p1 + p2
  • (2)标签显示格式
#标签位置
p1 = p + stat_compare_means(label.x.npc = "left",
                       # label.x = 1.5, label.y = 40
                       label.y.npc = "top")
#标签内容
p2 = p + stat_compare_means(aes(label = ..p.signif..)) 
#自定义阈值
p3 = p + stat_compare_means(aes(label = ..p.signif..), 
                       symnum.args = list(cutpoints = c(0, 0.01, 0.05, 1), 
                                          symbols = c("***",  "*", "notsig")),
                       label.x = 1.5, label.y = 40)
p1 | p2 | p3
  • (3)配对分析
# 要确保相同样本在不同组的排列顺序相同
ggpaired(ToothGrowth, x = "supp", y = "len",
         color = "supp", palette = "jco",
         line.color = "gray", line.size = 0.4) +
  stat_compare_means(paired = TRUE)
  • (4)考虑其它分组变量的影响
p <- ggboxplot(ToothGrowth, x = "supp", y = "len",
               color = "supp", palette = "jco",
               #add = "jitter",
               facet.by = "dose", 
               short.panel.labs = F)
p1 = p + stat_compare_means(label = "p.format")
# p + stat_compare_means(label =  "p.signif", label.x = 1.5)

p <- ggboxplot(ToothGrowth, x = "dose", y = "len",
               color = "supp", palette = "jco")
p2 = p + stat_compare_means(aes(group = supp))
# p + stat_compare_means(aes(group = supp), label = "p.signif")
p1 / p2
2.2 多组比较
  • (1)多组间比较可视化时,默认是 default 方差分析
p1 = ggboxplot(ToothGrowth, x = "dose", y = "len",
          color = "dose", palette = "jco")+
  stat_compare_means()

p2 = ggboxplot(ToothGrowth, x = "dose", y = "len",
          color = "dose", palette = "jco")+
  stat_compare_means(method = "anova")
p1 + p2
  • (2)多组间两两比较
p1 = ggboxplot(ToothGrowth, x = "dose", y = "len",
          color = "dose", palette = "jco")+ 
  stat_compare_means(comparisons = list( c("0.5", "1"), 
                                         c("1", "2"), 
                                         c("0.5", "2") ))


p2 = ggboxplot(ToothGrowth, x = "dose", y = "len",
          color = "dose", palette = "jco")+ 
  stat_compare_means(comparisons = list( c("0.5", "1"), 
                                         c("1", "2"), 
                                         c("0.5", "2") ), 
                     label.y = c(29, 35, 40))+ #指定标签的高度
  stat_compare_means(label.y = 45) #添加方差分析结果

p1 | p2
  • (3)直接指定一个参考组
ggboxplot(ToothGrowth, x = "dose", y = "len",
          color = "dose", palette = "jco")+
  stat_compare_means(method = "anova", label.y = 40)+      # Add global p-value
  stat_compare_means(label = "p.signif", method = "t.test",
                     ref.group = "0.5")                    # Pairwise comparison against reference
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容