helpful_stan_functions
helpful_stan_functions copied to clipboard
Logit simplex
vector log_logistic_simplex_lp(vector stick_slices) {
int K = num_elements(stick_slices) + 1;
vector[K] log_pi;
real log_stick = 0;
for (k in 1:K - 1) {
real log_inv_logit_stick = log_inv_logit(stick_slices[k]);
log_pi[k] = log_inv_logit_stick + log_stick;
log_stick = log_diff_exp(log_stick, log_pi[k]);
// the jacobian for inv_logit is
// target += log_inv_logit(y) + log1m_inv_logit(y);
// because this is log_inv_logit(y)
// we can use the chain rule
// jacobian for f'(y) = d log_inv_logit(y) / dy
// = d log(inv_logit(y))/d log(inv_logit(y)) + d inv_logit(y) / dy
// = -log_inv_logit(y) + log_inv_logit(y) + log1m_inv_logit(y)
// = log1m_inv_logit(y)
target += log1m_inv_logit(stick_slices[k]);
target += log_stick + log1m_exp(log_stick) + log1m_exp(log_pi[k]);
}
log_pi[K] = log_stick;
return log_pi;
}