是否可以在R中的ggplot中重新创建bayesplot的“ mcmc_areas”图的功能

哈里森·W。

Stan支持的一个程序包bayesplot可以生成漂亮的密度区域图,该密度图下的密度曲线下的面积根据通过MCMC提取的后参数样本上的可信度间隔进行划分,这将导致如下图所示:

我想在ggplot中重新创建的绘图示例

我正在尝试使用ggplot给定一维采样值列表来制作类似的绘图样式,这样我就可以将任何通用值列表传递给它,而不必经过Stan拟合等。有人知道如何做到这一点吗?通过可以清除密度部分geom_density,但是我正在努力进行填充分区。

eipi10

这是一个生成类似于的图的函数bayesplot::mcmc_areas它以可选的间隔概率宽度设置来绘制可信间隔(默认为相等,或最高密度):

library(tidyverse)
library(ggridges)
library(bayestestR)
theme_set(theme_classic(base_size=15))

# Create ridgeplots with credible intervals
# ARGUMENTS
# data A data frame
# FUN A function that calculates credible intervals
# ci The width of the credible interval
# ... For passing optional arguments to geom_ridgeline. 
#      For example, change the scale parameter to control overlap of ridge lines. 
#      geom_ridgeline's default is scale=1.
plot_density_ridge = function(data, FUN=c("eti", "hdi"), ci=0.89, ...) {
  
  # Determine whether to use eti or hdi function
  FUN = match.arg(FUN)
  FUN = match.fun(FUN)
  
  # Get kernel density estimate as a data frame
  dens = map_df(data, ~ {
    d = density(.x, na.rm=TRUE)
    tibble(x=d$x, y=d$y)
  }, .id="name")
  
  # Set relative width of median line
  e = diff(range(dens$x)) * 0.006
  
  # Get credible interval width and median
  cred.int = data %>% 
    pivot_longer(cols=everything()) %>% 
    group_by(name) %>% 
    summarise(CI=list(FUN(value, ci=ci)),
              m=median(value, na.rm=TRUE)) %>% 
    unnest_wider(CI)
  
  dens %>% 
    left_join(cred.int) %>% 
    ggplot(aes(y=name, x=x, height=y)) +
      geom_vline(xintercept=0, colour="grey70") +
      geom_ridgeline(data= . %>% group_by(name) %>%
                       filter(between(x, CI_low, CI_high)),
                     fill=hcl(230,25,85), ...) +
      geom_ridgeline(data=. %>% group_by(name) %>% 
                       filter(between(x, m - e, m + e)),
                     fill=hcl(240,30,60), ...) +
      geom_ridgeline(fill=NA, ...) + 
      geom_ridgeline(fill=NA, aes(height=0), ...) +
      labs(y=NULL, x=NULL)
  
}

现在让我们尝试一下功能

# Fake data
set.seed(2)
d = data.frame(a = rnorm(1000, 0.6, 1),
               b = rnorm(1000, 1.3, 0.5),
               c = rnorm(1000, -1.2, 0.7))

plot_density_ridge(d)
plot_density_ridge(d, ci=0.5, scale=1.5)
plot_density_ridge(iris %>% select(-Species)) 
plot_density_ridge(iris %>% select(-Species), FUN="hdi")

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我正在尝试在R(ggplot2)中重新创建特定图

在ChartJS中重新创建此图

用ggplot2重新创建高级基本R图

使用 ggplot2 重新创建圆形图

在Python中重新创建R图-根据第三个值的范围更改颜色

创建两个镜像密度曲线的ggplot2图,中间有一条线图(或:在R中重新创建“漂移扩散模型”图)

在 matplotlib 中根据色标重新创建颜色图

如何在自定义按钮中重新创建Sharepoint快速编辑按钮功能

在PHP中重新创建js正则表达式匹配功能

是否可以使用Cereal重新创建Protobuf的反序列化功能之一?

是否可以忽略git中的文件重新创建?

重新创建 Google 表格功能

使用堆栈实现撤消和重做功能。如何编辑堆栈而无需在Haskell中重新创建堆栈

我可以在绘图中重新创建此极坐标蜘蛛图吗?

使用R重新创建用Igor绘制的轮廓图

ggplot2变亮,更改然后重新加载图像/图,而无需完全重新创建它

dart:是否可以缓存或重新创建在重复函数中创建的对象?

如何使用ggplot2重新创建以下箱形图和晶须图?

重新创建条形图而不记住数据

如何重新创建中高光功能?

我可以使用DRF重新创建ORO CRM API以获得我的项目的自定义功能

在R中重新创建spss GEE回归表

在Kotlin中重新创建对象

在Rails中重新创建表

git允许未提交的更改在新创建的功能分支中可见

Excel VBA中的查找功能仅引用新创建的工作表

是否可以重新创建.meteor目录?

是否可以从javascript重新创建选择?

是否可以仅使用CSS重新创建字幕?