目标是展示各个ROI后验分布,95%HDI以及Mode值。在Kruschke的书中,他就提供了可以直接生成下图的函数。

当有多个ROI的后验分布需要展示时,山脊图就成了不错的选择。ggridges的官方教程(https://wilkelab.org/ggridges/articles/introduction.html)一看就会不多做介绍,这里只记录教程里没怎么提及的五毛特效。

  1. 添加线段显示分布的统计值(Mode)

  2. 展示分布的95%HDI区间

  3. 根据统计值进行排序

  4. 给山脊图添加阴影

最后效果如下:

配色使用了Kruschke的配色: skyblue

1.如何计算95%HDI

平时常用的95%的ETI(equal-tailed interval)在其界限的两侧有2.5%的分布,分别代表了2.5百分位数和97.5百分位数。在对称分布中,ETI和HDI(higest density interval)是一样的,但在非对称分布中则不然,例如下图的伽马分布,标出了95%的HDI和95%的ETI,显然使用95%HDI比95%ETI更准确地反映了分布的可信度。

95%HDI可以用Kruschke给的代码计算,也可以使用HDInterval中的hdi函数计算,后者支持的object类型很多,可以直接使用rjags得到的mcmc.list作为输入,默认计算的是95%HDI。

2.如何计算mcmc后验分布的mode值

在最大后验估计(MAP)中,我们使用后验分布的最大值来推导出我们感兴趣的点估计。一个分布的最大值也被称为它的 "mode"(假设是unimodal分布)。用mean,median还是mode作为后验分布的点估计可能依据情况而定。在Kruschke的书中他推荐了mode,但也说median相对mode会更稳定,在他的博客中他直接推荐的是mode。也有观点认为在某些条件下mean也是可行的。

将Kruschke提供的代码做出函数,可计算一个vector的MAP。

get_mode <- function(paramSampleVec){mcmcDensity = density(paramSampleVec)mo = mcmcDensity$x[which.max(mcmcDensity$y)]return(mo)
}

3. 数据准备

数据需要做出key+value的形式,使用gather转换为长表格形式(如下),之后就可以用来作图了。

df.para=as.data.frame(all_post.para) %>% gather(key='Region',value = 'Value')

4.生成一个基础版的山脊图

ggplot(df.para)+geom_density_ridges(aes(x = Value, y = Region)

5.根据教程内容添加几条线

很简单,就是加上quantile_lines,这里显示0.025和0.975的quantiles,也就是之前提到的95%ETI。

ggplot(df.para)+stat_density_ridges(aes(x = Value, y = Region),quantile_lines = TRUE, quantiles = c(0.025, 0.975))

6.把添加的线条换成我们想要的mode和95%HDI

如果需要显示自定义的统计值,比如mode和95%HDI的话,需添加一个quantile_fun,该函数返回相应统计值即可。结合计算mode和hdi的方法,建立一个函数,同时返回95% HDI lower,mode和HID upper三个值。

mode_hdi <- function(x,...){hdi_bound=hdi(x)mode=get_mode(x)return(c(hdi_bound['lower'],mode,hdi_bound['upper']))
}

再将这个函数放到ggridges中即可,可用vline_linetype设置线条类型。

ggplot(df.para)+stat_density_ridges(aes(x = Value, y = Region),quantile_lines = TRUE, quantile_fun = mode_hdi,vline_linetype = 2)

7. 给95%HDI加上颜色

在aes中加入fill = factor(stat(quantile))

之后将stat_density_ridges中加入geom = "density_ridges_gradient"

不设置geom,也可以直接使用geom_density_ridges_gradient函数。

此时fill的内容就被quantile_fun的三条线分为了四个部分,用scale_fill_manual添加四个自选的颜色,中间两个便是95%HDI。

ggplot(df.para)+stat_density_ridges(aes(x = Value, y = Region,fill = factor(stat(quantile))),geom = "density_ridges_gradient",quantile_lines = TRUE, quantile_fun = mode_hdi,vline_linetype = 2)+scale_fill_manual(values=c("skyblue4", "skyblue", "skyblue","skyblue4"), guide = "none")

8. 根据mode排序

在数据准备时,用fct_reorder将Region根据mode值排序即可,其中的.fun使用的是计算mode的函数。依此类推,设置.fun函数,就可以根据自定义的统计量进行排序,例如95%HDI的宽度,mean,median值等。

df.para=as.data.frame(all_post.para) %>% gather(key='Region',value = 'Value') %>% mutate(Region=fct_reorder(Region,Value,.fun=get_mode,.desc = TRUE))

用该数据作图如下,根据mode排序完成:

9. 替换ROI的缩写

可以准备一个缩写的对照表如下:

在数据准备时,用rename_all和str_replace_all根据对照表将缩写批量替换。

df.para=as.data.frame(all_post.para) %>% rename_all(~stringr::str_replace(.,"L_|R_","")) %>% # Rename labelsrename_all(~stringr::str_replace_all(.,setNames(full_label,paste0(orig_label,'$')))) %>% # add $ to get exact match gather(key='Region',value = 'Value') %>% mutate(Region=fct_reorder(Region,Value,.fun=get_mode,.desc = TRUE))

用该数据作图如下,替换label完成:

额外内容

  1. 添加阴影和垂直线

在山脊图的代码加入geom_rect添加一个有颜色的矩形即可,添加垂直线也是一样的原理。

geom_rect(data = data.frame(x = 1),xmin = -0.2, xmax = -0.05, ymin = -Inf, ymax = Inf,alpha = 0.4, fill = "gray")+
geom_vline(xintercept = -0.1)

2. 可以考虑将mode用ggseg画出来,并跟山脊图拼在一起。

->ggseg教程<-

3. bayestestR和bayesplot等工具包都有一些展示后验分布的函数可供使用。

bayestestR

bayesplot

用山脊图展示后验分布相关推荐

  1. 在线作图|如何绘制一张山脊图

    山脊图(Ridgeline chart) 山脊图(Ridgeline chart)作为可视化图形的一种,可以研究不同群组的数值变量的分布情况,展示不同类别数据在同一因素的不同水平下的分布差异,分布可以 ...

  2. python 山脊图_纯Python绘制艺术感满满的山脊地图,创意满分

    而今天的文章,我们就来一起基于 Python ,配合颜色与字体的选择搭配,使用简短的代码,就可以创作出艺术海报级别的 山脊地图 . 2 基于ridge_map的山脊地图绘制 我们主要使用 matplo ...

  3. python 山脊图_纯Python绘制满满艺术感的山脊地图

    ❝ 本文示例代码及附件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes❞ 1 简介 下面的这幅图可能很多读者朋友们都看到 ...

  4. 245热图展示微生物组的物种和功能丰度或有无、距离矩阵

    245热图展示微生物组的物种和功能丰度或有无 本节作者:吴一磊 中科院微生物所 版本1.0.7,更新日期:2020年8月13日 本项目永久地址:https://github.com/YongxinLi ...

  5. 水稻微生物组时间序列分析3-冲击图展示时间序序列变化

    写在前面 图3. 哪些菌门随时间呈现规律变化呢? 绘图实战 清空工作环境和加载包 读入实验设计.OTU表和物种注释 筛选高丰度门用于展示 数据交叉筛选 按样品绘图 按组绘图 绘制冲击图alluvium ...

  6. R语言ggridges包可视化山脊图(Ridgeline Plots)并且在山脊图中添加均值竖线(Add Mean Line to RIdgeline Plot with ggridges in R)

    R语言ggridges包可视化山脊图(Ridgeline Plots)并且在山脊图中添加均值竖线(Add Mean Line to RIdgeline Plot with ggridges in R) ...

  7. seaborn使用FacetGrid函数可视化山脊图(Ridgeline Plot with Seaborn)

    seaborn使用FacetGrid函数可视化山脊图(Ridgeline Plot with Seaborn) 目录 seaborn使用FacetGrid函数可视化山脊图(Ridgeline Plot ...

  8. R语言ggplot2可视化:水平半小提琴图(Horizontal Half Violin Plots)、去除水平半小提琴图中的填充色、ggridges包的绘制山脊图

    R语言ggplot2可视化:水平半小提琴图(Horizontal Half Violin Plots).去除水平半小提琴图中的填充色.ggridges包的geom_density_ridges函数绘制 ...

  9. R语言ggplot2可视化使用ggridges包可视化山脊图(Ridgeline Plots):山脊图(Ridgeline Plots)应用场景、受试者口服茶碱的之后观察茶碱的浓度变化的山脊图

    R语言ggplot2可视化使用ggridges包可视化山脊图(Ridgeline Plots):山脊图(Ridgeline Plots)应用场景.受试者口服茶碱的之后观察茶碱的浓度变化的山脊图(Rid ...

最新文章

  1. android 收不到短信广播,android – 短信广播接收器没有得到textmessage
  2. 显著性检验python
  3. 《EMCAScript6入门》读书笔记——24.编程风格
  4. IT 需要知道的一些专业名词和解释 (长期更新)
  5. Python3算法基础练习:编程100例(1~5)
  6. DataGridView编辑后立即更新到数据库的两种方法
  7. php ajax jquery 表单重复提交,jQuery的 $.ajax防止重复提交的两种方法(推荐)
  8. Linux服务器同步时间
  9. Scala学习笔记04:内建控制结构
  10. 数据库中的DbUtils
  11. 灵魂拷问:如何检查 Java 数组中是否包含某个值 ?
  12. mysql5.6 主从同步
  13. 为什么「margin:auto」可以让块级元素水平居中?
  14. WordPress数据库error establishing a database connection错误
  15. visio一分二的箭头_visio软件双箭头连接线怎么画?
  16. 【Java Map数据】中国各省份省会城市经纬度
  17. 21世纪十大营销法则
  18. 硬件机械测试项目及判据
  19. 实践:Linux上安装nginx后同一服务器进行多域名反向代理
  20. 去除latex中cctbook里面二级章节标题中前面的双s符号

热门文章

  1. 邮箱客户端如何登录?
  2. python只显示重复值_使用内置条件格式的OpenPyXL:重复值和唯一值
  3. 数字经济2.0—趋势、逻辑、选择
  4. Tomcat执行startup.bat出现闪退的可能原因
  5. 绑定机制(转自天运科技)
  6. C语言变量常量,基本数据类型及数据类型转换详讲
  7. 一、数据仓库基础理论
  8. H5移动端滑动表格固定表头和首列(纯css实现)
  9. elementui固定表格头部
  10. DEDE织梦常用的调用方法