Could you tell me about algebra_solver

#1

Hello, Pioneers of STAN!
I’m STAN rookie.

I posted about “closed-form equation” to this forum some days ago.

As I was taught that “you should use algebra_solver function” in this post, I rewrote my STAN code.
As my model is complicated, I tried simple model like this.

This model is supposed Gamma distribution with parameters (α, β).
As you know, mean of this distribution is α/β, so I re-parametrizationed from (α, β) to (μ, β).
And then, I introduced prior distribution of μ and β.

We succeeded if we simply executed α = μβ.
However, since I want to use algebra_solver, it looks like the following code.

functions{
//solve function
vector algebra_system(vector y,//y menas alpha
vector theta,//theta means mu and beta
real[] x_r,
int[] x_i){
vector[1] result;
result[1] = y[1]-theta[1]*theta[2];
return result;
}
}

data{
int n;
real Data[n];
}

transformed data{
vector[1] y_guess;
y_guess[1] = 1.0;

real x_r[0];
int x_i[0];
}

parameters{
real mu;
real beta;
}

transformed parameters{
vector[2] theta;
theta[1] = mu;
theta[2] = vector;

real alpha = algebra_solver(algebra_system, y_guess, theta, x_r, x_i);
//In fact alpha=mu*beta is enough, and in the case, compile succeeded.
}

model{
for(i in 1:n) {
Data[i] ~ gamma(alpha, beta);
}
mu ~ uniform(0, 1);
beta ~ uniform(0, 4);
}

And I got the following error.

SYNTAX ERROR, MESSAGE(S) FROM PARSER:

variable "real" does not exist.
error in 'model_tutorial2' at line 22, column 7
-------------------------------------------------
20:   y_guess[1] = 1.0;
21:
22:   real x_r[0];
^
23:   int x_i[0];
-------------------------------------------------

Error in stanc(model_code = paste(program, collapse = "\n"), model_name = model_cppname,  :
failed to parse Stan model 'tutorial2' due to the above error.

I can’t understand the meaning of this, variable "real" does not exist.

Would you tell me something solution?
In addition, I would like you to forgive my poor English.

Thank you.

#2

There’s probably a problem with how you’re instantiating

real x_r[0];
int x_i[0];

Are you trying to input an empty array? I don’t think this is the right syntax.

But also, you don’t need an algebra solver for a simple variable transformation. You know what the relationship between \alpha and \mu,\beta is so just plug that in directly. No solving necessary.

#3

“you don’t need an algebra solver”
Yes, although it is right, a model I really want to run needs algebra_solver.
As I would like to check on behavior of algebra_solver, I used it in this code.

By the way, is these syntax really wrong?

real x_r[0];
int x_i[0];

These syntax are written in chapter(?) of algebra_solver of the Stan User Manual and I copied and pasted this into the code.
Nevertheless an error occurred, so I was surprised and I am being confused.

Especially about the error message variable "real" does not exist, “real” ought to be primitive data type, so I can not determine the cause of the error.

#4

All the variable declarations must be at the top of any block. My guess is that you’ve put a statement before that definition.

It’s a lot easier to help when the full program is included.

#5

I just saw the full program above.

Change these lines:

vector[1] y_guess;
y_guess[1] = 1.0;

to

vector[1] y_guess = [1.0];

#6

Yeah, what @syclik said. Except you may need

vector[1] y_guess = [1.0]';

with the transpose, if I recall correctly.

#7

Yup. @jonah is absolutely right.

#8

Oh! I get it!
I didn’t know how to use [ ]!
Surely, I know only how to use { } and I was concerned about that using { } cause an error.

Is this right?: { } makes an array, and [ ] makes a vector.

Now I am at home so I will review the manual and re-program at the laboratory tomorrow.
I really appreciate @shoshievass, @syclik, and @jonah.

#9

Yeah, although the latter makes a row_vector unless transposed.

#10

Today, I try this modification and compile have done!!!

…However, when I execute sampling() I got “Rejecting initial value”.
Probably, this is not syntax issue but my model issue.

I would like to identify the cause of the error by myself, but may also post to this forum.

Anyway, thank you for your kindness!

Can't I put literal of vector to function argument?