1 #ifndef __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__DISCRETE__BETA_BINOMIAL_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__DISCRETE__BETA_BINOMIAL_HPP__
24 template <
bool propto,
30 typename return_type<T_size1,T_size2>::type
36 static const char*
function =
"stan::prob::beta_binomial_log(%1%)";
56 if (!
check_finite(
function, alpha,
"First prior sample size parameter",
59 if (!
check_positive(
function, alpha,
"First prior sample size parameter",
62 if (!
check_finite(
function, beta,
"Second prior sample size parameter",
65 if (!
check_positive(
function, beta,
"Second prior sample size parameter",
71 "Population size parameter",
72 "First prior sample size parameter",
73 "Second prior sample size parameter",
87 for (
size_t i = 0; i <
size; i++) {
88 if (n_vec[i] < 0 || n_vec[i] > N_vec[i])
94 using boost::math::digamma;
99 for (
size_t i = 0; i <
max_size(N,n); i++)
101 normalizing_constant[i]
107 lbeta_numerator(size);
108 for (
size_t i = 0; i <
size; i++)
110 lbeta_numerator[i] =
lbeta(n_vec[i] +
value_of(alpha_vec[i]),
115 lbeta_denominator(
max_size(alpha,beta));
116 for (
size_t i = 0; i <
max_size(alpha,beta); i++)
123 digamma_n_plus_alpha(
max_size(n,alpha));
124 for (
size_t i = 0; i <
max_size(n,alpha); i++)
126 digamma_n_plus_alpha[i]
127 = digamma(n_vec[i] +
value_of(alpha_vec[i]));
134 digamma_N_plus_alpha_plus_beta(
max_size(N,alpha,beta));
135 for (
size_t i = 0; i <
max_size(N,alpha,beta); i++)
138 digamma_N_plus_alpha_plus_beta[i]
145 digamma_alpha_plus_beta(
max_size(alpha,beta));
146 for (
size_t i = 0; i <
max_size(alpha,beta); i++)
149 digamma_alpha_plus_beta[i]
154 digamma_alpha(
length(alpha));
155 for (
size_t i = 0; i <
length(alpha); i++)
157 digamma_alpha[i] = digamma(
value_of(alpha_vec[i]));
161 digamma_beta(
length(beta));
162 for (
size_t i = 0; i <
length(beta); i++)
164 digamma_beta[i] = digamma(
value_of(beta_vec[i]));
167 operands_and_partials(n,N,alpha,beta);
168 for (
size_t i = 0; i <
size; i++) {
170 logp += normalizing_constant[i];
172 logp += lbeta_numerator[i]
173 - lbeta_denominator[i];
176 operands_and_partials.
d_x3[i]
177 += digamma_n_plus_alpha[i]
178 - digamma_N_plus_alpha_plus_beta[i]
179 + digamma_alpha_plus_beta[i]
182 operands_and_partials.
d_x4[i]
183 += digamma(
value_of(N_vec[i]-n_vec[i]+beta_vec[i]))
184 - digamma_N_plus_alpha_plus_beta[i]
185 + digamma_alpha_plus_beta[i]
188 return operands_and_partials.
to_var(logp);
191 template <
bool propto,
198 const T_size1& alpha,
const T_size2& beta) {
199 return beta_binomial_log<propto>(n,N,alpha,beta,
203 template <
typename T_n,
211 const T_size1& alpha,
const T_size2& beta,
213 return beta_binomial_log<false>(n,N,alpha,beta,Policy());
216 template <
typename T_n,
222 const T_size1& alpha,
const T_size2& beta) {
223 return beta_binomial_log<false>(n,N,alpha,beta,
228 template <
bool propto,
typename T_n,
typename T_N,
typename T_size1,
229 typename T_size2,
class Policy>
232 const T_size2& beta,
const Policy&) {
234 static const char*
function =
"stan::prob::beta_binomial_cdf(%1%)";
255 if (!
check_finite(
function, alpha,
"First prior sample size parameter",
259 if (!
check_positive(
function, alpha,
"First prior sample size parameter",
263 if (!
check_finite(
function, beta,
"Second prior sample size parameter",
267 if (!
check_positive(
function, beta,
"Second prior sample size parameter",
273 "Successes variable",
274 "Population size parameter",
275 "First prior sample size parameter",
276 "Second prior sample size parameter",
293 using boost::math::digamma;
296 operands_and_partials(alpha, beta);
300 + operands_and_partials.
nvaris,
307 return operands_and_partials.
to_var(0.0);
310 for (
size_t i = 0; i <
size; i++) {
317 const double n_dbl =
value_of(n_vec[i]);
318 const double N_dbl =
value_of(N_vec[i]);
319 const double alpha_dbl =
value_of(alpha_vec[i]);
320 const double beta_dbl =
value_of(beta_vec[i]);
322 const double mu = alpha_dbl + n_dbl + 1;
323 const double nu = beta_dbl + N_dbl - n_dbl - 1;
330 C +=
lgamma(N_dbl + 2) -
lgamma(N_dbl + alpha_dbl + beta_dbl);
333 C *= F / boost::math::beta(alpha_dbl, beta_dbl);
336 const double Pi = 1 - C;
341 double digammaOne = 0;
342 double digammaTwo = 0;
347 digammaOne = digamma(mu + nu);
348 digammaTwo = digamma(alpha_dbl + beta_dbl);
357 = - C * (digamma(mu) - digammaOne + dF[1] / F
358 - digamma(alpha_dbl) + digammaTwo);
360 operands_and_partials.
d_x1[i]
367 = - C * (digamma(nu) - digammaOne - dF[4] / F - digamma(beta_dbl)
370 operands_and_partials.
d_x2[i]
377 operands_and_partials.
d_x1[i] *= P;
382 operands_and_partials.
d_x2[i] *= P;
384 return operands_and_partials.
to_var(P);
387 template <
bool propto,
typename T_n,
typename T_N,
typename T_size1,
391 const T_size2& beta) {
392 return beta_binomial_cdf<propto>(n, N, alpha, beta,
396 template <
typename T_n,
typename T_N,
typename T_size1,
typename T_size2,
400 const T_size2& beta,
const Policy&) {
401 return beta_binomial_cdf<false>(n, N, alpha, beta, Policy());
404 template <
typename T_n,
typename T_N,
typename T_size1,
typename T_size2>
407 const T_size2& beta) {
408 return beta_binomial_cdf<false>(n, N, alpha, beta,
419 while(a > 1 || a < 0)