Stan  1.3
probability, sampling & optimization
 All Classes Namespaces Files Functions Variables Typedefs Enumerator Friends Macros Pages
ordered_logistic.hpp
Go to the documentation of this file.
1 #ifndef __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__DISCRETE__ORDERED_LOGISTIC_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__DISCRETE__ORDERED_LOGISTIC_HPP__
3 
4 #include <boost/random/uniform_01.hpp>
5 #include <boost/random/variate_generator.hpp>
7 
8 #include <stan/prob/traits.hpp>
15 #include <stan/prob/constants.hpp>
16 
17 
18 namespace stan {
19 
20  namespace prob {
21 
22 
23  template <typename T>
24  inline T log_inv_logit_diff(const T& alpha, const T& beta) {
25  using std::exp;
26  using stan::math::log1m;
28  return beta + log1m(exp(alpha - beta)) - log1p_exp(alpha) - log1p_exp(beta);
29  }
30 
31  // y in 0,...,K-1; c.size()==K-2, c increasing, lambda finite
58  template <bool propto,
59  typename T_lambda,
60  typename T_cut,
61  class Policy>
62  typename boost::math::tools::promote_args<T_lambda,T_cut>::type
64  const T_lambda& lambda,
65  const Eigen::Matrix<T_cut,Eigen::Dynamic,1>& c,
66  const Policy&) {
67 
68  using std::exp;
69  using std::log;
71  using stan::math::log1m;
73 
74  static const char* function = "stan::prob::ordered_logistic(%1%)";
75 
83 
84  int K = c.size() + 1;
85 
86  typename boost::math::tools::promote_args<T_lambda,T_cut>::type lp(0.0);
87  if (!check_bounded(function, y, 1, K,
88  "Random variable",
89  &lp, Policy()))
90  return lp;
91 
92  if (!check_finite(function, lambda,
93  "Location parameter", &lp, Policy()))
94  return lp;
95 
96  if (!check_greater(function, c.size(), 0,
97  "Size of cut points parameter",
98  &lp, Policy()))
99  return lp;
100 
101 
102  for (int i = 1; i < c.size(); ++i) {
103  if (!check_greater(function, c(i), c(i - 1),
104  "Cut points parameter",
105  &lp, Policy()))
106  return lp;
107  }
108 
109  if (!check_finite(function, c(c.size()-1),
110  "Cut points parameter",
111  &lp, Policy()))
112  return lp;
113 
114  if (!check_finite(function, c(0),
115  "Cut points parameter",
116  &lp, Policy()))
117  return lp;
118 
119  // log(1 - inv_logit(lambda))
120  if (y == 1)
121  return -log1p_exp(lambda - c(0));
122 
123  // log(inv_logit(lambda - c(K-3)));
124  if (y == K) {
125  return -log1p_exp(c(K-2) - lambda);
126  }
127 
128  // if (2 < y < K) { ... }
129  // log(inv_logit(lambda - c(y-2)) - inv_logit(lambda - c(y-1)))
130  return log_inv_logit_diff(c(y-2) - lambda,
131  c(y-1) - lambda);
132 
133  }
134 
135 
136  template <bool propto,
137  typename T_lambda,
138  typename T_cut>
139  typename boost::math::tools::promote_args<T_lambda,T_cut>::type
141  const T_lambda& lambda,
142  const Eigen::Matrix<T_cut,Eigen::Dynamic,1>& c) {
143  return ordered_logistic_log<propto>(y,lambda,c,stan::math::default_policy());
144  }
145 
146 
147  template <typename T_lambda,
148  typename T_cut,
149  class Policy>
150  typename boost::math::tools::promote_args<T_lambda,T_cut>::type
152  const T_lambda& lambda,
153  const Eigen::Matrix<T_cut,Eigen::Dynamic,1>& c,
154  const Policy&) {
155  return ordered_logistic_log<false>(y,lambda,c,Policy());
156  }
157 
158 
159  template <typename T_lambda,
160  typename T_cut>
161  typename boost::math::tools::promote_args<T_lambda,T_cut>::type
163  const T_lambda& lambda,
164  const Eigen::Matrix<T_cut,Eigen::Dynamic,1>& c) {
165  return ordered_logistic_log<false>(y,lambda,c,stan::math::default_policy());
166  }
167 
168  template <class RNG>
169  inline int
170  ordered_logistic_rng(const double eta,
171  const Eigen::Matrix<double,Eigen::Dynamic,1>& c,
172  RNG& rng) {
173  using boost::variate_generator;
174  using stan::math::inv_logit;
175  Eigen::VectorXd cut(c.rows());
176  cut(0) = 1 - inv_logit(eta - c(0));
177  for(int j = 1; j < c.rows() - 1; j++)
178  cut(j) = inv_logit(eta - c(j - 1)) - inv_logit(eta - c(j));
179  cut(c.rows() - 1) = inv_logit(eta - c(c.rows() - 2));
180 
181  return stan::prob::categorical_rng(cut, rng);
182  }
183  }
184 }
185 
186 #endif

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