What’s new in JAGS 4.0.0 part 2/4: dealing with undefined nodes

I know from questions in the JAGS forums that undefined nodes can be a source of frustration for JAGS users. Here is a simple example:

for (i in 2:N) {
    x[i] ~ dnorm(0, 1)
}

The compiler creates a node array x of size N, but the element x[1] is undefined. In JAGS 3.4.0 this can potentially cause two problems.

Firstly, if you tried to set a trace monitor for x then you would get an unhelpful message “Node not found”. This is a frequent issue with state space models, in which the observations for series i start at time T[i] and anything that happens in the range 1:(T[i]-1) is undefined.

Up until now, the remedial action has been to identify the undefined elements of the array and fill them in with an arbitrary constant value, e.g.

x[1] <- 0

so that the node x[1:N] can be defined and monitored. This is no longer necessary. JAGS 4.0.0 allows you to create a trace monitor for a node array that has undefined values. The elements of the monitor corresponding to the undefined elements have value NA (not available).

The second problem occurs if you reference the undefined value x[1] in the model, by using it on the right hand of a relation. It is easy to do this indirectly. For example, given this

y <- sum(x)

the compiler will try, and fail, to create a node y that is the sum of all the elements of x. The error message from the compiler in this case is

Unable to resolve node XXX. This may be due to an undefined
ancestor node or a directed cycle in the graph

where “XXX” is some node in the graph. It might be the missing node x[1] but usually it is another node that depends on it (e.g. y or some node that that depends on y). This is why the error message refers to an “undefined ancestor”. Tracing the error back from the cited node XXX to the source of the problem can be hard work. In addition, the message fails to distinguish between two completely different issues: undefined nodes versus directed cycles.

In JAGS 4.0.0, the compiler tries a lot harder to zero in on the source of the problem and distinguish between the two issues. The error message for the above model is now.

Unable to resolve the following parameters:
x[1]
Either supply values for these nodes with the data
or define them on the left hand side of a relation.

If you have a directed cycle, like this

model {
   y[1] ~ dnorm(y[2], tau)
   y[2] ~ dnorm(y[1], tau)
   tau ~ dgamma(1,1)
}

then the message will be

Possible directed cycle involving some or all
of the following nodes:
y[1]
y[2]

There is no remedial action in the case of a directed cycle, as these are still forbidden in JAGS.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s