Joint model with stan_jm: disallowed association structures

I’m interested in fitting a joint model using stan_jm(), similar to the model described in this vignette, with a longitudinal biomarker submodel and a time-to-event (survival) submodel.

One association structure that I’d like to consider is that the hazard for death is associated only with the random effects of the longitudinal submodel. That is, the assoc = "shared_b" association structure. But when trying to fit the model, I see from this error message that the option been temporarily disallowed:

Error: The following association structures have been temporarily disallowed and will be reinstated in a future release: muslope, shared_b, shared_coef

Could someone suggest a work-around, or is there a dev branch where this association structure has been enabled?

Thanks @sambrilleman for your work on this!

1 Like

Hi @camposfa. Sorry, I don’t have a very good answer to this. Essentially, a long time ago (before stan_jm actually got released on CRAN), I refactored the code underneath the hood to make it a bit simpler and more stable, but at the time it meant sacrificing the shared_b and shared_coef association structures since they didn’t fit well into the refactored code. But I had planned to add them back in at some point but never actually got around to it :-(. I don’t really have time anymore (I now work outside academia), so I doubt that anyone will pick this piece of work up. It’s not that small a job either, because the additional association structures would have to be built into the prediction functions etc too (i.e. posterior_survfit, posterior_traj, etc), not just the model estimation (i.e. stan_jm).

Any development branch with this functionality would be way too old now. I should have really changed the misleading error message and docs before the CRAN release.

I don’t have a good work around (aside from using another joint modelling package that offers that association structure). If you have just a random intercept and random linear slope then etavalue captures some of the same information as the shared random intercept (i.e. shared_b(0), and etaslope captures some of the same information as the shared random slope (i.e. shared_b(1)). But they aren’t exactly equivalent.

That’s understandable, thanks for taking the time to reply!