Stan MCMC 链在预热和采样之间来回切换
Stan MCMC chains switching back and forth between warmup and sampling
我目前正在使用R结合Stan进行MCMC抽样以获得某个需求变量的后验分布d
,给定历史需求 dH
和当前观察到的变量 x
(因此公式计算出 P(d|dH, x)
,与 P(x|d)P(d|dH)
成正比。
我的问题
我发现采样过程显示 MCMC 在预热和采样之间 来回 跳跃真的很奇怪(不是第一个 nth
迭代的情况吗?总是处于 warmup 阶段,然后是实际的 sampling
阶段?)同时,它完全跳过了 Chain 1(?! ).下面是它显示的进度图片:
我的代码
for(i in 1:365){
nrow = nrow(rte_m[[i]]);
ncol = ncol(rte_m[[i]]);
A <- as.matrix(rte_m[[i]]);
sigma_x <- as.vector(sample.int(10, nrow(kf_vect[[i]]), replace=TRUE))
sigma_y <- as.vector(eps_vect[[i]])
yH <- as.vector(dh_vect[[i]]);
yT <- yH + as.vector(eps_vect[[i]]);
epsilon <- sample.int(10, nrow(kf_vect[[i]]), replace=TRUE)
x <- as.vector(as.matrix(rte_m[[i]])%*%yT) + epsilon
iterations = 500;
#input data into a list called stan_data
stan_data = list(nrow = nrow, ncol = ncol,
yH = yH,
x = x, epsilon = epsilon,
A = A, sigma_x = sigma_x, sigma_y = sigma_y);
#input it into our Stan model file "stamodeling.stan"
stanmodel1 <- stan_model(file = "stamodeling.stan",
model_name = "stanmodel1");
#MCMC sampling
stanfit <- sampling(stanmodel1, data = list(ncol = ncol,nrow = nrow,
yH = yH,
x=x, epsilon = epsilon,
A = A, sigma_x = sigma_x, sigma_y = sigma_y)
,iter=iterations, warmup = 200, chains = 4, cores = 2);
正在发生的事情不是给定链在预热和采样之间切换。相反,正在发生的是来自各个链的进度消息相互穿插。
因此,例如,当您看到以下内容时:
[Iteration:] 50/500 [0%] (Warmup)
[Iteration:] 50/500 [0%] (Warmup)
您实际上看到了两条消息,一条来自链 A,第二条来自链 B。
我目前正在使用R结合Stan进行MCMC抽样以获得某个需求变量的后验分布d
,给定历史需求 dH
和当前观察到的变量 x
(因此公式计算出 P(d|dH, x)
,与 P(x|d)P(d|dH)
成正比。
我的问题
我发现采样过程显示 MCMC 在预热和采样之间 来回 跳跃真的很奇怪(不是第一个 nth
迭代的情况吗?总是处于 warmup 阶段,然后是实际的 sampling
阶段?)同时,它完全跳过了 Chain 1(?! ).下面是它显示的进度图片:
我的代码
for(i in 1:365){
nrow = nrow(rte_m[[i]]);
ncol = ncol(rte_m[[i]]);
A <- as.matrix(rte_m[[i]]);
sigma_x <- as.vector(sample.int(10, nrow(kf_vect[[i]]), replace=TRUE))
sigma_y <- as.vector(eps_vect[[i]])
yH <- as.vector(dh_vect[[i]]);
yT <- yH + as.vector(eps_vect[[i]]);
epsilon <- sample.int(10, nrow(kf_vect[[i]]), replace=TRUE)
x <- as.vector(as.matrix(rte_m[[i]])%*%yT) + epsilon
iterations = 500;
#input data into a list called stan_data
stan_data = list(nrow = nrow, ncol = ncol,
yH = yH,
x = x, epsilon = epsilon,
A = A, sigma_x = sigma_x, sigma_y = sigma_y);
#input it into our Stan model file "stamodeling.stan"
stanmodel1 <- stan_model(file = "stamodeling.stan",
model_name = "stanmodel1");
#MCMC sampling
stanfit <- sampling(stanmodel1, data = list(ncol = ncol,nrow = nrow,
yH = yH,
x=x, epsilon = epsilon,
A = A, sigma_x = sigma_x, sigma_y = sigma_y)
,iter=iterations, warmup = 200, chains = 4, cores = 2);
正在发生的事情不是给定链在预热和采样之间切换。相反,正在发生的是来自各个链的进度消息相互穿插。
因此,例如,当您看到以下内容时:
[Iteration:] 50/500 [0%] (Warmup)
[Iteration:] 50/500 [0%] (Warmup)
您实际上看到了两条消息,一条来自链 A,第二条来自链 B。