1 #ifndef STAN__PROB__DISTRIBUTIONS__UNIVARIATE__DISCRETE__BETA_BINOMIAL_HPP
2 #define STAN__PROB__DISTRIBUTIONS__UNIVARIATE__DISCRETE__BETA_BINOMIAL_HPP
24 template <
bool propto,
25 typename T_n,
typename T_N,
26 typename T_size1,
typename T_size2>
27 typename return_type<T_size1,T_size2>::type
31 const T_size2& beta) {
32 static const char*
function =
"stan::prob::beta_binomial_log(%1%)";
50 "First prior sample size parameter",
53 "Second prior sample size parameter",
58 "Population size parameter",
59 "First prior sample size parameter",
60 "Second prior sample size parameter",
73 for (
size_t i = 0; i <
size; i++) {
74 if (n_vec[i] < 0 || n_vec[i] > N_vec[i])
85 for (
size_t i = 0; i <
max_size(N,n); i++)
87 normalizing_constant[i]
93 lbeta_numerator(size);
94 for (
size_t i = 0; i <
size; i++)
101 lbeta_denominator(
max_size(alpha,beta));
102 for (
size_t i = 0; i <
max_size(alpha,beta); i++)
109 digamma_n_plus_alpha(
max_size(n,alpha));
110 for (
size_t i = 0; i <
max_size(n,alpha); i++)
112 digamma_n_plus_alpha[i]
120 digamma_N_plus_alpha_plus_beta(
max_size(N,alpha,beta));
121 for (
size_t i = 0; i <
max_size(N,alpha,beta); i++)
124 digamma_N_plus_alpha_plus_beta[i]
131 digamma_alpha_plus_beta(
max_size(alpha,beta));
132 for (
size_t i = 0; i <
max_size(alpha,beta); i++)
135 digamma_alpha_plus_beta[i]
140 digamma_alpha(
length(alpha));
141 for (
size_t i = 0; i <
length(alpha); i++)
147 digamma_beta(
length(beta));
148 for (
size_t i = 0; i <
length(beta); i++)
153 operands_and_partials(n,N,alpha,beta);
154 for (
size_t i = 0; i <
size; i++) {
156 logp += normalizing_constant[i];
158 logp += lbeta_numerator[i]
159 - lbeta_denominator[i];
162 operands_and_partials.
d_x3[i]
163 += digamma_n_plus_alpha[i]
164 - digamma_N_plus_alpha_plus_beta[i]
165 + digamma_alpha_plus_beta[i]
168 operands_and_partials.
d_x4[i]
170 - digamma_N_plus_alpha_plus_beta[i]
171 + digamma_alpha_plus_beta[i]
174 return operands_and_partials.
to_var(logp);
177 template <
typename T_n,
183 const T_size1& alpha,
const T_size2& beta) {
184 return beta_binomial_log<false>(n,N,alpha,beta);
188 template <
typename T_n,
typename T_N,
189 typename T_size1,
typename T_size2>
192 const T_size2& beta) {
194 static const char*
function =
"stan::prob::beta_binomial_cdf(%1%)";
217 "Successes variable",
218 "Population size parameter",
219 "First prior sample size parameter",
220 "Second prior sample size parameter",
235 operands_and_partials(alpha, beta);
241 return operands_and_partials.
to_var(0.0);
244 for (
size_t i = 0; i <
size; i++) {
251 const double n_dbl =
value_of(n_vec[i]);
252 const double N_dbl =
value_of(N_vec[i]);
253 const double alpha_dbl =
value_of(alpha_vec[i]);
254 const double beta_dbl =
value_of(beta_vec[i]);
256 const double mu = alpha_dbl + n_dbl + 1;
257 const double nu = beta_dbl + N_dbl - n_dbl - 1;
264 C +=
lgamma(N_dbl + 2) -
lgamma(N_dbl + alpha_dbl + beta_dbl);
267 C *= F / boost::math::beta(alpha_dbl, beta_dbl);
270 const double Pi = 1 - C;
275 double digammaOne = 0;
276 double digammaTwo = 0;
281 digammaTwo =
digamma(alpha_dbl + beta_dbl);
287 = - C * (
digamma(mu) - digammaOne + dF[1] / F
288 -
digamma(alpha_dbl) + digammaTwo);
289 operands_and_partials.
d_x1[i]
296 operands_and_partials.
d_x2[i]
303 operands_and_partials.
d_x1[i] *= P;
306 operands_and_partials.
d_x2[i] *= P;
308 return operands_and_partials.
to_var(P);
311 template <
typename T_n,
typename T_N,
312 typename T_size1,
typename T_size2>
315 const T_size2& beta) {
317 static const char*
function =
"stan::prob::beta_binomial_cdf_log(%1%)";
340 "Successes variable",
341 "Population size parameter",
342 "First prior sample size parameter",
343 "Second prior sample size parameter",
358 operands_and_partials(alpha, beta);
367 for (
size_t i = 0; i <
size; i++) {
374 const double n_dbl =
value_of(n_vec[i]);
375 const double N_dbl =
value_of(N_vec[i]);
376 const double alpha_dbl =
value_of(alpha_vec[i]);
377 const double beta_dbl =
value_of(beta_vec[i]);
379 const double mu = alpha_dbl + n_dbl + 1;
380 const double nu = beta_dbl + N_dbl - n_dbl - 1;
387 C +=
lgamma(N_dbl + 2) -
lgamma(N_dbl + alpha_dbl + beta_dbl);
390 C *= F / boost::math::beta(alpha_dbl, beta_dbl);
393 const double Pi = 1 - C;
398 double digammaOne = 0;
399 double digammaTwo = 0;
404 digammaTwo =
digamma(alpha_dbl + beta_dbl);
410 = - C * (
digamma(mu) - digammaOne + dF[1] / F
411 -
digamma(alpha_dbl) + digammaTwo);
412 operands_and_partials.
d_x1[i] += g / Pi;
418 operands_and_partials.
d_x2[i] += g / Pi;
422 return operands_and_partials.
to_var(P);
425 template <
typename T_n,
typename T_N,
426 typename T_size1,
typename T_size2>
429 const T_size2& beta) {
431 static const char*
function =
"stan::prob::beta_binomial_ccdf_log(%1%)";
454 "Successes variable",
455 "Population size parameter",
456 "First prior sample size parameter",
457 "Second prior sample size parameter",
472 operands_and_partials(alpha, beta);
478 return operands_and_partials.
to_var(0.0);
481 for (
size_t i = 0; i <
size; i++) {
488 const double n_dbl =
value_of(n_vec[i]);
489 const double N_dbl =
value_of(N_vec[i]);
490 const double alpha_dbl =
value_of(alpha_vec[i]);
491 const double beta_dbl =
value_of(beta_vec[i]);
493 const double mu = alpha_dbl + n_dbl + 1;
494 const double nu = beta_dbl + N_dbl - n_dbl - 1;
501 C +=
lgamma(N_dbl + 2) -
lgamma(N_dbl + alpha_dbl + beta_dbl);
504 C *= F / boost::math::beta(alpha_dbl, beta_dbl);
512 double digammaOne = 0;
513 double digammaTwo = 0;
518 digammaTwo =
digamma(alpha_dbl + beta_dbl);
524 = - C * (
digamma(mu) - digammaOne + dF[1] / F
525 -
digamma(alpha_dbl) + digammaTwo);
526 operands_and_partials.
d_x1[i] -= g / Pi;
532 operands_and_partials.
d_x2[i] -= g / Pi;
536 return operands_and_partials.
to_var(P);
546 static const char*
function =
"stan::prob::beta_binomial_rng(%1%)";
553 "First prior sample size parameter",
556 "Second prior sample size parameter",
560 while(a > 1 || a < 0)
fvar< T > lbeta(const fvar< T > &x1, const fvar< T > &x2)
T_return_type to_var(double logp)
bool check_positive_finite(const char *function, const T_y &y, const char *name, T_result *result)
boost::math::tools::promote_args< T_N, T_n >::type binomial_coefficient_log(const T_N N, const T_n n)
Return the log of the binomial coefficient for the specified arguments.
DoubleVectorView allocates double values to be used as intermediate values.
return_type< T_size1, T_size2 >::type beta_binomial_ccdf_log(const T_n &n, const T_N &N, const T_size1 &alpha, const T_size2 &beta)
T value_of(const fvar< T > &v)
Return the value of the specified variable.
fvar< T > lgamma(const fvar< T > &x)
int binomial_rng(const int N, const double theta, RNG &rng)
A variable implementation that stores operands and derivatives with respect to the variable...
int beta_binomial_rng(const int N, const double alpha, const double beta, RNG &rng)
boost::math::tools::promote_args< typename scalar_type< T1 >::type, typename scalar_type< T2 >::type, typename scalar_type< T3 >::type, typename scalar_type< T4 >::type, typename scalar_type< T5 >::type, typename scalar_type< T6 >::type >::type type
Metaprogram to determine if a type has a base scalar type that can be assigned to type double...
double value_of(const T x)
Return the value of the specified scalar argument converted to a double value.
Template metaprogram to calculate whether a summand needs to be included in a proportional (log) prob...
boost::math::tools::promote_args< T1, T2 >::type lbeta(const T1 a, const T2 b)
Return the log of the beta function applied to the specified arguments.
VectorView< double *, is_vector< T2 >::value, is_constant_struct< T2 >::value > d_x2
void gradF32(double *g, double a, double b, double c, double d, double e, double z, double precision=1e-6)
bool check_nonnegative(const char *function, const T_y &y, const char *name, T_result *result)
return_type< T_size1, T_size2 >::type beta_binomial_cdf(const T_n &n, const T_N &N, const T_size1 &alpha, const T_size2 &beta)
double F32(double a, double b, double c, double d, double e, double z, double precision=1e-6)
bool check_consistent_sizes(const char *function, const T1 &x1, const T2 &x2, const char *name1, const char *name2, T_result *result)
size_t max_size(const T1 &x1, const T2 &x2)
double beta_rng(const double alpha, const double beta, RNG &rng)
return_type< T_size1, T_size2 >::type beta_binomial_cdf_log(const T_n &n, const T_N &N, const T_size1 &alpha, const T_size2 &beta)
return_type< T_size1, T_size2 >::type beta_binomial_log(const T_n &n, const T_N &N, const T_size1 &alpha, const T_size2 &beta)
VectorView< double *, is_vector< T4 >::value, is_constant_struct< T4 >::value > d_x4
int size(const std::vector< T > &x)
fvar< T > binomial_coefficient_log(const fvar< T > &x1, const fvar< T > &x2)
fvar< T > digamma(const fvar< T > &x)
VectorView< double *, is_vector< T1 >::value, is_constant_struct< T1 >::value > d_x1
VectorView< double *, is_vector< T3 >::value, is_constant_struct< T3 >::value > d_x3
fvar< T > log(const fvar< T > &x)
VectorView is a template metaprogram that takes its argument and allows it to be used like a vector...
fvar< T > exp(const fvar< T > &x)
double negative_infinity()
Return negative infinity.