I recently upgraded to rstan v2.11.1 and when I ran some previously functional code, I received warnings about changing "<-" to "=", "_log" to "_lpdf" etc. I updated my code accordingly, and now I get this error:
SYNTAX ERROR, MESSAGE(S) FROM PARSER:
ERROR at line 37
35: logl = 0.0;
36: for (i in 1:n){
37: s = log(dCphi_du1du2_s(normal_cdf(y1[i] | mu1[i], sigma1), logistic_cdf(z[i] | mu2[i], 1), phi)) + normal_lpdf(y1[i] | mu1[i], sigma1) + logistic_lpdf(z[i] | mu2[i], 1);
^
38: logl = logl + s;
PARSER EXPECTED: "("
Error in stanc(file = file, model_code = model_code, model_name = model_name, :
failed to parse Stan model 'FB_frank' due to the above error.
Here is the offending code block (it is part of the functions block):
real copulapdf_lpdf(real[] y1, real[] z, vector mu1, vector mu2, real sigma1, real phi, int n){
real logl;
real s;
logl = 0.0;
for (i in 1:n){
s = log(dCphi_du1du2_s(normal_cdf(y1[i] | mu1[i], sigma1), logistic_cdf(z[i] | mu2[i], 1), phi)) + normal_lpdf(y1[i] | mu1[i], sigma1) + logistic_lpdf(z[i] | mu2[i], 1);
logl = logl + s;
}
return logl;
}
dCphi_du1du2_s() is another function that I have defined:
real dCphi_du2_s(real u1, real u2, real phi) {
real b;
real a;
b = exp(phi*(u1+u2)) - exp(phi*(1+u2)) - exp(phi*(1+u1)) + exp(phi);
a = -exp(phi)*(exp(phi*u1) - 1)/b;
return a;
}
The rest of the code:
data {
int<lower=0> n; // number of subjects
int<lower=0> k1; // number of predictors for y1
int<lower=0> k2; // number of predictors for y2
real y1[n]; // continuous data
real y2[n]; // 0/1 binary data
matrix[n, k1] x1; // predictor variables for y1
matrix[n, k2] x2; // predictor variables for y2
}
transformed data{
int<lower=-1, upper=1> sign[n];
for (i in 1:n) {
if (y2[i]==1)
sign[i] = 1;
else
sign[i] = -1;
}
}
parameters {
real phi; // frank copula param
vector[k1] b1; // beta coefficients for y1
vector[k2] b2; // beta coefficients for y2
real<lower=0> abs_z[n]; // abs value of latent variable
real<lower=0> sigma1; // sd for y1's normal distribution
}
transformed parameters {
real v[n];
vector[n] mu1; // location for y1
vector[n] mu2; // location for z
for (i in 1:n) {
v[i] = sign[i] * abs_z[i];
}
mu1 = x1 * b1;
mu2 = x2 * b2;
}
model {
b1 ~ normal(0, 100);
b2 ~ normal(0, 100);
phi ~ normal(0, 10);
target += copulapdf_lpdf(y1, v, mu1, mu2, sigma1, phi, n);
}
Thank you in advance for the help!