Stan  1.1
probability, sampling & optimization
 All Classes Namespaces Files Functions Variables Typedefs Enumerator Friends Macros Pages
multi_student_t.hpp
Go to the documentation of this file.
1 #ifndef __STAN__PROB__DISTRIBUTIONS__MULTI_STUDENT_T_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__MULTI_STUDENT_T_HPP__
3 
4 #include <cstdlib>
5 
10 #include <stan/prob/traits.hpp>
12 
13 namespace stan {
14 
15  namespace prob {
16 
23  template <bool propto,
24  typename T_y, typename T_dof, typename T_loc, typename T_scale,
25  class Policy>
26  typename boost::math::tools::promote_args<T_y,T_dof,T_loc,T_scale>::type
27  multi_student_t_log(const Eigen::Matrix<T_y,Eigen::Dynamic,1>& y,
28  const T_dof& nu,
29  const Eigen::Matrix<T_loc,Eigen::Dynamic,1>& mu,
30  const
31  Eigen::Matrix<T_scale,
32  Eigen::Dynamic,Eigen::Dynamic>& Sigma,
33  const Policy&) {
34  static const char* function = "stan::prob::multi_student_t(%1%)";
35 
41  using boost::math::tools::promote_args;
42 
43  typename promote_args<T_y,T_dof,T_loc,T_scale>::type lp(0.0);
44  if (!check_size_match(function,
45  y.size(), "Size of random variable",
46  mu.size(), "size of location parameter",
47  &lp, Policy()))
48  return lp;
49  if (!check_size_match(function,
50  y.size(), "Size of random variable",
51  Sigma.rows(), "rows of scale parameter",
52  &lp, Policy()))
53  return lp;
54  if (!check_size_match(function,
55  y.size(), "Size of random variable",
56  Sigma.cols(), "columns of scale parameter",
57  &lp, Policy()))
58  return lp;
59  if (!check_finite(function, mu, "Location parameter", &lp, Policy()))
60  return lp;
61  if (!check_not_nan(function, y, "Random variable", &lp, Policy()))
62  return lp;
63  if (!check_symmetric(function, Sigma, "Scale parameter", &lp, Policy()))
64  return lp;
65 
66  // allows infinities
67  if (!check_not_nan(function, nu,
68  "Degrees of freedom parameter", &lp,
69  Policy()))
70  return lp;
71  if (!check_positive(function, nu,
72  "Degrees of freedom parameter", &lp,
73  Policy()))
74  return lp;
75 
76  using std::isinf;
77 
78  if (isinf(nu)) // already checked nu > 0
79  return multi_normal_log(y,mu,Sigma,Policy());
80 
81  Eigen::LLT< Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic> > LLT = Sigma.llt();
82  if (LLT.info() != Eigen::Success) {
83  lp = stan::math::policies::raise_domain_error<T_scale>(function,
84  "Sigma is not positive definite (%1%)",
85  0,Policy());
86  return lp;
87  }
88  Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic> L = LLT.matrixL();
89 
90  double d = y.size();
91 
93  lp += lgamma(0.5 * (nu + d));
94  lp -= lgamma(0.5 * nu);
95  lp -= (0.5 * d) * log(nu);
96  }
97 
99  lp -= (0.5 * d) * LOG_PI;
100 
101  using stan::math::multiply;
102  using stan::math::dot_self;
103  using stan::math::subtract;
104  using Eigen::Array;
106 
107 
109  lp -= L.diagonal().array().log().sum();
110 
112 // Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic> I(d,d);
113 // I.setIdentity();
114 
115  Eigen::Matrix<typename promote_args<T_y,T_loc>::type,
116  Eigen::Dynamic,
117  1> y_minus_mu = subtract(y,mu);
118  Eigen::Matrix<typename promote_args<T_scale,T_y,T_loc>::type,
119  Eigen::Dynamic,
120  1> half = L = mdivide_left_tri<Eigen::Lower>(L, y_minus_mu);
121  lp -= 0.5
122  * (nu + d)
123  * log(1.0 + dot_self(half) / nu);
124  }
125  return lp;
126  }
127 
128  template <bool propto,
129  typename T_y, typename T_dof, typename T_loc, typename T_scale>
130  inline
131  typename boost::math::tools::promote_args<T_y,T_dof,T_loc,T_scale>::type
132  multi_student_t_log(const Eigen::Matrix<T_y,Eigen::Dynamic,1>& y,
133  const T_dof& nu,
134  const Eigen::Matrix<T_loc,Eigen::Dynamic,1>& mu,
135  const
136  Eigen::Matrix<T_scale,
137  Eigen::Dynamic,Eigen::Dynamic>& Sigma) {
138  return multi_student_t_log<propto>(y,nu,mu,Sigma,
140  }
141 
142  template <typename T_y, typename T_dof, typename T_loc, typename T_scale,
143  class Policy>
144  inline
145  typename boost::math::tools::promote_args<T_y,T_dof,T_loc,T_scale>::type
146  multi_student_t_log(const Eigen::Matrix<T_y,Eigen::Dynamic,1>& y,
147  const T_dof& nu,
148  const Eigen::Matrix<T_loc,Eigen::Dynamic,1>& mu,
149  const
150  Eigen::Matrix<T_scale,
151  Eigen::Dynamic,Eigen::Dynamic>& Sigma,
152  const Policy&) {
153  return multi_student_t_log<false>(y,nu,mu,Sigma,Policy());
154  }
155 
156 
157 
158  template <typename T_y, typename T_dof, typename T_loc, typename T_scale>
159  inline
160  typename boost::math::tools::promote_args<T_y,T_dof,T_loc,T_scale>::type
161  multi_student_t_log(const Eigen::Matrix<T_y,Eigen::Dynamic,1>& y,
162  const T_dof& nu,
163  const Eigen::Matrix<T_loc,Eigen::Dynamic,1>& mu,
164  const
165  Eigen::Matrix<T_scale,
166  Eigen::Dynamic,Eigen::Dynamic>& Sigma) {
167  return multi_student_t_log<false>(y,nu,mu,Sigma,
169  }
170 
171 
172 
173  }
174 }
175 #endif

     [ Stan Home Page ] © 2011–2013, Stan Development Team.