Specifying inits: mismatch in number dimensions declared and found in context

I am trying to build a non-linear model in brms discussed in this thread.

I thought the challenge I’m currently facing might be more broadly applicable, so I thought perhaps it would benefit from its own thread.

I am unable to pass initial values to the sampler, which results in no sampling being done. Regardless of what I specify, the default range of (-2,2) is used.

The generated Stan code is:

functions {
}
data {
  int<lower=1> N;  // total number of observations
  vector[N] Y;  // response variable
  int<lower=1> K_a;  // number of population-level effects
  matrix[N, K_a] X_a;  // population-level design matrix
  int<lower=1> K_b;  // number of population-level effects
  matrix[N, K_b] X_b;  // population-level design matrix
  int<lower=1> K_c;  // number of population-level effects
  matrix[N, K_c] X_c;  // population-level design matrix
  // covariate vectors for non-linear functions
  vector[N] C_B_1;
  // covariate vectors for non-linear functions
  vector[N] C_I_1;
  int prior_only;  // should the likelihood be ignored?
}
transformed data {
}
parameters {
  vector<lower=1>[K_a] b_a;  // population-level effects
  vector<lower=1>[K_b] b_b;  // population-level effects
  vector<lower=1>[K_c] b_c;  // population-level effects
  real<lower=0> phi;  // precision parameter
}
transformed parameters {
}
model {
  // likelihood including constants
  if (!prior_only) {
    // initialize linear predictor term
    vector[N] nlp_a = X_a * b_a;
    // initialize linear predictor term
    vector[N] nlp_b = X_b * b_b;
    // initialize linear predictor term
    vector[N] nlp_c = X_c * b_c;
    // initialize non-linear predictor term
    vector[N] nlp_B;
    // initialize non-linear predictor term
    vector[N] nlp_I;
    // initialize non-linear predictor term
    vector[N] mu;
    for (n in 1:N) {
      // compute non-linear predictor values
      nlp_B[n] = nlp_a[n] * C_B_1[n] ^ nlp_b[n] + nlp_c[n];
    }
    for (n in 1:N) {
      // compute non-linear predictor values
      nlp_I[n] = C_I_1[n] * nlp_B[n];
    }
    for (n in 1:N) {
      // compute non-linear predictor values
      mu[n] = inv_logit(nlp_I[n]);
    }
    target += beta_lpdf(Y | mu * phi, (1 - mu) * phi);
  }
  // priors including constants
  target += normal_lpdf(b_a | 20,10)
    - 1 * normal_lccdf(1 | 20,10);
  target += normal_lpdf(b_b | 20,10)
    - 1 * normal_lccdf(1 | 20,10);
  target += normal_lpdf(b_c | 20,10)
    - 1 * normal_lccdf(1 | 20,10);
  target += gamma_lpdf(phi | 0.01, 0.01);
}
generated quantities {
}

The parameters block lists b-a, b_b, b_c, and phi as parameters. The vectors [K_a], [K_b], and [K_c] are length 1.

I have tried to pass initial values as follows:

NL_Mod <- brm(bform,
                Data,
                family = Beta(), 
                prior = nl_priors,
                inits = list(
                      list(phi = 0, 
                           b_a = rep(10, 1), 
                           b_b = rep(10, 1), 
                           b_c = rep(10, 1))),
                iter = 2000,
                warmup = 1000,
                chains = 1,
                cores = ncores,
                #backend = "cmdstan",
                #normalize = FALSE,
                save_pars = save_pars(all = TRUE),
                control = list(adapt_delta = 0.9,
                               max_treedepth = 12)
)

This gives the following error:

SAMPLING FOR MODEL 'd66ef5e5c4284e2da8d26adfefd756fb' NOW (CHAIN 1).
Chain 1: Unrecoverable error evaluating the log probability at the initial value.
Chain 1: mismatch in number dimensions declared and found in context; processing stage=parameter initialization; variable name=b_a; dims declared=(1); dims found=()
[1] "Error in sampler$call_sampler(args_list[[i]]) : "                                                                                                             
[2] "  mismatch in number dimensions declared and found in context; processing stage=parameter initialization; variable name=b_a; dims declared=(1); dims found=()"

The parameters block lists
vector<lower=1>[K_a] b_a; // population-level effects, which looks like a vector of length 1, but the error message says it’s dimensionless.

Am I misunderstanding or mis-specifying?

2 Likes

I was able to get past this error by declaring initial values for vectoroized parameters as array

init_list <- list(
        list(b_a = array(data = 10),
                  b_b = array(data =  10),
                  b_c = array(data = 10),
             phi = 0)

3 Likes