在 JAGS/r2jags 中模拟数据

Simulate data in JAGS/r2jags

是否可以将 JAGS 滥用为从具有已知参数的模型生成数据的工具?我需要从预定义模型中采样数据点,以便进行模拟研究并测试我在 R 中开发的模型的功能。

不幸的是,该模型有点棘手(具有 AR 和 VAR 组件的层次结构),我无法直接在 R 中模拟数据。 在互联网上搜索时,我发现了一个 blog post,其中数据是使用 JAGS 中的 data{} 块在 JAGS 中生成的。在 post 中,作者直接在 JAGS 中估计了模型。因为我在 R 中有我的模型,所以我想在没有 model{} 块的情况下将数据传输回 R。这可能吗?

最好的, 赢

没有特别的理由需要使用数据块以这种方式生成数据 - 模型块可以很容易地在 'reverse' 中工作以根据固定参数生成数据。只需将参数指定为 JAGS 的 'data',并监视模拟数据点(并且 运行 可以根据需要的数据集进行尽可能多的迭代——可能只有 1 次!)。

话虽如此,原则上您可以使用数据块或模型块(或两者的组合)来模拟数据,但您需要有一个模型块(即使它是一个简单且无关的模型) JAGS 到 运行。例如,下面使用数据块来模拟一些数据:

txtstring <- '
data{
    for(i in 1:N){
        Simulated[i] ~ dpois(i)
    }
}

model{
    fake <- 0
}
#monitor# Simulated
#data# N
'


library('runjags')

N <- 10
Simulated <- coda::as.mcmc(run.jags(txtstring, sample=1, n.chains=1, summarise=FALSE))
Simulated

唯一真正的区别是数据块只更新一次(在模拟开始时),而模型块在每次迭代时更新。在这种情况下,我们只取 1 个样本,所以没关系,但如果您想在同一个 JAGS 运行 中生成模拟数据的多个实现,则必须将代码放在模型块中。 [数据块和模型块之间可能还有其他差异,但我想不出有任何差异]。

请注意,您将以不同的格式从 JAGS 取回数据(单个向量,其名称给出了受监视数据中任何数组的索引),因此可能需要一些工作才能将其取回向量/数组/R 中的任何内容的列表。编辑:除非 R2jags 为此提供一些实用程序 - 我不确定,因为我不使用那个包。

使用模型块 运行 模拟多个数据集的单个 MCMC 链会出现问题,因为 MCMC 样本通常是相关的。 (每个后续样本都是使用前一个样本绘制的)。对于模拟研究,您可能希望从您的分布中生成独立样本。要走的路是递归地使用数据或模型块,例如在 for 循环中,这将确保您的样本是独立的。