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?