RUNJAGS固定种子,无需事先进行模拟

时间:2018-09-10 11:27:26

标签: random-seed jags runjags

我正在使用runjags从正态分布中采样一些数据。我没有任何用于模拟的参数。看来runjages没有使用参数来修复种子:list(".RNG.name"="base::Super-Duper", ".RNG.seed"=1)。 我将参数更改为list(muOfClustsim=rep(1, npop), ".RNG.name"="base::Super-Duper", ".RNG.seed"=1),但是它也不起作用。是-是否可以在runjags中修复此类模型的种子?

这是一个最小的可重现示例:

library(runjags)

npop=3
nrep=10
sdpop=7
sigma=5
seed=4

set.seed(seed)
N = npop*nrep # nb of observations

## Population identity of each individual used to sample genotypes but not used for common garden test
pop <- rep(1:npop, each=nrep)

muOfClustsim <- rnorm(npop, 0, sdpop) # vector of population means
(tausim <- 1/(sigma*sigma)) # precision of random individual error

# parameters are treated as data for the simulation step
data <- list(N=N, pop=pop, muOfClustsim=muOfClustsim, tausim=tausim)

## JAG model
txtstring <- "
data{
  # Likelihood:
  for (i in 1:N){
    ysim[i] ~ dnorm(eta[i], tausim) # tau is precision (1 / variance)
    eta[i] <- muOfClustsim[pop[i]]
  }

}

model{
fake <- 0
}
"
## Initial values with seed for reproducibility
initssim <- list(".RNG.name"="base::Super-Duper", ".RNG.seed"=1)
##initssim <- list(muOfClustsim=rep(1, npop), ".RNG.name"="base::Super-Duper", ".RNG.seed"=1)
## Simulate with jags
set.seed(seed)
out <- run.jags(txtstring, data = data, monitor=c("ysim"), sample=1, n.chains=1, inits=initssim, summarise=FALSE)
## reformat the outputs
(ysim1 <- coda::as.mcmc(out)[1:N])

set.seed(seed)
out <- run.jags(txtstring, data = data, monitor=c("ysim"), sample=1, n.chains=1, inits=initssim, summarise=FALSE)
## reformat the outputs
(ysim2 <- coda::as.mcmc(out)[1:N])

identical(ysim1, ysim2)

1 个答案:

答案 0 :(得分:1)

.RNG.name / .RNG.seed / .RNG.state初始值适用于模型(或更具体地说,模型内的链),而不在数据块内使用。这意味着(据我所知)无法在JAGS <= 4.3中使数据块内的任何随机表示可再现。可以在将来的JAGS版本中添加此功能,但是恐怕它的优先级较低,因为在传递给JAGS之前总是有可能(通常更好)在R中模拟数据。

在您的情况下,答案(假设您要使用JAGS)是在模型块而不是数据块中进行仿真:

txtstring <- "
model{
  # Likelihood:
  for (i in 1:N){
    ysim[i] ~ dnorm(eta[i], tausim) # tau is precision (1 / variance)
    eta[i] <- muOfClustsim[pop[i]]
  }
}
"

然后其余代码按预期运行§。值得注意的是,与JAGS相比,数据模拟通常更适合R,但我认为在这种情况下,您有特定的原因想要使用JAGS ...

马特


§尽管通常不应期望双精度严格相等,例如:

    identical(0.1+0.2, 0.3)

但是:

    abs(0.3 - (0.1+0.2)) < sqrt(.Machine$double.eps)

甚至更好:

    isTRUE(all.equal(0.1+0.2, 0.3))

这非常值得一看:https://www.youtube.com/watch?v=3Bu7QUxzIbA&t=1s