1 #ifndef __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__DISCRETE__BINOMIAL_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__DISCRETE__BINOMIAL_HPP__
4 #include <boost/random/binomial_distribution.hpp>
5 #include <boost/random/variate_generator.hpp>
23 template <
bool propto,
28 typename return_type<T_prob>::type
34 static const char*
function =
"stan::prob::binomial_log(%1%)";
55 "Population size parameter",
59 "Probability parameter",
63 "Probability parameter",
69 "Population size parameter",
70 "Probability parameter",
92 for (
size_t i = 0; i <
size; ++i)
96 for (
size_t i = 0; i <
length(theta); ++i)
100 for (
size_t i = 0; i <
size; ++i)
102 + (N_vec[i] - n_vec[i]) * log1m_theta[i];
107 for (
size_t i = 0; i <
size; ++i) {
109 temp2 += N_vec[i] - n_vec[i];
111 operands_and_partials.
d_x1[0]
113 - temp2 / (1.0 -
value_of(theta_vec[0]));
115 for (
size_t i = 0; i <
size; ++i)
116 operands_and_partials.
d_x1[i]
117 += n_vec[i] /
value_of(theta_vec[i])
118 - (N_vec[i] - n_vec[i]) / (1.0 -
value_of(theta_vec[i]));
121 return operands_and_partials.
to_var(logp);
124 template <
bool propto,
132 const T_prob& theta) {
137 template <
typename T_n,
147 return binomial_log<false>(n,N,theta,Policy());
151 template <
typename T_n,
158 const T_prob& theta) {
164 template <
bool propto,
175 static const char*
function =
"stan::prob::binomial_logit_log(%1%)";
192 "Successes variable",
196 "Population size parameter",
200 "Probability parameter",
205 "Successes variable",
206 "Population size parameter",
207 "Probability parameter",
228 for (
size_t i = 0; i <
size; ++i)
232 for (
size_t i = 0; i <
length(alpha); ++i)
236 for (
size_t i = 0; i <
length(alpha); ++i)
239 for (
size_t i = 0; i <
size; ++i)
240 logp += n_vec[i] * log_inv_logit_alpha[i]
241 + (N_vec[i] - n_vec[i]) * log_inv_logit_neg_alpha[i];
246 for (
size_t i = 0; i <
size; ++i) {
248 temp2 += N_vec[i] - n_vec[i];
250 operands_and_partials.
d_x1[0]
254 for (
size_t i = 0; i <
size; ++i)
255 operands_and_partials.
d_x1[i]
260 return operands_and_partials.
to_var(logp);
263 template <
bool propto,
271 const T_prob& alpha) {
276 template <
typename T_n,
286 return binomial_logit_log<false>(n,N,alpha,Policy());
290 template <
typename T_n,
297 const T_prob& alpha) {
303 template <
bool propto,
typename T_n,
typename T_N,
typename T_prob,
309 static const char*
function =
"stan::prob::binomial_cdf(%1%)";
329 if (!
check_finite(
function, theta,
"Probability parameter", &P,
334 "Probability parameter", &P, Policy()))
338 "Successes variable",
"Population size parameter",
"Probability parameter",
355 using boost::math::ibeta_derivative;
361 + operands_and_partials.
nvaris, 0.0);
367 return operands_and_partials.
to_var(0.0);
370 for (
size_t i = 0; i <
size; i++) {
378 const double n_dbl =
value_of(n_vec[i]);
379 const double N_dbl =
value_of(N_vec[i]);
380 const double theta_dbl =
value_of(theta_vec[i]);
382 const double Pi =
ibeta(N_dbl - n_dbl, n_dbl + 1, 1 - theta_dbl);
387 operands_and_partials.
d_x1[i]
388 += - ibeta_derivative(N_dbl - n_dbl, n_dbl + 1, 1 - theta_dbl) / Pi;
394 for(
size_t i = 0; i <
stan::length(theta); ++i) operands_and_partials.
d_x1[i] *= P;
397 return operands_and_partials.
to_var(P);
401 template <
bool propto,
typename T_n,
typename T_N,
typename T_prob>
408 template <
typename T_n,
typename T_N,
typename T_prob,
class Policy>
410 binomial_cdf(
const T_n& n,
const T_N& N,
const T_prob& theta,
const Policy&) {
411 return binomial_cdf<false>(n, N, theta,Policy());
414 template <
typename T_n,
typename T_N,
typename T_prob>
425 using boost::variate_generator;
426 using boost::binomial_distribution;
427 variate_generator<RNG&, binomial_distribution<> >