rstan 如何存储单独链的后验样本?

How does rstan store posterior samples for separate chains?

我想了解 extractrstan 中的输出如何排序后验样本。我知道我可以使用 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]) 

对于几个链和参数,我总是得到 TRUEss 是第一个参数)。这使得后验样本看起来像是在 fit 中连接起来。但是,当我这样做时,

fitarray[,2,1] == fit$ss[1001:2000]

我得到 FALSE(确认不仅仅是精度差异)。 fitarrayfit 似乎以不同方式存储迭代。如何分别查看每个后验样本链的迭代(按顺序)?

rstan:::as.array.stanfit可以看出,as.array方法本质上定义为

extract(x, permuted = FALSE, inc_warmup = FALSE)

您对 extract 的默认使用会保留预热并随机排列 post-预热抽签,这就是索引与 as.array 输出不一致的原因。