I am probably making a really silly mistake but whenever I try to write a user-defined probability function I get the following sort of response:
functions{
real dummy_lpdf(real x ){
return 0.1;
}
}
data{
real l;
}
parameters{
real<lower=0, upper=10> x;
}
model{
l ~ dummy(x);
}
With the following error message:
No matches for:
real ~ dummy(real)
Available argument signatures for dummy:
real ~ dummy()
require real scalar return type for probability function.
error in 'model_test' at line 15, column 16
-------------------------------------------------
13: model{
14:
15: l ~ dummy(x);
^
-------------------------------------------------
l ~ dummy(x);
is like calling
target += dummy(l | x)
so you would need a signature for
real ~ dummy(real)
which is lacking since you only defined a 1-arg function, so instead define
functions{
real dummy_lpdf(real x, real y ){
return 0.1;
}
}
which is sort of silly but it would squash the error (maybe would give warnings about unused variables… or tell us what you really want to do because this makes no sense :)
1 Like
Krzysztof
Thanks for the prompt reply.
Jeremy
This is the second time this has come up in as many days. The point is clearer with a reimplementation of a normal-like signature:
real foo_lpdf(real y, real mu, real sigma);
which would support:
y ~ foo(mu, sigma);
That’s because the sampling notation is just shorthand for
target += foo_lpdf(y | mu, sigma);
When I started this topic I said that I had probably been making a silly mistake, and Krzysztof’s quick and helpful reply proved that. So I was glad to read from Bob that I am not alone in doing so. I think that I was misled by the notation
y~foo(mu,sigma)
because, when one is in a hurry and perhaps not thinking as clearly as one should, that notation makes it appear that the arguments of
foo_lpdf
are just
mu, sigma
The responses to this topic have prompted thought-processes leading me to an entirely different approach to solving my particular problem, so I am very grateful for the help.
Jeremy
[edit—those backticks need to be on their own line—you shoudl be able to see the output in the preview box if you do this online]