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