如何在 rstan 中绘制参数时间序列
How to plot parameters timeseries in rstan
我有一个已经 rstan
名为“fit”的合适对象,类型为:
Inference for Stan model: MySecondModel.
1 chains, each with iter=2000; warmup=1000; thin=1;
post-warmup draws per chain=1000, total post-warmup draws=1000.
mean se_mean sd 2.5% 25% 50% 75% 97.5% n_eff Rhat
step_size 0.01 0.00 0.00 0.01 0.01 0.01 0.01 0.01 493 1.00
theta_init 0.18 0.00 0.02 0.14 0.17 0.18 0.19 0.22 1167 1.00
theta_steps_unscaled[1] -0.02 0.02 0.91 -1.81 -0.60 0.00 0.58 1.73 1453 1.00
theta_steps_unscaled[2] -0.02 0.03 0.94 -1.95 -0.65 0.00 0.57 1.81 1382 1.00
theta_steps_unscaled[3] 0.14 0.03 0.95 -1.73 -0.51 0.15 0.80 2.01 1224 1.00
theta_steps_unscaled[4] -0.34 0.02 0.91 -2.05 -0.95 -0.36 0.26 1.44 1499 1.00
theta_steps_unscaled[5] -0.32 0.02 0.88 -2.02 -0.94 -0.31 0.31 1.32 2079 1.00
theta_steps_unscaled[6] -0.99 0.02 0.86 -2.69 -1.56 -0.98 -0.41 0.66 1759 1.00
theta_steps_unscaled[7] 0.23 0.03 0.94 -1.59 -0.40 0.24 0.88 2.06 1411 1.00
theta_steps_unscaled[8] -0.34 0.02 0.89 -2.13 -0.94 -0.38 0.24 1.34 1774 1.00
theta_steps_unscaled[9] -0.78 0.02 0.89 -2.49 -1.39 -0.75 -0.17 0.86 1509 1.00
theta_steps_unscaled[10] -0.66 0.02 0.87 -2.34 -1.28 -0.71 -0.05 1.05 1928 1.00
我想访问整个向量“theta_steps_unscaled”,首先是最终调试链,最后将其 mean/mode 绘制为时间序列。我一直在寻找类似 regex_pars 的东西,但似乎没有“stan”对象。
我能达到的最好结果是下面那个,但这不是我真正想要的。
我也试过这个,分析链:
traceplot(fit, "theta_steps_unscaled[6]")
Error in mcmc.list(x) : Arguments must be mcmc objects
最后将其转换为 mcmc:
traceplot(as.mcmc(fit, "theta_steps_unscaled[6]"))
虽然这引发了:
Error in xy.coords(x, y, xlabel, ylabel, log = log, recycle = TRUE) : 'list' object cannot be coerced to type 'double'
请注意我的最后一个目标是绘制整个矢量 theta_steps_unscaled[1:some_index]
,获得类似的 。
即具有可信区间、mode/mean 和其他贝叶斯参数。
tidybayes
是一种以方便的格式提取样本的简便方法。 (它也有方便的绘图功能;this vignette gives an overview。)我会使用 tidybayes
来提取您的样本,并使用 ggplot2
以您想要的方式绘制它们。
首先,提取采样值:
library(tidyverse)
theme_set(theme_bw())
library(tidybayes)
samples.df = fit %>%
spread_draws(theta_steps_unscaled[t]) %>%
ungroup()
接下来,用 x 轴上的步长和 y 轴上的可信区间绘制它们:
samples.df %>%
group_by(t) %>%
summarise(median = median(theta_steps_unscaled),
upper.95 = quantile(theta_steps_unscaled, 0.975),
lower.95 = quantile(theta_steps_unscaled, 0.025)) %>%
ggplot(aes(x = t, y = median)) +
geom_line(size = 1, color = "blue") +
geom_ribbon(aes(ymin = lower.95, ymax = upper.95),
fill = "blue", alpha = 0.1) +
scale_x_continuous("step", breaks = 1:10) +
scale_y_continuous(expression(theta))
情节看起来像这样:
我有一个已经 rstan
名为“fit”的合适对象,类型为:
Inference for Stan model: MySecondModel.
1 chains, each with iter=2000; warmup=1000; thin=1;
post-warmup draws per chain=1000, total post-warmup draws=1000.
mean se_mean sd 2.5% 25% 50% 75% 97.5% n_eff Rhat
step_size 0.01 0.00 0.00 0.01 0.01 0.01 0.01 0.01 493 1.00
theta_init 0.18 0.00 0.02 0.14 0.17 0.18 0.19 0.22 1167 1.00
theta_steps_unscaled[1] -0.02 0.02 0.91 -1.81 -0.60 0.00 0.58 1.73 1453 1.00
theta_steps_unscaled[2] -0.02 0.03 0.94 -1.95 -0.65 0.00 0.57 1.81 1382 1.00
theta_steps_unscaled[3] 0.14 0.03 0.95 -1.73 -0.51 0.15 0.80 2.01 1224 1.00
theta_steps_unscaled[4] -0.34 0.02 0.91 -2.05 -0.95 -0.36 0.26 1.44 1499 1.00
theta_steps_unscaled[5] -0.32 0.02 0.88 -2.02 -0.94 -0.31 0.31 1.32 2079 1.00
theta_steps_unscaled[6] -0.99 0.02 0.86 -2.69 -1.56 -0.98 -0.41 0.66 1759 1.00
theta_steps_unscaled[7] 0.23 0.03 0.94 -1.59 -0.40 0.24 0.88 2.06 1411 1.00
theta_steps_unscaled[8] -0.34 0.02 0.89 -2.13 -0.94 -0.38 0.24 1.34 1774 1.00
theta_steps_unscaled[9] -0.78 0.02 0.89 -2.49 -1.39 -0.75 -0.17 0.86 1509 1.00
theta_steps_unscaled[10] -0.66 0.02 0.87 -2.34 -1.28 -0.71 -0.05 1.05 1928 1.00
我想访问整个向量“theta_steps_unscaled”,首先是最终调试链,最后将其 mean/mode 绘制为时间序列。我一直在寻找类似 regex_pars 的东西,但似乎没有“stan”对象。
我能达到的最好结果是下面那个
我也试过这个,分析链:
traceplot(fit, "theta_steps_unscaled[6]")
Error in mcmc.list(x) : Arguments must be mcmc objects
最后将其转换为 mcmc:
traceplot(as.mcmc(fit, "theta_steps_unscaled[6]"))
虽然这引发了:
Error in xy.coords(x, y, xlabel, ylabel, log = log, recycle = TRUE) : 'list' object cannot be coerced to type 'double'
请注意我的最后一个目标是绘制整个矢量 theta_steps_unscaled[1:some_index]
,获得类似的
tidybayes
是一种以方便的格式提取样本的简便方法。 (它也有方便的绘图功能;this vignette gives an overview。)我会使用 tidybayes
来提取您的样本,并使用 ggplot2
以您想要的方式绘制它们。
首先,提取采样值:
library(tidyverse)
theme_set(theme_bw())
library(tidybayes)
samples.df = fit %>%
spread_draws(theta_steps_unscaled[t]) %>%
ungroup()
接下来,用 x 轴上的步长和 y 轴上的可信区间绘制它们:
samples.df %>%
group_by(t) %>%
summarise(median = median(theta_steps_unscaled),
upper.95 = quantile(theta_steps_unscaled, 0.975),
lower.95 = quantile(theta_steps_unscaled, 0.025)) %>%
ggplot(aes(x = t, y = median)) +
geom_line(size = 1, color = "blue") +
geom_ribbon(aes(ymin = lower.95, ymax = upper.95),
fill = "blue", alpha = 0.1) +
scale_x_continuous("step", breaks = 1:10) +
scale_y_continuous(expression(theta))
情节看起来像这样: