I currently running a sample like this
functions {
int num_matches(vector x, int y) {
int n = 0;
for (i in 1:rows(x))
if (x[i] == y)
n += 1;
return n;
}
// Find the indexes of the elements in the vector x that equal real number y
int[] which_equal(vector x, int y) {
int match_positions[num_matches(x, y)];
int pos = 1;
for (i in 1:size(x)) {
if (x[i] == y) {
match_positions[pos] = i;
pos += 1;
}
}
return match_positions;
}
}
data {
int<lower=1> I; // Total number of observations
int<lower=1> Q; // Total numbers of covariates
int<lower=1> J; // Numbers of repeated measurements in time dimension
int<lower=1> S; // Dimension of alpha
int<lower=1> L; // Length of each beta
int<lower=1> K; // Total number of classes
int<lower=1, upper=K> g[I]; // Class of each observation
int<lower=1> nz[I, Q]; // calculate the total count of non-zero elements
array[I, Q] vector[J] y; // observed data
array[I, Q] matrix[J, S] Z; // covariates for alpha
array[I, Q] matrix[J, L] B; // covariates for beta
int<lower=0, upper=1> data_index[I, Q, J]; // Indicator for non-missing data
// int data_index_nonzero[I, Q, J]; Nonzero indices for each observation and covariate
}
parameters {
array[Q] vector[S] alpha;
array[K, Q] vector[L] beta;
matrix[Q, Q] Sigma_omega;
array[I] vector[Q] omega;
vector<lower=0>[Q] sigma2;
}
model {
for (q in 1:Q) {
alpha[q] ~ multi_normal(rep_vector(0, S), diag_matrix(rep_vector(100, S))); // Prior for alpha
sigma2[q] ~ inv_gamma(1, 1); // Prior for sigma2
}
for (k in 1:K) {
for (q in 1:Q) {
beta[k, q] ~ multi_normal(rep_vector(0, L), diag_matrix(rep_vector(100, L))); // Prior for beta
}
}
for (i in 1:I) {
omega[i] ~ multi_normal(rep_vector(0, Q), Sigma_omega); // Prior for omega
}
for (q in 1:Q) {
vector[S] alpha_q = alpha[q];
for (i in 1:I) {
int g_i = g[i];
vector[L] beta_giq = beta[g_i, q];
vector[L] beta_Kq = beta[K, q]; // this is the beta_0 in the formula
int nz_iq = nz[i, q];
vector[J] data_index_iq_raw = data_index[i,q];
int[num_matches(data_index_iq_raw,1)] data_index_iq = which_equal(data_index_iq_raw, 1);
vector[nz_iq] y_iq = y[i, q, data_index_iq];
matrix[nz_iq, S] Z_iq = Z[i, q, data_index_iq, :];
matrix[nz_iq, L] B_iq = B[i, q, data_index_iq, :];
vector[nz_iq] mu;
if (g_i == K) {
// case when g[i] == K
mu = Z_iq * alpha_q + B_iq * beta_Kq + rep_vector(omega[i, q], nz_iq);
} else {
// case when g[i] != K
mu = Z_iq * alpha_q + B_iq * beta_giq + B_iq * beta_Kq
+ rep_vector(omega[i, q], nz_iq);
}
y_iq ~ normal(mu, sqrt(sigma2[q]));
}
}
}
it shows that ::
rstan:::rstudio_stanc(“D:/Research/May/trajectory/stancode/June9/V5June.stan”)
Error in stanc(filename, allow_undefined = TRUE) : 0
Syntax error in ‘string’, line 68, column 9 to column 10, parsing error:
Identifier expected after sized type in local (or model block) variable declaration. (No transformations/constraints allowed.)
but the line 67 shows in my Rstudio interface is this line:
vector[L] beta_giq = beta[g_i, q];
but I don’t think it is this line, so is there anyone can help me where the problem goes on? Really appreciate that if someone could help.
Besides, I wanna ask why when I click the check for my stan file, the error shows are not match, for this example, error shows for line 68 n, but actually bugs comes for line72, and it won’t show exactly the place where the error comes, so it cost a lot time for me to find the bug, how can I configure the rstan so it will show the exactly position for error?