I am trying to fit a complex, multilevel mixture model that is described in greater detail here. The gist of it is that I am having participants listen to tones and then try to recreate the original tone using a slider. My dependent measure is a transformation of the distance on the slider between the true tone and the tone selected, in semi-tones (which involves a non-linear transformation). I am modelling this difference as coming from a mixture of a uniform distribution (they have no idea what the tone was) or a normal distribution with unknown sigma (they have a representation of the tone but it may be imprecise). I can fit that model fine. However, one element I am trying to incorporate now is the fact that responses are liable to be “cut-off” on either end (since the slider is of finite length). I conceptualized this as truncation in my earlier post but I am fairly certain it is instead an example of censoring. The model therefore becomes a mixture between a uniform distribution where the upper and lower bounds vary across observations and a censored normal distribution where responses close to either end are considered to be censored.
I started off trying to fit this using brms, which has taken me pretty far. I have recently switched to using base Stan – working with the code generated by brms – which has permitted a few optimizations. The issue is that the model seems to have trouble finding initial start values as evidenced by the following error:
Rejecting initial value: Gradient evaluated at the initial value is not finite. Stan can't start sampling from this initial value.
In the full model I hope to fit, the chains almost never find appropriate values. By stripping it down to a much simpler model (appended with data) I have been able to get it to fit most of the time, but it usually has divergent transitions roughly equivalent to the number of post warm-up samples. This pathological behaviour intensifies if predictors or random effects are incorporated.
I feel I must be doing something fundamentally wrong here, but I am not quite sure what that is. Any advice would be appreciated. Code necessary to read the data and fit the model provided here:
# Libraries library(rstan) library(tidyverse) # Read in data and setup censoring variable dat = read.csv('dat2.csv') samp_mod_compiled = stan_model('samp_mod.stan') samp_mod_dat = list(N = nrow(dat), Y = dat$diff, cens=dat$cens, lb=dat$lb, ub=dat$ub, prior_only=0) samp_mod_samples = sampling(samp_mod_compiled, data=samp_mod_dat, chains=4, cores=4, iter=2000, warmup=1000)
The Stan code was generated using brms and edited by me to remove certain extraneous elements.