rstan 如何存储单独链的后验样本?
How does rstan store posterior samples for separate chains?
我想了解 extract
在 rstan
中的输出如何排序后验样本。我知道我可以使用 as.array
、
查看每个链的后验样本
stanfit <- sampling(
model,
data = stan.data)
fitarray <- as.array(stanfit)
例如,fitarray[, 2, 1]
将给我第一个参数的第二个链的样本。在 extract
的输出中存储后验样本的一种方法是将它们连接起来。当我这样做时,
fit <- extract(stanfit)
mean(fitarray[,2,1]) == mean(fit$ss[1001:2000])
对于几个链和参数,我总是得到 TRUE
(ss
是第一个参数)。这使得后验样本看起来像是在 fit
中连接起来。但是,当我这样做时,
fitarray[,2,1] == fit$ss[1001:2000]
我得到 FALSE
(确认不仅仅是精度差异)。 fitarray
和 fit
似乎以不同方式存储迭代。如何分别查看每个后验样本链的迭代(按顺序)?
从rstan:::as.array.stanfit
可以看出,as.array
方法本质上定义为
extract(x, permuted = FALSE, inc_warmup = FALSE)
您对 extract
的默认使用会保留预热并随机排列 post-预热抽签,这就是索引与 as.array
输出不一致的原因。
我想了解 extract
在 rstan
中的输出如何排序后验样本。我知道我可以使用 as.array
、
stanfit <- sampling(
model,
data = stan.data)
fitarray <- as.array(stanfit)
例如,fitarray[, 2, 1]
将给我第一个参数的第二个链的样本。在 extract
的输出中存储后验样本的一种方法是将它们连接起来。当我这样做时,
fit <- extract(stanfit)
mean(fitarray[,2,1]) == mean(fit$ss[1001:2000])
对于几个链和参数,我总是得到 TRUE
(ss
是第一个参数)。这使得后验样本看起来像是在 fit
中连接起来。但是,当我这样做时,
fitarray[,2,1] == fit$ss[1001:2000]
我得到 FALSE
(确认不仅仅是精度差异)。 fitarray
和 fit
似乎以不同方式存储迭代。如何分别查看每个后验样本链的迭代(按顺序)?
从rstan:::as.array.stanfit
可以看出,as.array
方法本质上定义为
extract(x, permuted = FALSE, inc_warmup = FALSE)
您对 extract
的默认使用会保留预热并随机排列 post-预热抽签,这就是索引与 as.array
输出不一致的原因。