Base type mismatch when trying to simplify explanatory variable and coefficient code

Given the increasing complexity of my model, I’m trying to condense the code using vectors and matrices. As a result though I’m running into some base type mismatch problems that I can’t solve.

Say you have the following code as part of your model, I’ve tried to strip out unnecessary info:

data {
  int<lower=1> N; //data points
  real Y[N]; //dependent variable
  int Nx; //number of predictors
  matrix[N,Nx] XVar; //matrix of explanatory variable values
}
parameters {
  vector[Nx] beta_mu; //Mu parameters for Xvar, assume no intercept
}
model {
  to_vector(beta_mu) ~ normal(0,1); //priors
  //linear predictor
  real mu[N];
  for (i in 1:N) {
     mu[i] = beta_mu * XVar[i,];
  }
}

The problem occurs during the likelihood where I get a “Base type mismatch in assignment”, as it complains that ‘mu’ is not a matrix (which is understandable). Is there a way to succinctly sum out the beta_mu * XVar[i,] expression without having to index out every coefficient and the corresponding matrix column?

vector[N] mu = Xvar * beta_mu;

Also, beta_mu is already a vector so to_vector(beta_mu) is just a needless copy

1 Like

Thanks Ben, unfortunately my initial oversimplification of the model means I still can’t get to a solution.

My model is hierarchical (with just random intercepts) so I feel like I need to loop over the linear predictor such that:

  for (i in 1:N) {
     mu[i] = group_int[grlookup[i]] + beta_mu * XVar[i,];
  }

Given this, would something like sum(beta_mu * XVar[i,]) work?

Thanks for the point on to_vector.

vector[N] mu = group_int[grlookup] + XVar * beta_mu;

1 Like