前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >60-R可视化-8-用ggsignif做统计分析绘图

60-R可视化-8-用ggsignif做统计分析绘图

作者头像
北野茶缸子
发布2021-12-17 10:56:40
2.3K0
发布2021-12-17 10:56:40
举报
文章被收录于专栏:北野茶缸子的专栏

参考:R绘图系列-带有significant信息的boxplot | showteeth's blog[1]GitHub - const-ae/ggsignif: Easily add significance brackets to your ggplots[2][ggplot2添加p值和显著性 - 简书 (jianshu.com)](https://www.jianshu.com/p/77f12664540b "ggplot2添加p值和显著性 - 简书 (jianshu.com "ggplot2添加p值和显著性 - 简书 (jianshu.com)")")

前言

之前提到过两个快速出图的R包:58-R可视化-7-用ggpubr与ggstatsplot快速出高颜值图 (qq.com)

通过看包说明不难发现,他们其实都调用了ggsignif:

通过这个包,我们就可以给自己创建的ggplot 绘图对象添加统计数据了。

简单学习一下ggsignif这个包:

这个包用起来非常简单,我们无须对数据框做任何处理,只需要在ggplot 的绘图代码基础上增加一些代码即可。

直接使用tidyverse 套件里的数据框iris:

代码语言:javascript
复制
> glimpse(iris)
Rows: 150
Columns: 5
$ Sepal.Length <dbl> 5.1, 4.9, 4.7, 4.6, 5.0, 5.4, 4.6, 5.0, 4.4, 4.9, 5.4, 4.8, 4.8, 4.3, 5.8, 5.7, 5.4, ~
$ Sepal.Width  <dbl> 3.5, 3.0, 3.2, 3.1, 3.6, 3.9, 3.4, 3.4, 2.9, 3.1, 3.7, 3.4, 3.0, 3.0, 4.0, 4.4, 3.9, ~
$ Petal.Length <dbl> 1.4, 1.4, 1.3, 1.5, 1.4, 1.7, 1.4, 1.5, 1.4, 1.5, 1.5, 1.6, 1.4, 1.1, 1.2, 1.5, 1.3, ~
$ Petal.Width  <dbl> 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.3, 0.2, 0.2, 0.1, 0.2, 0.2, 0.1, 0.1, 0.2, 0.4, 0.4, ~
$ Species      <fct> setosa, setosa, setosa, setosa, setosa, setosa, setosa, setosa, setosa, setosa, setos~

两组数据比较

主要使用方法geom_signif:

代码语言:javascript
复制
ggplot(iris,aes(Species,Sepal.Length,fill=Species)) + 
geom_boxplot()+geom_jitter(shape=16,size=2,position=position_jitter(0.2))+
  geom_signif(comparisons = list(c("versicolor", "virginica"),
                                 c("versicolor","setosa"),
                                 c("virginica","setosa")),
              map_signif_level=T,
              textsize=6,test=wilcox.test,step_increase=0.2)+
  guides(fill=FALSE)+xlab(NULL)+theme_classic()

这里我们通过comparisons 参数传入一个列表,列表中的元素为匹配给x 轴列中的分组信息。

这里我们需要手动指定。比如我们的数据有A,B,C 则需要列举两两间的所有可能。

有时候我们可能并不想要显著符号,而是需要具体的P值,可以设定map_signif_level 参数为F。

除此之外,test 参数默认为非参数方法的wilcox.test,如果我们的数据检验为正态,可以修改为t.test。

代码语言:javascript
复制
> tmp2 <- iris
> tmp2$norm.Length <- rnorm(150, 30, 4)
> shapiro.test(tmp2$norm.Length)

 Shapiro-Wilk normality test

data:  tmp2$norm.Length
W = 0.99252, p-value = 0.6236

验证正态分布后,使用t.test。ps:其实这里虽然数据本身是按照正态划分,但分组以后的数据呢?其实最好再对分组之后的每个数据做一个正态性检验。这里我只是举个例子,实际应用中参数方法还应考虑方差齐性等。比如正态方差非齐性的数据,一般还会选择Welch双样本t检验。

代码语言:javascript
复制
ggplot(iris,aes(Species,Sepal.Length,fill=Species)) + 
  geom_boxplot()+geom_jitter(shape=16,size=2,position=position_jitter(0.2))+
  geom_signif(comparisons = list(c("versicolor", "virginica"),
                                 c("versicolor","setosa"),
                                 c("virginica","setosa")),
              map_signif_level=F,
              textsize=6,test=t.test,step_increase=0.2)+
  guides(fill=FALSE)+xlab(NULL)+theme_classic()

ps:这里我觉得可以参考ggstatsplot 的方法,最好在图像中标记使用的是何种统计检验方法。不得不说,虽然审美层面我对其的一些做法并不认同,但可视化领域,它真的是老师般的存在。

