R语言绘图进阶篇-ggstatsplot包

此文内容首发于微信公众号:R语言搬运工,关注公众号浏览更多精彩内容

原文链接

image

今天在Github上看到了一个有意思的包,作者IndrajeetPatil集合开发的ggstatsplot包,在绘图方面将不同的图和统计检验结果整合在了一起,使得视觉效果更加直观,实现了一图胜多言的效果。以下内容主要基于作者IndrajeetPatil发布的关于包ggstatsplot的详细介绍说明,在此表示感谢。
Patil, I. (2021). Visualizations with statistical details: The
'ggstatsplot' approach. Journal of Open Source Software, 6(61), 3167,
doi:10.21105/joss.03167

由于包里集合多种统计方法,内容非常丰富,现简单介绍其中第一部分:ggbetweenstats函数(一个整合了箱型图、小提琴图和统计检验方法结果的函数。

PS:想要弄清楚这个包返回的结果,必须要对目前主要的统计检验分析方法有一个相对较熟悉的了解。

使用的数据为包内所含电影分类时长的数据:

https://github.com/IndrajeetPatil/ggstatsplot

image.png

数据大体是说不同类型电影的时长

通过绘图来看Action和Comedy类型电影中,mpaa类型电影的时长分布模式,和mpaa分组之间的统计检验差异性。

先上代码和图,随后解释~~~~~~~

# for reproducibility
set.seed(123)

# plot
grouped_ggbetweenstats(
  data = dplyr::filter(movies_long, genre %in% c("Action", "Comedy")),
  x = mpaa,
  y = length,
  grouping.var = genre, # grouping variable
  outlier.tagging = TRUE, # whether outliers need to be tagged
  outlier.label = title, # variable to be used for tagging outliers
  outlier.coef = 2,
  ggsignif.args = list(textsize = 4, tip_length = 0.01),
  p.adjust.method = "hommel", # method for adjusting p-values for multiple comparisons
  # adding new components to `ggstatsplot` default
  ggplot.component = list(ggplot2::scale_y_continuous(sec.axis = ggplot2::dup_axis())),
  caption = substitute(paste(italic("Source"), ": IMDb (Internet Movie Database)")),
  palette = "default_jama",
  package = "ggsci",
  plotgrid.args = list(nrow = 1),
  annotation.args = list(title = "Differences in movie length by mpaa ratings for different genres")
)
image.png

图形中,一眼便可以看到是使用了箱型图和小提琴图绘制了数据的分布模式,这个在ggplot中可以很容易实现,但是统计检验方法结果在图中给出了详细的展示。(看左边半图,红线框出)

  1. 首先进行了参数检验,看一下三个组之间均值的差异性,并给出了检验参 数、置信区间等。

  2. 然后对三个组进行两两比较,比较方法为Games-Howell,矫正p值使用Games-Howell方法。通过添加倒扣的中括号进行诠释(只展示显著性的组)。

  3. 标记了异常值等数据。

4.给出了贝叶斯假设检验结果。

是不是非常的全面,可能对于新手还不是很能理解。看一下具体的展示说明


image.png

图形中以一个公式的形式展示统计检验结果,具体的参数意义包的开发者在网站上也已给出(如上图)。


image.png

看完上面的内容估计有点懵,说明统计方法的学习还不过关,其实小编也是懵的。
首先要看你的数据是几个分组:
image.png

分组的数量不同,在检验差异性时使用的方法是不一样的,具体的可以查看上图。

其次看一下数据符不符合统计假设条件:


image.png

在数理统计中,为检验不同分组间数据的差异性通常根据数据的分布形式使用不同的方法,当数据符合正态分布模式且方差齐性条件满足的时候,通常选择ANOVA分析方法进行检验。如果条件不满足就要根据具体情况再选择方法了,比如使用非参数检验。但是,也不一定!

当数据不符合正态分布且齐性条件满足的时候其实也可以使用方差检验,因为方差分析对数据的正态性并不是十分的敏感,同时可以考虑使用非参数检验。但是当数据也不符合方差齐性的时候这时候可以使用另一个检验方法welck检验,当你的实验设计为混合设计时,数据不符合正态分布和方差齐性,你可以考虑使用robust分析.

在ggstatsplot包中,作者也都集成了不同的参数用来设置:

ggbetweenstats(
data,
x,
y,
plot.type = "boxviolin",
type = "parametric",
pairwise.comparisons = TRUE,
pairwise.display = "significant",
p.adjust.method = "holm",
effsize.type = "unbiased",
bf.prior = 0.707,
bf.message = TRUE,
results.subtitle = TRUE,
xlab = NULL,
ylab = NULL,
caption = NULL,
title = NULL,
subtitle = NULL,
k = 2L,
var.equal = FALSE,
conf.level = 0.95,
nboot = 100L,
tr = 0.2,
centrality.plotting = TRUE,
centrality.type = type,
centrality.point.args = list(size = 5, color = "darkred"),
centrality.label.args = list(size = 3, nudge_x = 0.4, segment.linetype = 4,
min.segment.length = 0),
outlier.tagging = FALSE,
outlier.label = NULL,
outlier.coef = 1.5,
outlier.shape = 19,
outlier.color = "black",
outlier.label.args = list(size = 3),
point.args = list(position = ggplot2::position_jitterdodge(dodge.width = 0.6), alpha
= 0.4, size = 3, stroke = 0),
violin.args = list(width = 0.5, alpha = 0.2),
ggsignif.args = list(textsize = 3, tip_length = 0.01),
ggtheme = ggstatsplot::theme_ggstatsplot(),
package = "RColorBrewer",
palette = "Dark2",
ggplot.component = NULL,
output = "plot",
...
)

通过查看帮助文件,可以根据自己的要求选择不同的方法,比如type参数:


image.png

image.png

当测试两个分组之间差异性的时候同样可以使用该包进行绘制,这时候涉及的统计方法将更加丰富:

使用的数据为包gapminder提供的数据集,该数据集提供了从 1952 年到 2007 年 142 个国家中每一个国家的预期寿命、人均 GDP 和人口的值,每 5 年一次 (Gapminder Foundation)。


image.png

假设我们要检查的第一件事是 2007 年一个大陆国家的预期寿命分布。我们还想知道大陆之间预期寿命的平均差异是否具有统计显着性。

# since the confidence intervals for the effect sizes are computed using
# bootstrapping, important to set a seed for reproducibility
set.seed(123)

# function call
ggstatsplot::ggbetweenstats(
  data = dplyr::filter(gapminder::gapminder, year == 2007, continent != "Oceania"),
  x = continent,
  y = lifeExp
)
image.png

从图中可以看出,该函数默认返回贝叶斯因子进行测试。如果零假设显着性检验 (NHST) 方法无法拒绝零假设,则贝叶斯方法可以帮助索引支持零假设的证据(即BF01)

到目前为止,我们只使用了经典的参数测试和箱形小提琴图,但我们也可以使用其他可用选项:

type参数包含了下列缩写:"p"(为参数检验), "np"(为非参数检验), "r"(robust检验), "bf"(贝叶斯因子)。

显示的图型("box","violin",或"boxviolin")。

可以修改调色板。
首先,使用参数检验方法检验两组之间的差异性,使用的是welch统计方法

# for reproducibility
set.seed(123)
library(ggstatsplot)
library(gapminder)

# selecting subset of the data
df_year <- dplyr::filter(gapminder::gapminder, year == 2007 | year == 1957)

# parametric t-test and box plot
p1 <- ggstatsplot::ggbetweenstats(
  data = df_year,
  x = year,
  y = lifeExp,
  xlab = "Year",
  ylab = "Life expectancy",
  plot.type = "box",
  type = "p",
  conf.level = 0.99,
  title = "Parametric test",
  package = "ggsci",
  palette = "nrc_npg"
)
image.png

其次,使用非参数检验方法,使用的是曼-惠特尼U检验方法

p2 <- ggstatsplot::ggbetweenstats(
  data = df_year,
  x = year,
  y = lifeExp,
  xlab = "Year",
  ylab = "Life expectancy",
  plot.type = "violin",
  type = "np",
  conf.level = 0.99,
  title = "Non-parametric Test (violin plot)",
  package = "ggsci",
  palette = "uniform_startrek"
)
image.png

再次,使用稳健性分析(robust),检验方法为Yuen 的修整均值检验

p3 <- ggstatsplot::ggbetweenstats(
  data = df_year,
  x = year,
  y = lifeExp,
  xlab = "Year",
  ylab = "Life expectancy",
  plot.type = "boxviolin",
  type = "r",
  conf.level = 0.99,
  title = "Robust Test (box & violin plot)",
  tr = 0.005,
  package = "wesanderson",
  palette = "Royal2",
  k = 3
)
image.png

最后使用贝叶斯方法,

p4 <- ggstatsplot::ggbetweenstats(
  data = df_year,
  x = year,
  y = lifeExp,
  xlab = "Year",
  ylab = "Life expectancy",
  type = "bayes",
  plot.type = "box",
  title = "Bayesian Test (box plot)",
  package = "ggsci",
  palette = "nrc_npg"
)

image.png

image.png

ggstatsplot包功能强大,小编也在摸索中,文中可能存在一些错误和问题,请及时反馈进行修正。感兴趣的可以去网站学习一起交流,包的网站为:https://github.com/IndrajeetPatil/ggstatsplot

精彩推荐:

R语言绘制散点图geom_point
R语言添加拟合曲线geom_smooth
R语言箱线图boxplot
R语言线图geom_line

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

推荐阅读更多精彩内容