Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以在GGR中重新创建bayesplot的“mcmc_区域”绘图功能_R_Ggplot2_Stan - Fatal编程技术网

是否可以在GGR中重新创建bayesplot的“mcmc_区域”绘图功能

是否可以在GGR中重新创建bayesplot的“mcmc_区域”绘图功能,r,ggplot2,stan,R,Ggplot2,Stan,Stan支持一个名为bayesplot的软件包,该软件包可以生成良好的密度面积图,密度曲线下的面积根据通过MCMC绘制的后参数样本的可信区间进行划分,这将生成如下图: 我正在寻找一个类似的绘图风格,给定使用ggplot的1D采样值列表,我可以将任何通用值列表传递给它,而不必是标准拟合等。有人知道如何做到这一点吗?通过geom_density,密度部分是清晰的,但我正在努力解决填充分区问题。使用软件包: 图书馆管理员 图书馆屋脊 tibbledata_1,data_2,data_3%>% pivo

Stan支持一个名为bayesplot的软件包,该软件包可以生成良好的密度面积图,密度曲线下的面积根据通过MCMC绘制的后参数样本的可信区间进行划分,这将生成如下图:

我正在寻找一个类似的绘图风格,给定使用ggplot的1D采样值列表,我可以将任何通用值列表传递给它,而不必是标准拟合等。有人知道如何做到这一点吗?通过geom_density,密度部分是清晰的,但我正在努力解决填充分区问题。

使用软件包:

图书馆管理员 图书馆屋脊 tibbledata_1,data_2,data_3%>% pivot_longereverything%>% ggplotaesx=值,y=名称,组=名称+ 几何密度 数据:

第123集 n使用包装:

图书馆管理员 图书馆屋脊 tibbledata_1,data_2,data_3%>% pivot_longereverything%>% ggplotaesx=值,y=名称,组=名称+ 几何密度 数据:

第123集
n这里有一个函数,它生成类似于bayesplot::mcmc_区域的绘图。默认情况下,它绘制等尾可信区间,或绘制具有区间概率宽度可选设置的最高密度:

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")

下面是一个生成类似于bayesplot::mcmc_区域的绘图的函数。默认情况下,它绘制等尾可信区间,或绘制具有区间概率宽度可选设置的最高密度:

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")

如果您可以提供示例数据和您的问题,这会很有帮助。这就为所有答案提供了一个通用的数据集,便于比较解决方案。如果您能提供示例数据和问题,这会很有帮助。这为所有答案提供了一个通用的数据集,便于比较解决方案。这很好,谢谢,需要注意的一点是,mcmcèU区域使用的是等尾间隔而不是最高密度,对于为什么输出略有不同,一时感到困惑,可能值得修改解决方案,以使用Bayeststr包中提供的eti,或者至少要注意这种情况。我还有一个问题是如何使其不重叠,对你来说似乎很好,但当我使用你的函数创建图时,脊线往往会相互重叠,看起来更大?请参阅更新的答案。该函数现在提供了ETI或HDI的选择,并默认使用ETI。我还演示了如何使用比例参数来控制山脊线重叠。这很好,谢谢,需要注意的一点是,mcmcèU区域使用的是等尾间隔,而不是最高密度,对于为什么输出略有不同,我一时感到困惑,可能值得修改解决方案,以使用Bayeststr包中提供的eti,或者至少要注意这种情况。我还有一个问题是如何使其不重叠,对你来说似乎很好,但当我使用你的函数创建图时,脊线往往会相互重叠,看起来更大?请参阅更新的答案。该函数现在提供了ETI或HDI的选择,并默认使用ETI。我还演示了如何使用scale参数来控制山脊线重叠。