没有特别的理由需要使用数据块以这种方式生成数据 - 模型块可以轻松地“反向”工作以基于固定参数生成数据。只需将参数指定为 JAGS 的“数据”,并监控模拟数据点(并根据数据集的需要运行尽可能多的迭代 - 可能只有 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为此提供了一些实用程序-我不确定,因为我不使用该软件包。