1 #ifndef __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__DISCRETE__BETA_BINOMIAL_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__DISCRETE__BETA_BINOMIAL_HPP__
17 template <
bool propto,
23 typename return_type<T_size1,T_size2>::type
29 static const char*
function =
"stan::prob::beta_binomial_log(%1%)";
46 if (!
check_nonnegative(
function, N,
"Population size parameter", &logp, Policy()))
48 if (!
check_finite(
function, alpha,
"First prior sample size parameter", &logp,
51 if (!
check_positive(
function, alpha,
"First prior sample size parameter",
54 if (!
check_finite(
function, beta,
"Second prior sample size parameter",
57 if (!
check_positive(
function, beta,
"Second prior sample size parameter",
62 "Successes variable",
"Population size parameter",
"First prior sample size parameter",
"Second prior sample size parameter",
74 size_t size =
max_size(n, N, alpha, beta);
76 for (
size_t i = 0; i < size; i++) {
77 if (n_vec[i] < 0 || n_vec[i] > N_vec[i])
84 for (
size_t i = 0; i < size; i++) {
88 logp +=
lbeta(n_vec[i] + alpha_vec[i], N_vec[i] - n_vec[i] + beta_vec[i])
89 -
lbeta(alpha_vec[i],beta_vec[i]);
94 template <
bool propto,
101 const T_size1& alpha,
const T_size2& beta) {
102 return beta_binomial_log<propto>(n,N,alpha,beta,
106 template <
typename T_n,
114 const T_size1& alpha,
const T_size2& beta,
116 return beta_binomial_log<false>(n,N,alpha,beta,Policy());
119 template <
typename T_n,
125 const T_size1& alpha,
const T_size2& beta) {
126 return beta_binomial_log<false>(n,N,alpha,beta,
131 template <
bool propto,
typename T_n,
typename T_N,
typename T_size1,
typename T_size2,
class Policy>
133 beta_binomial_cdf(
const T_n& n,
const T_N& N,
const T_size1& alpha,
const T_size2& beta,
const Policy&) {
135 static const char*
function =
"stan::prob::beta_binomial_cdf(%1%)";
154 if (!
check_finite(
function, alpha,
"First prior sample size parameter", &P,
158 if (!
check_positive(
function, alpha,
"First prior sample size parameter",
162 if (!
check_finite(
function, beta,
"Second prior sample size parameter",
166 if (!
check_positive(
function, beta,
"Second prior sample size parameter",
172 "Successes variable",
"Population size parameter",
173 "First prior sample size parameter",
"Second prior sample size parameter",
186 size_t size =
max_size(n, N, alpha, beta);
188 for (
size_t i = 0; i < size; i++) {
191 if (n_vec[i] < 0 || n_vec[i] > N_vec[i])
199 using boost::math::digamma;
206 for (
size_t i = 0; i < size; i++) {
208 const double n_dbl =
value_of(n_vec[i]);
209 const double N_dbl =
value_of(N_vec[i]);
210 const double alpha_dbl =
value_of(alpha_vec[i]);
211 const double beta_dbl =
value_of(beta_vec[i]);
213 const double mu = alpha_dbl + n_dbl + 1;
214 const double nu = beta_dbl + N_dbl - n_dbl - 1;
216 const double F =
stan::math::F32(1, mu, -N_dbl + n_dbl + 1, n_dbl + 2, 1 - nu, 1);
220 C +=
lgamma(N_dbl + 2) -
lgamma(N_dbl + alpha_dbl + beta_dbl);
223 C *= F / boost::math::beta(alpha_dbl, beta_dbl);
226 const double Pi = 1 - C;
231 double digammaOne = 0;
232 double digammaTwo = 0;
236 digammaOne = digamma(mu + nu);
237 digammaTwo = digamma(alpha_dbl + beta_dbl);
245 const double g = - C * (digamma(mu) - digammaOne + dF[1] / F - digamma(alpha_dbl) + digammaTwo);
247 operands_and_partials.
d_x1[n]
254 const double g = - C * (digamma(nu) - digammaOne - dF[4] / F - digamma(beta_dbl) + digammaTwo);
256 operands_and_partials.
d_x2[n]
263 for (
size_t i = 0; i < size; i++) {
266 operands_and_partials.
d_x1[i] *= P;
269 operands_and_partials.
d_x2[i] *= P;
277 template <
bool propto,
typename T_n,
typename T_N,
typename T_size1,
typename T_size2>
283 template <
typename T_n,
typename T_N,
typename T_size1,
typename T_size2,
class Policy>
285 beta_binomial_cdf(
const T_n& n,
const T_N& N,
const T_size1& alpha,
const T_size2& beta,
const Policy&) {
286 return beta_binomial_cdf<false>(n, N, alpha, beta, Policy());
289 template <
typename T_n,
typename T_N,
typename T_size1,
typename T_size2>