Validation of Spatial "Current Status" Survival Model

43 views
Skip to first unread message

Arthur Gairin-Calvo

unread,
Feb 18, 2026, 12:12:21 PMFeb 18
to R-inla discussion group

Dear R-INLA community,

I am fitting a spatial survival model to "Current Status" data, where the status of individuals is recorded at a single observation time (Dead = status 2 [left-censored], Alive = status 0 [right-censored] in inla.surv).

Data:  ~4,000 observations across 10 time samples (~74% "Dead") with different individuals sampled at each time point. A lot of observation already have a "Dead" status in my first sampled point, and my last samples yields few "Alive" observations. Modelled of my biological system showed a decay density closer to a skewed gaussian than a strict exponential. Observations are made at random positions inside a shared (rather small) spatial domain.

The Model: I am using a weibullsurv family with an SPDE spatial effect (exchangeable across 2 groups) and an IID random effect for individuals. 

DF_model$Ysurv <- ifelse(DF_model$Y==1, 2, 0) #censoring format
stack <- inla.stack(
  data = list(time = DF_model$t_new,
              event = DF_model$Ysurv),
  A = list(A_matrix, 1),
  effects = list(s_index, list(Intercept = 1,
                               group = DF_model$group,
                               L = DF_model$L_cent,
                               id = as.numeric(as.factor(DF_model$name)))),          
  tag="obs"
)
formula <- inla.surv(time, event) ~ #from inla.surv
  -1 + Intercept + L + #scaled continuous covariate
  f(spatial, model = spde,
    group = spatial.group, #my groups of interest
    control.group = list(model = "exchangeable")) + 
  f(id, model = "iid") #individuals

res <- inla(formula,
            family = "weibullsurv",
            data = inla.stack.data(stack),
            control.compute = list(waic = T, dic = T, config = T, cpo = T),
            control.predictor = list(A = inla.stack.A(stack), compute = T),
)

Extracted half-life maps look biologically coherent, every model parameter significantly differs from 0 and WAIC is optimal compared to similar models (e.g. replacing exchangeable group effect with a fixed "+group", removing the spatial effect, or removing the intercept).
However, I tried PIT diagnostic and got problematic results: res$cpo$pit is 0 for all 4221 observations despite no res$cpo$failure. Note that All previously mentionned models yields similar results.

My question : Is  there more appropriate diagnostics for this type of model ?

Kind regards,
Arthur Gairin-Calvo

Andrew Walker

unread,
Mar 18, 2026, 4:31:56 PMMar 18
to R-inla discussion group
Hi Arthur,

Unfortunately, I have encountered the same issue while using the same type of response variable and model. Oddly, the CPO values do seem to populate, but they seem to be constrained between zero and one, while the PIT values are all 0. Hopefully, someone more knowledgeable on INLA survival models can enlighten us as to what diagnostics work for the weibullsurv family.

Best wishes,
-Andrew Walker

Helpdesk (Haavard Rue)

unread,
Mar 18, 2026, 4:35:09 PMMar 18
to Andrew Walker, R-inla discussion group
the PIT values for all survial models returns 0, meaning that they are not
computed. with the various censoring going on, it pretty involved to compute
those accurately.

(maybe its not a good idea to return PIT = 0, but it should be NA...)
> --
> You received this message because you are subscribed to the Google Groups "R-
> inla discussion group" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to r-inla-discussion...@googlegroups.com.
> To view this discussion, visit
> https://groups.google.com/d/msgid/r-inla-discussion-group/e5a10430-dce8-4fd8-badb-6c30e0279338n%40googlegroups.com
> .

--
Håvard Rue
he...@r-inla.org
Reply all
Reply to author
Forward
0 new messages