Hey,
I’d like to build this model (Bayesian One-Sample T-Test (Stan)) in brms. Is this possible?
I can’t figure out how to put the Jeffrey’s prior on sigma2 like this: target += log(1/sigma2); // Jeffreys prior on sigma2
.
How can I add the equivalent prior on sigma?
I’ve tried this
priors <- c(prior('cauchy(0, 0.707)', class = "Intercept"),
prior_string("target += sqrt(log(1/(sigma^sigma)))", check = FALSE))
but it didn’t work:
model$prior
prior class coef group resp dpar nlpar bound
1 cauchy(0, 0.707) Intercept
2 student_t(3, 0, 10) sigma
3 target += sqrt(log(1/(sigma^sigma)))
Sorry if I get something horribly wrong.
brms
expects priors to be already defined functions. You might need to use stanvars
(check brms docs, if that’s not clear feel free to ask :-) ) to add a piece of Stan code defining a function representing the Jeffrey’s prior. Once a function like this is added to the model:
real jeffreys_lpdf(real x) {
return log(1 / x);
}
You should be able to write prior('jeffreys()', ...)
Best of luck!
2 Likes
Hey,
Thank you so much! This is what I tried:
# Generate data
df <- data.frame(y = rnorm(100, 0.5, 1))
# Create custom jeffrey prior
jeffreyPrior <- stanvar(block = 'functions',
name = 'prior_sigma',
scode = "real jeffreys_lpdf(real x) {
return log(1 / x);
}")
# Make Stancode
t_test_model <- make_stancode(y ~ 1, prior = priors, stanvars = jeffreyPrior, data = df)
However, I got a error message saying PARSER EXPECTED: <probability function argument>
. More detail:
SYNTAX ERROR, MESSAGE(S) FROM PARSER:
error in 'model3b6059dd15ab_file3b60e233cd4' at line 25, column 25
-------------------------------------------------
23: // priors including all constants
24: target += cauchy_lpdf(Intercept | 0, 0.707);
25: target += jeffreys_lpdf(sigma | )
^
26: - 1 * jeffreys_lccdf(0 | );
-------------------------------------------------
PARSER EXPECTED: <probability function argument>
Error in stanc(model_code = paste(program, collapse = "\n"), model_name = model_cppname, :
failed to parse Stan model 'file3b60e233cd4' due to the above error.
What am I doing wrong here?
At this point, the probably easiest solution is probably
set_prior("", "sigma") +
set_prior("target += log(1 / sigma)", check = FALSE)
2 Likes