1#ifndef STAN_MATH_MIX_PROB_LAPLACE_MARGINAL_NEG_BINOMIAL_2_LOG_LPMF_HPP
2#define STAN_MATH_MIX_PROB_LAPLACE_MARGINAL_NEG_BINOMIAL_2_LOG_LPMF_HPP
35 template <
typename ThetaVec,
typename Eta,
typename Mean,
37 inline auto operator()(
const ThetaVec& theta,
const Eta& eta,
38 const std::vector<int>& y,
39 const std::vector<int>& y_index, Mean&&
mean,
40 std::ostream* pstream)
const {
41 Eigen::VectorXi n_per_group = Eigen::VectorXi::Zero(theta.size());
42 Eigen::VectorXi counts_per_group = Eigen::VectorXi::Zero(theta.size());
44 for (
size_t i = 0; i < y.size(); i++) {
45 n_per_group[y_index[i] - 1]++;
46 counts_per_group[y_index[i] - 1] += y[i];
48 Eigen::Map<const Eigen::VectorXi> y_map(y.data(), y.size());
50 auto theta_offset =
add(theta,
mean);
53 auto log_eta =
log(eta);
67 "theta", theta.size());
68 const auto& eta_ref =
to_ref(eta);
72 Eigen::Matrix<scalar_type_t<Eta>, Eigen::Dynamic, 1> y_plus_eta_m1(
74 for (
size_t i = 0; i < y.size(); ++i) {
75 y_plus_eta_m1.coeffRef(i)
76 = eta_ref.coeff(y_index[i] - 1) + (y[i] - 1.0);
114template <
bool propto =
false,
typename Eta,
typename Mean,
typename CovarFun,
115 typename CovarArgs,
typename OpsTuple>
117 const std::vector<int>& y,
const std::vector<int>& y_index,
const Eta& eta,
118 Mean&&
mean,
int hessian_block_size, CovarFun&& covariance_function,
119 CovarArgs&& covar_args, OpsTuple&& ops, std::ostream* msgs) {
122 options.hessian_block_size = hessian_block_size;
125 std::forward_as_tuple(eta, y, y_index, std::forward<Mean>(
mean)),
126 std::forward<CovarFun>(covariance_function),
127 std::forward<CovarArgs>(covar_args), std::move(options), msgs);
151template <
bool propto =
false,
typename Eta,
typename Mean,
typename CovarFun,
154 const std::vector<int>& y,
const std::vector<int>& y_index,
const Eta& eta,
155 Mean&&
mean,
int hessian_block_size, CovarFun&& covariance_function,
156 CovarArgs&& covar_args, std::ostream* msgs) {
160 std::forward_as_tuple(eta, y, y_index, std::forward<Mean>(
mean)),
161 std::forward<CovarFun>(covariance_function),
162 std::forward<CovarArgs>(covar_args), options, msgs);
168 template <
typename ThetaVec,
typename Eta,
typename Mean,
171 inline auto operator()(
const ThetaVec& theta,
const Eta& eta,
172 const std::vector<int>& y,
173 const std::vector<int>& n_per_group,
174 const std::vector<int>& counts_per_group, Mean&&
mean,
175 std::ostream* pstream)
const {
176 Eigen::Map<const Eigen::VectorXi> y_map(y.data(), y.size());
177 Eigen::Map<const Eigen::VectorXi> n_per_group_map(n_per_group.data(),
179 Eigen::Map<const Eigen::VectorXi> counts_per_group_map(
180 counts_per_group.data(), counts_per_group.size());
182 auto theta_offset =
add(theta,
mean);
183 auto log_eta =
log(eta);
219template <
bool propto =
false,
typename Eta,
typename Mean,
typename CovarFun,
220 typename CovarArgs,
typename OpsTuple>
222 const std::vector<int>& y,
const std::vector<int>& n_per_group,
223 const std::vector<int>& counts_per_group,
const Eta& eta, Mean&&
mean,
224 int hessian_block_size, CovarFun&& covariance_function,
225 CovarArgs&& covar_args, OpsTuple&& ops, std::ostream* msgs) {
228 options.hessian_block_size = hessian_block_size;
231 std::forward_as_tuple(eta, y, n_per_group, counts_per_group,
232 std::forward<Mean>(
mean)),
233 std::forward<CovarFun>(covariance_function),
234 std::forward<CovarArgs>(covar_args), std::move(options), msgs);
257template <
bool propto =
false,
typename Eta,
typename Mean,
typename CovarFun,
260 const std::vector<int>& y,
const std::vector<int>& n_per_group,
261 const std::vector<int>& counts_per_group,
const Eta& eta, Mean&&
mean,
262 int hessian_block_size, CovarFun&& covariance_function,
263 CovarArgs&& covar_args, std::ostream* msgs) {
267 std::forward_as_tuple(eta, y, n_per_group, counts_per_group,
268 std::forward<Mean>(
mean)),
269 std::forward<CovarFun>(covariance_function),
270 std::forward<CovarArgs>(covar_args), options, msgs);
require_t< is_eigen_vector< std::decay_t< T > > > require_eigen_vector_t
Require type satisfies is_eigen_vector.
require_all_t< is_eigen_vector< std::decay_t< Types > >... > require_all_eigen_vector_t
Require all of the types satisfy is_eigen_vector.
elt_multiply_< as_operation_cl_t< T_a >, as_operation_cl_t< T_b > > elt_multiply(T_a &&a, T_b &&b)
subtraction_< as_operation_cl_t< T_a >, as_operation_cl_t< T_b > > subtract(T_a &&a, T_b &&b)
binomial_coefficient_log_< as_operation_cl_t< T1 >, as_operation_cl_t< T2 > > binomial_coefficient_log(T1 &&a, T2 &&b)
addition_< as_operation_cl_t< T_a >, as_operation_cl_t< T_b > > add(T_a &&a, T_b &&b)
require_t< is_stan_scalar< std::decay_t< T > > > require_stan_scalar_t
Require type satisfies is_stan_scalar.
Reference for calculations of marginal and its gradients: Margossian et al (2020),...
constexpr auto tuple_to_laplace_options(Options &&ops)
scalar_type_t< T > mean(const T &m)
Returns the sample mean (i.e., average) of the coefficients in the specified std vector,...
auto multiply(Mat1 &&m1, Mat2 &&m2)
Return the product of the specified matrices.
fvar< T > log(const fvar< T > &x)
auto laplace_marginal_density(LLFun &&ll_fun, LLTupleArgs &&ll_args, CovarFun &&covariance_function, CovarArgs &&covar_args, const laplace_options< InitTheta > &options, std::ostream *msgs)
For a latent Gaussian model with global parameters phi, latent variables theta, and observations y,...
auto laplace_marginal_tol_neg_binomial_2_log_summary_lpmf(const std::vector< int > &y, const std::vector< int > &n_per_group, const std::vector< int > &counts_per_group, const Eta &eta, Mean &&mean, int hessian_block_size, CovarFun &&covariance_function, CovarArgs &&covar_args, OpsTuple &&ops, std::ostream *msgs)
Wrapper function around the laplace_marginal function for a negative binomial likelihood.
auto laplace_marginal_neg_binomial_2_log_summary_lpmf(const std::vector< int > &y, const std::vector< int > &n_per_group, const std::vector< int > &counts_per_group, const Eta &eta, Mean &&mean, int hessian_block_size, CovarFun &&covariance_function, CovarArgs &&covar_args, std::ostream *msgs)
Wrapper function around the laplace_marginal function for a negative binomial likelihood.
auto laplace_marginal_tol_neg_binomial_2_log_lpmf(const std::vector< int > &y, const std::vector< int > &y_index, const Eta &eta, Mean &&mean, int hessian_block_size, CovarFun &&covariance_function, CovarArgs &&covar_args, OpsTuple &&ops, std::ostream *msgs)
Wrapper function around the laplace_marginal function for a negative binomial likelihood.
auto sum(const std::vector< T > &m)
Return the sum of the entries of the specified standard vector.
ref_type_t< T && > to_ref(T &&a)
This evaluates expensive Eigen expressions.
void check_size_match(const char *function, const char *name_i, T_size1 i, const char *name_j, T_size2 j)
Check if the provided sizes match.
auto laplace_marginal_neg_binomial_2_log_lpmf(const std::vector< int > &y, const std::vector< int > &y_index, const Eta &eta, Mean &&mean, int hessian_block_size, CovarFun &&covariance_function, CovarArgs &&covar_args, std::ostream *msgs)
Wrapper function around the laplace_marginal function for a negative binomial likelihood.
fvar< T > log_sum_exp(const fvar< T > &x1, const fvar< T > &x2)
The lgamma implementation in stan-math is based on either the reentrant safe lgamma_r implementation ...
Checks if decayed type is a var, fvar, or arithmetic.
auto operator()(const ThetaVec &theta, const Eta &eta, const std::vector< int > &y, const std::vector< int > &n_per_group, const std::vector< int > &counts_per_group, Mean &&mean, std::ostream *pstream) const
auto operator()(const ThetaVec &theta, const Eta &eta, const std::vector< int > &y, const std::vector< int > &y_index, Mean &&mean, std::ostream *pstream) const
Returns the lpmf for a negative binomial (2nd parameterization, log link) across multiple groups.