1

I'm running a BUGS model through R and I'm having a problem with BUGS saying one of my data sets is an 'undefined variable'. The data set it is having problems with has quite a few NA's in it, but why is this causing problems? It works just fine when the NA's are replaced by 0's, so I know there is a problem with BUGS using the NAs. Using 0's instead of NA's is not an acceptable solution because I need to log transform the resulting quantity. Has anyone run into something similar and found a solution?

Here is the part of the model that I am struggling with:

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

There is quite a bit more to the model, but the rest runs just fine. I have cut out the rest of the model and included only the part that is giving me problems. I have run this section of the model and I get the same "c.eff.unr is an undefined variable" error

  • 1
    If your MCMC is not that sensitive, log(0) issue, in general, are usually dealt with by adding a 1 or a very small value. – Vlo Aug 05 '14 at 17:44
  • Thanks for your comment. I could try doing that, and see if the MCMC is very sensitive to it. I was just wondering if there was a way to keep the NA's as truly missing values. – kingcounter36 Aug 05 '14 at 18:00
  • @kingcounter36 see http://stackoverflow.com/a/22028167/513463. If you still cannot get it working, post the BUGS code. – guyabel Aug 06 '14 at 08:12
  • I still can't figure it out. The variable it is having problems with is c.eff.unr. I've updated the original problem to show the bit of the model that is giving me problems. It should give an error: "variable c.eff.unr is not defined". – kingcounter36 Aug 06 '14 at 14:08

1 Answers1

0

If there are NAs in a variable, and you then use that variable in the definition of a second variable, then BUGS will complain because it can't do calculations with NAs. You could specify a model in BUGS for how the c.eff.unr are generated. The parameters of that model will be estimated from the observed values, and it will be treated as a prior for the missing values, so BUGS will impute values for the NAs. Alternatively, you could format your data to exclude missing values, given there are a lot of them.

Chris Jackson
  • 871
  • 5
  • 7
  • I really need to keep the format the same, because this is just one of the data sets that go into estimating the N, and each row has to match up to a specific year (many of those NA's are represented as data in other data sets, but I have to keep them separate so the model estimates different parameters for each). I don't think I can impute modeled data for the NAs because that would mess with the estimation of N. Is there a way to simply tell BUGS to ignore NAs (like R's na.rm argument?) – kingcounter36 Aug 08 '14 at 20:38