Можно ли определить модель Стэна в терминах произвольной апостериорной функции?
Я думаю, что-то вроде MCMCPack MCMCmetrop1R () функциональность, где пользователь определяет произвольную апостериорную функцию. Я бы неплохо покопался в C ++ API, чтобы сделать это, если есть хороший пример того, как это сделать.
В некотором смысле, определение произвольного апостериорного распределения — это все, что вы можете сделать на языке Стэн. Но если вы имеете в виду именно апостериорное распределение, которое не является композицией распределений, уже определенных в Stan, то вы можете использовать increment_log_prob
функция для добавления терминов в лог-апостериор, независимо от того, являются ли они частью вероятности данных или являются априорными для параметров. См. Главы руководства пользователя, озаглавленные «Пользовательские вероятностные функции» и «Пользовательские функции».
Есть пример под FAQ в группе Google stan-users, хотя он использует устаревший синтаксис манипулирования lp__
символ непосредственно вместо использования increment_log_prob
Функция, чтобы сделать то же самое. В настоящее время файл .stan будет
data {
int<lower=1> N;
real<lower=0,upper=1> x[N];
}
transformed data {
real sum_log_x; // calculate this constant only once
sum_log_x <- 0.0;
for (i in 1:N)
sum_log_x <- sum_log_x + log(x[i]);
}
parameters {
real<lower=0> a;
real<lower=0> b;
}
model {
real summands[N];
// put priors on a and b here if you want
// log-likelihood
increment_log_prob(N * (log(a) + log(b)) + (a - 1) * sum_log_x);
for (i in 1:N) {
summands[i] <- (b - 1) * log1m(pow(x[i],a)); // log1m(y) := log(1 - y)
}
increment_log_prob(summands);
}