I have data on tree mortality, based on two observations of a tree in time. All trees are alive at the beginning of the interval. The length of the re-measurement interval, t, varies continuously, between 5-15. I collect data on tree mortality based on whether or not a tree is dead when observed at the end of the re-measurement interval. alive=0, dead=1.

I have a co-variate, x1 that I want to use to fit a model that describes the mortality probability of these trees. For the sake of example, I generate some data where I know the 'true' time to death of each tree as a function of some base rate, and my covariate, x1, and then generate the binary outcome death, as it would be reported based on the collection methods described.

t <- runif(1000, 5, 15)
x1<- rnorm(1000)
b0 <- -2.2
b1 <- -.10

mu <- exp(b0 + b1*x1)
lambda <- 1/mu
death <- ifelse(lambda < t, 1, 0)

data <- data.frame(t, death, x1)

I know how to fit a right censored mortality model in JAGS using the runjags package for R, if I assume that the time to death for all trees is just the duration of the re-measurement interval t for all trees that died. I first calculate new vectors that assign time of death as the duration of t, or NA if a tree libed, the censoring interval if an observation is censored (if it lived):

#generate time to death as the re-measurement interval, or NA if a tree lived.
data$t.to.death <- ifelse(data$death==1, t, NA)

#get a vector that gives the censoring time for each observation that is censored
data$t.cen <- ifelse(data$death==0, t,0)

I then code a JAGS model as:

jags.model = "
      # priors
      beta0 ~ dnorm(0, 0.001)
      beta1 ~ dnorm(0, 0.001)

      # likelihood
      for(i in 1:N)
        is.censored[i] ~ dinterval(t.to.death[i], t.cen[i])
        t.to.death[i] ~ dexp(lambda[i])
        lambda[i] <- 1/mu[i]
        log(mu[i]) <- beta0 + beta1*x1[i]

Get the data together as a list, and run the model:

#get data as list
jags.data <- list(t.to.death = data$t.to.death,
                  t.cen = data$t.cen,
                  N = nrow(data),
                  x1 = data$x1)

#run model
model.run <- run.jags(jags.model, data = jags.data, n.chains=3, monitor=c('beta0', 'beta1'))

However, this is not the model I want to fit. The trees do not die at the end of the measurement interval. They die at some unknown point during the measurement interval. How can I modify this code to fit an interval-censored mortality model in JAGS?


An additive risk model of the form $Z = \vec{b} \mathbf{X}$ is not appropriate for interval censored data. The estimates will be anticonservative and probably biased by model misspecification. This also doesn't agree with the JAGS code you show below. What you fit there is what seems to be a Bayesian logistic model.

It turns out a complementary log-log model is the right approach, but you haven't fit the appropriate survival model for interval censored data, as you have described it. A nice discussion of the topic can be found in Applied Survival Analysis 2nd Ed by Hosmer, Lemeshow, and May on page 232

I assume in your formulation the $y$ is a 0/1 indicator of failure for a particular tree and you are modeling the overall likelihood of failing as a cumulative probability with p(fail at time t) = "p"^t (with "p" more of a hazard, not a probability here). I also assume you have not accounted for some frailty or correlation between multiple "looks" at each tree. I also assume you're not interested in modeling the actual survival function, but want to estimate the effect of some fixed design variables "x" which are either weather conditions, fertilizer, elevation, etc.

The appropriate way of fitting this model is to have 0/1 outcomes for whether or not a tree failed in a specific interval. You remove any subsequent 0s after a particular tree has failed because it is no longer at risk of doing so. The intercept here can be modeled using fixed or random effects depending on the number of intervals.

  • $\begingroup$ Thanks Adam. I agree, this is a case of interval censored data, where I only have one interval. Can you describe how you would fit the model in JAGS, and why an additive model is inappropriate? $\endgroup$ – colin Jul 5 '16 at 18:05
  • $\begingroup$ @colin an additive model is inappropriate because it doesn't account for censoring. In a Bayesian (fully parametric) framework, you would need a probability model for the actual failure process to circumvent this problem, Weibull, gamma, exponential, take your pic. Just to clarify, there are not repeated measurements on each tree? Each tree is only measured once? $\endgroup$ – AdamO Jul 5 '16 at 18:23
  • $\begingroup$ each tree is visited twice. All trees are alive at the beginning of the census interval (t1). Some trees die, and this is recorded at the time of re-measurement (t2). I then have site and tree characteristics I use to predict the probability of mortality during the measurement period. $\endgroup$ – colin Jul 5 '16 at 18:39

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.