多组比较

主要使用方法stat_compare_means。如果需要检验两组以上数据是否存在差异,使用该方法。

和geom_signif 一样,stat_compare_means 也有参数 method 指定检验方法,非参数方法kruskal.test 与参数方法anova:

代码语言:javascript
复制
ggplot(iris,aes(Species,Sepal.Length,fill=Species)) + 
  geom_boxplot()+
  # scale_fill_jco()+
  geom_jitter(shape=16,size=2,position=position_jitter(0.2))+
  stat_compare_means(method = "kruskal.test")+theme_bw()

一些参数

代码语言:javascript
复制
# comparisons:需要进行统计检验的组别。
# step_increase:调整每个显著性标记之间的间隔。 
# test:指定要使用的检验类型,默认是wilcox.test 
# map_signif_level:是显示具体pvalue还是显示符号c("***"=0.001,"**"=0.01, "*"=0.05),可以自行指定符号。
# y_position:指定显著性标记的高度,如y_position=c(4,5,6) 
# tip_length:设置横线两端向下生出的长度,如 tip_length = c(0)
# xmax, xmin: 标记棒的起始与终止位置

其他操作

自定义显著符号与显著表达数值

代码语言:javascript
复制
ggplot(iris,aes(Species,Sepal.Length,fill=Species)) + 
  geom_boxplot()+geom_jitter(shape=16,size=2,position=position_jitter(0.2))+
  geom_signif(comparisons = list(c("versicolor", "virginica"),
                                 c("versicolor","setosa"),
                                 c("virginica","setosa")),
              map_signif_level=c("@@@"=0.005,"@@"=0.01, "@"=0.1),
              textsize=6,test=t.test,step_increase=0.2)

分面

比如我们可以给图片进行分面,也会自动识别出分组并添加显著记录:

代码语言:javascript
复制
iris2 <- iris
iris2$facet_group <- sample(1:4, 150 ,replace = T)

my_comparisons <- list( c("setosa", "versicolor"), 
                        c("setosa", "virginica"), 
                        c("versicolor", "virginica") )

ggplot(iris2,aes(Species, Sepal.Length)) + geom_boxplot(aes(color = Species)) +
  facet_grid(. ~facet_group) + 
  geom_signif(comparisons = my_comparisons,
                                           map_signif_level=T,
                                           textsize=6,test=wilcox.test,step_increase=0.2)

也就是开头这张图了:

手动标记

虽然ggsignif可以帮助我们非常方便的标记显著,无论是分面显示,还是依赖comparisons 指定组别。

但如果我们希望对多个层面分组的数据进行比较呢?

这时候就需要我们手动标记了。

需要自己计算p 值并使用annotation 参数标记。

代码语言:javascript
复制
anno <- wilcox.test(iris2[iris2$facet_group == "3" & iris2$Species == "versicolor", "Sepal.Length"], 
                    iris2[iris2$facet_group == "2" & iris2$Species == "virginica", "Sepal.Length"])$p.value
ggplot(iris2,aes(Species, Sepal.Length)) + geom_boxplot(aes(color = facet_group)) +
  geom_signif(annotation=formatC(anno, digits=1),
              y_position=8, xmin=2.05, xmax=2.9, 
              tip_length = c(0.2, 0.04))

其实这里直接用ggplot 图形函数annotate 也是差不多的。

关于annotations 参数的详细用法,可以参考:Chapter 5 How to Annotate a Graph Using GG Signif[3]

带颜色的标记

需要注意的是,ggplot 的映射是全局的,因此如果指定color 就会变成:

代码语言:javascript
复制
ggplot(iris2,aes(Species, Sepal.Length, color = facet_group)) + geom_boxplot() +
  geom_signif(comparisons = my_comparisons,
              map_signif_level=T,
              textsize=6,test=wilcox.test,step_increase=0.2)

一些思考

  • 可问题是,如果我color 与x 均映射的多个组别希望进行比较,应该如何设定呢?难道annotation 一个一个手动标记吗?
  • 有没有方法可以更好地创建list 呢?批量生成一个两两组合的list。

参考资料

[1]R绘图系列-带有significant信息的boxplot | showteeth's blog: http://showteeth.tech/posts/40911.html

[2]GitHub - const-ae/ggsignif: Easily add significance brackets to your ggplots: https://github.com/const-ae/ggsignif

[3]Chapter 5 How to Annotate a Graph Using GG Signif: https://www.crumplab.com/psyc7709_2019/book/docs/how-to-annotate-a-graph-using-gg-signif.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 北野茶缸子 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 两组数据比较
  • 多组比较
  • 一些参数
  • 其他操作
    • 自定义显著符号与显著表达数值
      • 分面
        • 手动标记
          • 带颜色的标记
            • 参考资料
        • 一些思考
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档