1 #ifndef __STAN__PROB__DISTRIBUTIONS__MULTI_STUDENT_T_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__MULTI_STUDENT_T_HPP__
6 #include <boost/math/special_functions/gamma.hpp>
15 #include <boost/random/variate_generator.hpp>
27 template <
bool propto,
28 typename T_y,
typename T_dof,
typename T_loc,
typename T_scale,
30 typename boost::math::tools::promote_args<T_y,T_dof,T_loc,T_scale>::type
33 const Eigen::Matrix<T_loc,Eigen::Dynamic,1>& mu,
35 Eigen::Matrix<T_scale,
36 Eigen::Dynamic,Eigen::Dynamic>& Sigma,
38 static const char*
function =
"stan::prob::multi_student_t(%1%)";
46 using boost::math::tools::promote_args;
49 typename promote_args<T_y,T_dof,T_loc,T_scale>::type lp(0.0);
51 y.size(),
"Size of random variable",
52 mu.size(),
"size of location parameter",
56 y.size(),
"Size of random variable",
57 Sigma.rows(),
"rows of scale parameter",
61 y.size(),
"Size of random variable",
62 Sigma.cols(),
"columns of scale parameter",
65 if (!
check_finite(
function, mu,
"Location parameter", &lp, Policy()))
67 if (!
check_not_nan(
function, y,
"Random variable", &lp, Policy()))
69 if (!
check_symmetric(
function, Sigma,
"Scale parameter", &lp, Policy()))
76 "Degrees of freedom parameter", &lp,
80 "Degrees of freedom parameter", &lp,
92 lp +=
lgamma(0.5 * (nu + d));
94 lp -= (0.5 * d) *
log(nu);
98 lp -= (0.5 * d) * LOG_PI;
114 Eigen::Matrix<typename promote_args<T_y,T_loc>::type,
117 Eigen::Matrix<typename promote_args<T_scale,T_y,T_loc>::type,
127 template <
bool propto,
128 typename T_y,
typename T_dof,
typename T_loc,
typename T_scale>
130 typename boost::math::tools::promote_args<T_y,T_dof,T_loc,T_scale>::type
133 const Eigen::Matrix<T_loc,Eigen::Dynamic,1>& mu,
135 Eigen::Matrix<T_scale,
136 Eigen::Dynamic,Eigen::Dynamic>& Sigma) {
137 return multi_student_t_log<propto>(y,nu,mu,Sigma,
141 template <
typename T_y,
typename T_dof,
typename T_loc,
typename T_scale,
144 typename boost::math::tools::promote_args<T_y,T_dof,T_loc,T_scale>::type
147 const Eigen::Matrix<T_loc,Eigen::Dynamic,1>& mu,
149 Eigen::Matrix<T_scale,
150 Eigen::Dynamic,Eigen::Dynamic>& Sigma,
152 return multi_student_t_log<false>(y,nu,mu,Sigma,Policy());
157 template <
typename T_y,
typename T_dof,
typename T_loc,
typename T_scale>
159 typename boost::math::tools::promote_args<T_y,T_dof,T_loc,T_scale>::type
162 const Eigen::Matrix<T_loc,Eigen::Dynamic,1>& mu,
164 Eigen::Matrix<T_scale,
165 Eigen::Dynamic,Eigen::Dynamic>& Sigma) {
166 return multi_student_t_log<false>(y,nu,mu,Sigma,
172 inline Eigen::VectorXd
174 const Eigen::Matrix<double,Eigen::Dynamic,1>& mu,
175 const Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic>& s,
178 Eigen::VectorXd z(s.cols());