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

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