BUGS中未定义的变量,缺少值

时间:2014-08-05 16:56:23

标签: r winbugs r2winbugs

我正在通过R运行一个BUGS模型,我遇到了BUGS的问题,我的一个数据集是一个'未定义的变量'。它有问题的数据集中有相当多的NA,但为什么会导致问题呢?当NA被0替换时,它工作得很好,所以我知道使用NA的BUGS存在问题。使用0而不是NA是不可接受的解决方案,因为我需要记录转换结果数量。有没有人碰到类似的东西,找到了解决方案?

以下是我正在努力解决的模型部分:

rm(list=ls(all=T))
library(R2OpenBUGS)

#set working directory separately, I name it here
 working_dir=getwd()

mod=function(){
  tau.cat~dgamma(0.001, 0.001)
  q.unr~dnorm(0, 1E-10)

  for(y in 1:nyears){
   log.N[y]~dnorm(0, 1E-10)
   N[y]<-exp(log.N[y])
   }

  for(w in 1:4){
   for(y in 1:nyears){
   #generating estimated catch
   est.c.cat.unr[y,w]<-N[y]*(1-exp(-q.unr*c.eff.unr[y,w]))
   #fitting it to data
   c.cat.unr[y,w]~dnorm(est.c.cat.unr[y,w], tau.cat)
  }
 }
}

#write model to a .txt file to pass to BUGS
write.model(mod, paste(working_dir, '/model_file.txt', sep=""))

dat=list(
 nyears=38,
 c.cat.unr=c.cat.unr,
 c.eff.unr=c.eff.unr)

#creating initial values for each chain
init1=list(
 log.N=log(rep(180000, 38)),
 q.unr=1E-5,
 tau.cat=.0001)

init2=list(
 log.N=log(rep(250000, 38)),
 q.unr=1E-6,
 tau.cat=.001)

inits=list(init1, init2)

#pass the model to BUGS; debug=T will keep the BUGS window open so you can see errors
sim=bugs(data=dat, 
     inits=inits, 
     parameters.to.save=c("N"), 
     n.iter=1000,
     n.chains=2,
     n.burnin=500,
     n.thin=1,
     model.file="model_file.txt",
     debug=T,
     codaPkg=T,
     working.directory=working_dir)

 ######DATA######

          ##c.cat.unr##

      chw.3 chw.4 chw.5 chw.6
 [1,]    NA 20010    NA    NA
 [2,] 12458 16227    NA    NA
 [3,] 18483 10066    NA    NA
 [4,] 24633    NA    NA    NA
 [5,]  9891    NA    NA    NA
 [6,] 29882    NA    NA    NA
 [7,]  4912 24628    NA    NA
 [8,] 13406    NA    NA    NA
 [9,]    NA 17181    NA    NA
[10,]    NA    NA    NA    NA
[11,]    NA    NA    NA    NA
[12,]    NA    NA    NA    NA
[13,]    NA    NA    NA    NA
[14,]    NA    NA    NA    NA
[15,]    NA    NA    NA    NA
[16,]    NA    NA    NA    NA
[17,]    NA    NA    NA    NA
[18,]    NA    NA    NA    NA
[19,]    NA    NA    NA    NA
[20,]    NA    NA    NA    NA
[21,]    NA    NA    NA    NA
[22,]    NA    NA    NA    NA
[23,]    NA    NA    NA    NA
[24,]    NA    NA    NA    NA
[25,]    NA    NA    NA    NA
[26,]    NA    NA    NA    NA
[27,]    NA    NA    NA    NA
[28,]    NA    NA    NA    NA
[29,]    NA    NA    NA    NA
[30,]    NA    NA    NA    NA
[31,]    NA    NA    NA    NA
[32,]    NA    NA    NA    NA
[33,]    NA    NA    NA    NA
[34,]    NA    NA    NA    NA
[35,]    NA    NA    NA    NA
[36,]    NA    NA    NA    NA
[37,]    NA    NA    NA    NA
[38,]    NA    NA    NA    NA


         ##c.eff.unr##

      cew.3 cew.4 cew.5 cew.6
 [1,]    NA  5724    NA    NA
 [2,]  2802  2904    NA    NA
 [3,]  3972  2004    NA    NA
 [4,]  6432    NA    NA    NA
 [5,]  2814    NA    NA    NA
 [6,]  6180    NA    NA    NA
 [7,]  2784  5970    NA    NA
 [8,]  5634    NA    NA    NA
 [9,]    NA  5562    NA    NA
[10,]    NA    NA    NA    NA
[11,]    NA    NA    NA    NA
[12,]    NA    NA    NA    NA
[13,]    NA    NA    NA    NA
[14,]    NA    NA    NA    NA
[15,]    NA    NA    NA    NA
[16,]    NA    NA    NA    NA
[17,]    NA    NA    NA    NA
[18,]    NA    NA    NA    NA
[19,]    NA    NA    NA    NA
[20,]    NA    NA    NA    NA
[21,]    NA    NA    NA    NA
[22,]    NA    NA    NA    NA
[23,]    NA    NA    NA    NA
[24,]    NA    NA    NA    NA
[25,]    NA    NA    NA    NA
[26,]    NA    NA    NA    NA
[27,]    NA    NA    NA    NA
[28,]    NA    NA    NA    NA
[29,]    NA    NA    NA    NA
[30,]    NA    NA    NA    NA
[31,]    NA    NA    NA    NA
[32,]    NA    NA    NA    NA
[33,]    NA    NA    NA    NA
[34,]    NA    NA    NA    NA
[35,]    NA    NA    NA    NA
[36,]    NA    NA    NA    NA
[37,]    NA    NA    NA    NA
[38,]    NA    NA    NA    NA

模型还有更多,但其余的运行得很好。我已经删除了模型的其余部分,只包括给我带来问题的部分。我运行了模型的这一部分,我得到了相同的“c.eff.unr是一个未定义的变量”错误

1 个答案:

答案 0 :(得分:0)

如果变量中有NA,然后在第二个变量的定义中使用该变量,则BUGS会抱怨,因为它无法使用NA进行计算。您可以在BUGS中指定模型,以了解如何生成c.eff.unr。该模型的参数将根据观测值进行估算,并将其视为缺失值的先验值,因此BUGS将为NA估算值。或者,您可以格式化数据以排除缺失值,因为它们有很多。