Stan  1.1
probability, sampling & optimization
 All Classes Namespaces Files Functions Variables Typedefs Enumerator Friends Macros Pages
lkj_cov.hpp
Go to the documentation of this file.
1 #ifndef __STAN__PROB__DISTRIBUTIONS__MULTIVARIATE__CONTINUOUS__LKJ_COV_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__MULTIVARIATE__CONTINUOUS__LKJ_COV_HPP__
3 
5 #include <stan/math/matrix.hpp>
9 #include <stan/meta/traits.hpp>
10 #include <stan/prob/traits.hpp>
11 
14 
15 namespace stan {
16 
17  namespace prob {
18 
19  // LKJ_cov(y|mu,sigma,eta) [ y covariance matrix (not correlation matrix)
20  // mu vector, sigma > 0 vector, eta > 0 ]
21  template <bool propto,
22  typename T_y, typename T_loc, typename T_scale, typename T_shape,
23  class Policy>
24  typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_shape>::type
25  lkj_cov_log(const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& y,
26  const Eigen::Matrix<T_loc,Eigen::Dynamic,1>& mu,
27  const Eigen::Matrix<T_scale,Eigen::Dynamic,1>& sigma,
28  const T_shape& eta,
29  const Policy&) {
30  static const char* function = "stan::prob::lkj_cov_log(%1%)";
31 
35  using boost::math::tools::promote_args;
36 
37  typename promote_args<T_y,T_loc,T_scale,T_shape>::type lp(0.0);
38  if (!check_size_match(function,
39  mu.rows(), "Rows of location parameter",
40  sigma.rows(), "columns of scale parameter",
41  &lp, Policy()))
42  return lp;
43  if (!check_size_match(function,
44  y.rows(), "Rows of random variable",
45  y.cols(), "columns of random variable",
46  &lp, Policy()))
47  return lp;
48  if (!check_size_match(function,
49  y.rows(), "Rows of random variable",
50  mu.rows(), "rows of location parameter",
51  &lp, Policy()))
52  return lp;
53  if (!check_positive(function, eta, "Shape parameter", &lp, Policy()))
54  return lp;
55  if (!check_finite(function, mu, "Location parameter", &lp, Policy()))
56  return lp;
57  if (!check_finite(function, sigma, "Scale parameter", &lp, Policy()))
58  return lp;
59  // FIXME: build vectorized versions
60  for (int m = 0; m < y.rows(); ++m)
61  for (int n = 0; n < y.cols(); ++n)
62  if (!check_finite(function, y(m,n), "Covariance matrix", &lp, Policy()))
63  return lp;
64 
65  const unsigned int K = y.rows();
66  const Eigen::Array<T_y,Eigen::Dynamic,1> sds
67  = y.diagonal().array().sqrt();
68  for (unsigned int k = 0; k < K; k++) {
69  lp += lognormal_log<propto>(sds(k), mu(k), sigma(k), Policy());
70  }
71  if (stan::is_constant<typename stan::scalar_type<T_shape> >::value
72  && eta == 1.0) {
73  // no need to rescale y into a correlation matrix
74  lp += lkj_corr_log<propto,T_y,T_shape,Policy>(y, eta, Policy());
75  return lp;
76  }
77  Eigen::DiagonalMatrix<T_y,Eigen::Dynamic> D(K);
78  D.diagonal() = sds.inverse();
79  lp += lkj_corr_log<propto,T_y,T_shape,Policy>(D * y * D, eta, Policy());
80  return lp;
81  }
82 
83  template <bool propto,
84  typename T_y, typename T_loc, typename T_scale, typename T_shape>
85  inline
86  typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_shape>::type
87  lkj_cov_log(const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& y,
88  const Eigen::Matrix<T_loc,Eigen::Dynamic,1>& mu,
89  const Eigen::Matrix<T_scale,Eigen::Dynamic,1>& sigma,
90  const T_shape& eta) {
91  return lkj_cov_log<propto>(y,mu,sigma,eta,stan::math::default_policy());
92  }
93 
94 
95  template <typename T_y, typename T_loc, typename T_scale, typename T_shape,
96  class Policy>
97  inline
98  typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_shape>::type
99  lkj_cov_log(const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& y,
100  const Eigen::Matrix<T_loc,Eigen::Dynamic,1>& mu,
101  const Eigen::Matrix<T_scale,Eigen::Dynamic,1>& sigma,
102  const T_shape& eta,
103  const Policy&) {
104  return lkj_cov_log<false>(y,mu,sigma,eta,Policy());
105  }
106 
107 
108  template <typename T_y, typename T_loc, typename T_scale, typename T_shape>
109  inline
110  typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_shape>::type
111  lkj_cov_log(const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& y,
112  const Eigen::Matrix<T_loc,Eigen::Dynamic,1>& mu,
113  const Eigen::Matrix<T_scale,Eigen::Dynamic,1>& sigma,
114  const T_shape& eta) {
115  return lkj_cov_log<false>(y,mu,sigma,eta,stan::math::default_policy());
116  }
117 
118 
119 
120  // LKJ_Cov(y|mu,sigma,eta) [ y covariance matrix (not correlation matrix)
121  // mu scalar, sigma > 0 scalar, eta > 0 ]
122  template <bool propto,
123  typename T_y, typename T_loc, typename T_scale, typename T_shape,
124  class Policy>
125  typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_shape>::type
126  lkj_cov_log(const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& y,
127  const T_loc& mu,
128  const T_scale& sigma,
129  const T_shape& eta,
130  const Policy&) {
131  static const char* function = "stan::prob::lkj_cov_log(%1%)";
132 
135  using boost::math::tools::promote_args;
136 
137  typename promote_args<T_y,T_loc,T_scale,T_shape>::type lp(0.0);
138  if (!check_positive(function, eta, "Shape parameter", &lp, Policy()))
139  return lp;
140  if (!check_finite(function, mu, "Location parameter", &lp, Policy()))
141  return lp;
142  if (!check_finite(function, sigma, "Scale parameter",
143  &lp, Policy()))
144  return lp;
145 
146  const unsigned int K = y.rows();
147  const Eigen::Array<T_y,Eigen::Dynamic,1> sds
148  = y.diagonal().array().sqrt();
149  for (unsigned int k = 0; k < K; k++) {
150  lp += lognormal_log<propto>(sds(k), mu, sigma, Policy());
151  }
152  if (stan::is_constant<typename stan::scalar_type<T_shape> >::value
153  && eta == 1.0) {
154  // no need to rescale y into a correlation matrix
155  lp += lkj_corr_log<propto>(y,eta,Policy());
156  return lp;
157  }
158  Eigen::DiagonalMatrix<T_y,Eigen::Dynamic> D(K);
159  D.diagonal() = sds.inverse();
160  lp += lkj_corr_log<propto,T_y,T_shape,Policy>(D * y * D, eta, Policy());
161  return lp;
162  }
163 
164  template <bool propto,
165  typename T_y, typename T_loc, typename T_scale, typename T_shape>
166  inline
167  typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_shape>::type
168  lkj_cov_log(const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& y,
169  const T_loc& mu,
170  const T_scale& sigma,
171  const T_shape& eta) {
172  return lkj_cov_log<propto>(y,mu,sigma,eta,stan::math::default_policy());
173  }
174 
175  template <typename T_y, typename T_loc, typename T_scale, typename T_shape,
176  class Policy>
177  inline
178  typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_shape>::type
179  lkj_cov_log(const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& y,
180  const T_loc& mu,
181  const T_scale& sigma,
182  const T_shape& eta,
183  const Policy&) {
184  return lkj_cov_log<false>(y,mu,sigma,eta,Policy());
185  }
186 
187  template <typename T_y, typename T_loc, typename T_scale, typename T_shape>
188  inline
189  typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_shape>::type
190  lkj_cov_log(const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& y,
191  const T_loc& mu,
192  const T_scale& sigma,
193  const T_shape& eta) {
194  return lkj_cov_log<false>(y,mu,sigma,eta,stan::math::default_policy());
195  }
196 
197 
198  }
199 }
200 #endif

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