OpenBUGS,可以/应该在(重新)启动时更改RNG种子吗?

时间:2015-11-19 15:27:41

标签: random winbugs openbugs

所以我尝试使用R2OpenBUGS使用来自R的OpenBUGS进行非常复杂的模型,模型工作的短期运行,但是更长的运行失败。当我在R2OpenBUGS中的错误调用中设置debug = T时,日志显示:抱歉模块MathRandnum出错了。显然,要获得收敛估计,我需要运行模型进行大量迭代,通常它不能进行40K迭代。

我尝试过的一件事是短时间运行模型,停止,保存链条然后重新启动,这至少告诉我它什么时候失败。在此运行中,模型在44到48K迭代之间失败。

我不太了解MathRandnum模块正在做什么,但它似乎是MCMc更新过程的一部分。

所以我考虑这个问题的方法是,一旦设置了OpenBUGS随机种子并给出了初始值,那么链条就会出现。价值观及其更新过程是确定性的。因此,对于任何给定的种子和初始值,故障将在给定的迭代中发生。因此,如果有一种方法可以在故障发生之前更改种子,则可能不会发生。在OpenBUGS GUI中,您无法在此时更改种子,需要在编译模型之后和更新之前完成。这就是我的问题,是否有可能在重新启动时更改种子?如果有可能这样做是错误的吗?

或者,这个模型可能出了什么问题,是我对MathRandnum可能正确做法的解释?鉴于我认为它在不同点失败但是一旦初始化它总是在同一点失败这是否意味着改变种子预设(它可以取值1-14)可能会解决它?

我的BUGS模型如下。

{
  # Priors
  #State model priors 

  shape.c ~ dunif(0.0001, 3) # dispersal kernel shape/scale parameters
  scale.alpha ~ dunif(0.0001, 3) #^
  tau2 <- 1/(sigma2 * sigma2)
  sigma2 ~ dunif(0, 5)
  phi ~  dunif(0, 1)
  alpha.theta ~ dnorm(0 , .01)
  #alpha.theta ~ dflat()
  beta.urb ~ dnorm(0 , .01)
  beta.wood ~ dnorm(0 , .01)
  beta.int ~ dnorm(0, .01)
  init.occ ~ dnorm(0, 1000)T(0, 1) # Strong prior! Assumption that  is absent from most sites in 2001

  for (t in 1:nyear) {
    alpha.p[t] ~ dnorm(mu.lp, tau.lp)
  }

  #Observation model priors


  mu.lp ~ dnorm(0, 0.01)                         
  tau.lp <- 1 / (sd.lp * sd.lp)                 
  sd.lp ~ dunif(0, 5)   

  dtype2.p ~ dunif(dtype2p_min,dtype2p_max) #List length factor effects
  dtype3.p ~ dunif(dtype3p_min,dtype3p_max) #

  #State model
  for (i in 1:nsite) {
    z[i,1] ~ dbern(init.occ)   # this follows from line 22
    theta[i] <- min(max(0.00000000001, thetalim[i]), 0.999999999999) # overflow constraint
    logit(thetalim[i]) <- alpha.theta + beta.urb*urban[i] + beta.wood*wood[i] + beta.int*wood[i]*urban[i]# + RE[i] #Site level environment relation
    for (t in 2:nyear) {        # This loop now starts at year 2002  
        gamma[i,t] <- min(max(0.00000000001, gammalim[i,t]), 0.999999999999) # overflow constraint
        gammalim[i,t] <- (shape.c/(2*scale.alpha*(exp(loggam(1/shape.c)))))*(exp(-1*(pow((d[i,t]/scale.alpha), shape.c)))) # dispersal kernel from  Clark 1998
        muZ[i,t] <- z[i ,t-1] * phi + (1 - z[i,t-1]) * gamma[i, t]*theta[i]   # Occupancy dynamics, 
        z[i,t] ~ dbern(muZ[i,t]) # True occupancy z at site i
    }
  }

  # Observation model
  for (j in 1:nvisit) {
    Py[j] <- z[Site[j], Year[j]] * p[j]
    logit(p[j]) <- alpha.p[Year[j]] + dtype2.p*DATATYPE2[j] + dtype3.p*DATATYPE3[j] 
    y[j] ~ dbern(Py[j])
    Presi[j] <- abs(y[j] - p[j])
    y.new[j] ~ dbern(Py[j])
    Presi.new[j] <- abs(y.new[j] - p[j])
  }

  # Bayesian Goodness-of-fit
  fit <- sum(Presi[])
  fit.new <- sum(Presi.new[])

  # Finite sample occupancy
  for (t in 2:nyear) {
    psi.fs[t] <- sum(z[1:nsite, t])/nsite
  }

0 个答案:

没有答案