CmdStanR seems rejects initial values, but ignores 'init' values

CmdStanR rejects initial values on my model (below), both the default (-2,2) and specific values I provide via the init parameter. I’ve tried $sampling with MCMC, $variational, and $optimize and all produce their particular flavor of the same output (below). Perhaps there are problems with either the calls or the model, but if not I am left with two questions:

1. Regardless of initial parameters, how can the log probability == log(0), when I’m using a binomial_logit(n, p) likelihood and ‘p’ itself is neither -inf or +inf? Shouldn’t the implicit inv_logit(p) prevent that? (n!=0)

2. Why, even when I provide start values via ‘init=’ does the output end with “Initialization between (-2, 2) failed after 1 attempts.”

Here’s the model (a simplification of my model of interest)…


data {
    int                         N;          //Number of data buckets
    int                         C;          //Number of clusters
    int   <lower=0>             n[N];       //Number of subjects in each bucket
    int   <lower=0>             y[N];    	//Number of successful outcomes, by bucket
    int   <lower=0, upper=210>  cluster[N]; //cluster index of each bucket (1..210)
    int   <lower=0, upper=1>    samp[N];    //Indicator of in/out of the target sample, by bucket
    int   <lower=0>             t[N];       //Frequency of treatment
}
parameters {
    vector[C] alpha;                      //Intercept for P
    vector[C] bS;                         //Coefficient for target sample bias, by cluster (treatment effect on intent to treat)
    vector[C] bF;                         //Coefficient for effective treatment group bias, by cluster
    vector[C] eff;                        //F intercept (mean effective frequency), by cluster
    vector<lower=0, upper=1>[C] bT;       //Coefficient for treatment, by cluster
}
model{
    vector[N] P;     //Probability of the outcome
    real F;        //Probability of effective treatment = logistic(a + E)
    int c;

    //Priors
	bT ~ lognormal(0, 2);
    alpha ~ normal(0, 5) ;
    bS ~ normal(0,5) ;
    bF ~ normal(0,5) ;
    eff ~ normal(0, 10) ;

    //Model
    for ( i in 1:N ) {
    	c = cluster[i];

        //Next, estimate the probability of effective treatment within cluster c
        F = inv_logit( eff[c] + bT[c] * t[i] ) ;

        //Finally, estimate the probability of outcome (logit scale)
        P[i] = alpha[c] + bS[c]*samp[i] + bF[c]*F ;
    }

    //Sampling Distribution
    y ~ binomial_logit( n , P );
}

and here’s are all 3 calls…

fitv <- model$variational(data=dat, seed=3141,
                         init=function() list(alpha=runif(1,0.0001,0.9999), 
                                              bT=runif(1,0.0001,0.9999),
                                              bS=runif(1,0.0001,0.9999),
                                              bF=runif(1,0.0001,0.9999),
                                              eff=runif(1,0.0001,0.9999)),
                         adapt_engaged=TRUE, output_samples=1000)
fito <- model$optimize(data=dat, seed=3141,
                         init=function() list(alpha=runif(1,0.0001,0.9999), 
                                              bT=runif(1,0.0001,0.9999),
                                              bS=runif(1,0.0001,0.9999),
                                              bF=runif(1,0.0001,0.9999),
                                              eff=runif(1,0.0001,0.9999)))
fit <- model$sample(data=dat, seed=3141, chains=1,
                      init=function() list(alpha=runif(1,0.0001,0.9999), 
                                           bT=runif(1,0.0001,0.9999),
                                           bS=runif(1,0.0001,0.9999),
                                           bF=runif(1,0.0001,0.9999),
                                           eff=runif(1,0.0001,0.9999)))

Here’s the output from the MCMC run (others gave same error).

Running MCMC with 1 chain...

Chain 1 Rejecting initial value:
Chain 1   Log probability evaluates to log(0), i.e. negative infinity.
Chain 1   Stan can't start sampling from this initial value.
Chain 1 Initialization between (-2, 2) failed after 1 attempts. 
Chain 1  Try specifying initial values, reducing ranges of constrained values, or reparameterizing the model.
Chain 1 Initialization failed.
Warning: Chain 1 finished unexpectedly!

Warning message:
No chains finished successfully. Unable to retrieve the fit. 

And finally, here’s the result of fit$output(id=1)…

method = sample (Default)
  sample
    num_samples = 1000 (Default)
    num_warmup = 1000 (Default)
    save_warmup = 0 (Default)
    thin = 1 (Default)
    adapt
      engaged = 1 (Default)
      gamma = 0.050000000000000003 (Default)
      delta = 0.80000000000000004 (Default)
      kappa = 0.75 (Default)
      t0 = 10 (Default)
      init_buffer = 75 (Default)
      term_buffer = 50 (Default)
      window = 25 (Default)
    algorithm = hmc (Default)
      hmc
        engine = nuts (Default)
          nuts
            max_depth = 10 (Default)
        metric = diag_e (Default)
        metric_file =  (Default)
        stepsize = 1 (Default)
        stepsize_jitter = 0 (Default)
id = 1
data
  file = /var/folders/h8/2kjq8f9x6pv7hszzxgvt1jgh0000gp/T/RtmpFS4mkA/standata-16a47dc03da3.json
init = /var/folders/h8/2kjq8f9x6pv7hszzxgvt1jgh0000gp/T/RtmpFS4mkA/init-1-16a4580ed8d4.json
random
  seed = 3141
output
  file = /var/folders/h8/2kjq8f9x6pv7hszzxgvt1jgh0000gp/T/RtmpFS4mkA/simplified-202106241553-1-6068a1.csv
  diagnostic_file =  (Default)
  refresh = 100 (Default)
  sig_figs = -1 (Default)
  profile_file = /var/folders/h8/2kjq8f9x6pv7hszzxgvt1jgh0000gp/T/RtmpFS4mkA/simplified-profile-202106241553-1-257d0c.csv

Rejecting initial value:
  Log probability evaluates to log(0), i.e. negative infinity.
  Stan can't start sampling from this initial value.

Initialization between (-2, 2) failed after 1 attempts. 
 Try specifying initial values, reducing ranges of constrained values, or reparameterizing the model.
Initialization failed.

Thanks for reading.

My guess as to what’s going on is that your function for specifying initial values is only specifying 1 value per parameter even though there are actually C values (according to the Stan program). If C=1 then what you have might work but if C isn’t 1 then then instead of alpha=runif(1, ...) you need alpha=runif(C, ...) (and the same goes for the other parameters).

If that doesn’t solve the problem would it be possible for you to share some data that allows us to run the model and reproduce the problem? If your data is confidential then some simulated data would be fine.

3 Likes

That fixed it. Thanks so much @jonah.

1 Like

Note that the current cmdstan behaviour whereby incorrectly formatted inits are silently ignored is slated for a fix.

3 Likes