1 #ifndef __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__DISCRETE__NEG_BINOMIAL_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__DISCRETE__NEG_BINOMIAL_HPP__
16 template <
bool propto,
18 typename T_shape,
typename T_inv_scale,
23 const T_inv_scale& beta,
26 static const char*
function =
"stan::prob::neg_binomial_log(%1%)";
44 if (!
check_finite(
function, alpha,
"Shape parameter", &logp, Policy()))
46 if (!
check_positive(
function, alpha,
"Shape parameter", &logp, Policy()))
48 if (!
check_finite(
function, beta,
"Inverse scale parameter",
56 "Failures variable",
"Shape parameter",
"Inverse scale parameter",
71 size_t size =
max_size(n, alpha, beta);
73 for (
size_t i = 0; i < size; i++) {
75 if (alpha_vec[i] > 1e10) {
77 logp -=
lgamma(n_vec[i] + 1.0);
81 lambda = alpha_vec[i] / beta_vec[i];
88 logp += binomial_coefficient_log<typename scalar_type<T_shape>::type>
89 (n_vec[i] + alpha_vec[i] - 1.0, n_vec[i]);
91 logp += -n_vec[i] *
log1p(beta_vec[i])
92 + alpha_vec[i] *
log(beta_vec[i] / (1 + beta_vec[i]));
98 template <
bool propto,
100 typename T_shape,
typename T_inv_scale>
104 const T_shape& alpha,
105 const T_inv_scale& beta) {
106 return neg_binomial_log<propto>(n,alpha,beta,
110 template <
typename T_n,
111 typename T_shape,
typename T_inv_scale,
116 const T_shape& alpha,
117 const T_inv_scale& beta,
119 return neg_binomial_log<false>(n,alpha,beta,Policy());
122 template <
typename T_n,
123 typename T_shape,
typename T_inv_scale>
127 const T_shape& alpha,
128 const T_inv_scale& beta) {
129 return neg_binomial_log<false>(n,alpha,beta,
var multiply_log(const var &a, const var &b)
Return the value of a*log(b).
var log1p(const stan::agrad::var &a)
The log (1 + x) function for variables (C99).
var lgamma(const stan::agrad::var &a)
The log gamma function for variables (C99).
var log(const var &a)
Return the natural log of the specified variable (cmath).
boost::math::tools::promote_args< T_a, T_b >::type multiply_log(T_a a, T_b b)
double value_of(T x)
Return the value of the specified scalar argument converted to a double value.
boost::math::tools::promote_args< T_N, T_n >::type binomial_coefficient_log(T_N N, T_n n)
Return the log of the binomial coefficient for the specified arguments.
bool check_consistent_sizes(const char *function, const T1 &x1, const T2 &x2, const char *name1, const char *name2, T_result *result, const Policy &)
bool check_positive(const char *function, const T_y &y, const char *name, T_result *result, const Policy &)
bool check_finite(const char *function, const T_y &y, const char *name, T_result *result, const Policy &)
Checks if the variable y is finite.
bool check_nonnegative(const char *function, const T_y &y, const char *name, T_result *result, const Policy &)
boost::math::policies::policy default_policy
Default error-handling policy from Boost.
return_type< T_shape, T_inv_scale >::type neg_binomial_log(const T_n &n, const T_shape &alpha, const T_inv_scale &beta, const Policy &)
Probability, optimization and sampling library.
size_t length(const T &x)
size_t max_size(const T1 &x1, const T2 &x2)
Template metaprogram to calculate whether a summand needs to be included in a proportional (log) prob...
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