在JAGS / r2jags

时间:2016-07-10 19:44:07

标签: r simulation jags r2jags

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

不幸的是,该模型在某种程度上是棘手的(具有AR和VAR组件的分层结构)并且我无法直接在R中模拟数据。 在搜索互联网时,我发现blog post使用JAGS中的data{}块在JAGS中生成数据。在帖子中,作者直接在JAGS中估计了模型。由于我在R中有我的模型,我想在没有model{}块的情况下将数据传回R。这可能吗?

最佳, 赢

2 个答案:

答案 0 :(得分:2)

没有特别的理由需要使用数据块以这种方式生成数据 - 模型块可以很容易地“反向”工作,以根据固定参数生成数据。只需将参数指定为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为此提供了一些实用工具 - 我不确定,因为我不使用该包。

答案 1 :(得分:0)

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