Stan Math Library  2.15.0
reverse mode automatic differentiation
ordered_logistic_lpmf.hpp
Go to the documentation of this file.
1 #ifndef STAN_MATH_PRIM_MAT_PROB_ORDERED_LOGISTIC_LPMF_HPP
2 #define STAN_MATH_PRIM_MAT_PROB_ORDERED_LOGISTIC_LPMF_HPP
3 
4 #include <boost/random/uniform_01.hpp>
5 #include <boost/random/variate_generator.hpp>
20 
21 namespace stan {
22  namespace math {
23 
24  template <typename T>
25  inline T log_inv_logit_diff(const T& alpha, const T& beta) {
26  using std::exp;
27  return beta + log1m_exp(alpha - beta) - log1p_exp(alpha)
28  - log1p_exp(beta);
29  }
30 
55  template <bool propto, typename T_lambda, typename T_cut>
56  typename boost::math::tools::promote_args<T_lambda, T_cut>::type
57  ordered_logistic_lpmf(int y, const T_lambda& lambda,
58  const Eigen::Matrix<T_cut, Eigen::Dynamic, 1>& c) {
59  using std::exp;
60  using std::log;
61 
62  static const char* function("ordered_logistic");
63 
64  int K = c.size() + 1;
65 
66  check_bounded(function, "Random variable", y, 1, K);
67  check_finite(function, "Location parameter", lambda);
68  check_greater(function, "Size of cut points parameter", c.size(), 0);
69  for (int i = 1; i < c.size(); ++i)
70  check_greater(function, "Cut points parameter", c(i), c(i - 1));
71 
72  check_finite(function, "Cut points parameter", c(c.size()-1));
73  check_finite(function, "Cut points parameter", c(0));
74 
75  // log(1 - inv_logit(lambda))
76  if (y == 1)
77  return -log1p_exp(lambda - c(0));
78 
79  // log(inv_logit(lambda - c(K-3)));
80  if (y == K) {
81  return -log1p_exp(c(K-2) - lambda);
82  }
83 
84  // if (2 < y < K) { ... }
85  // log(inv_logit(lambda - c(y-2)) - inv_logit(lambda - c(y-1)))
86  return log_inv_logit_diff(c(y-2) - lambda,
87  c(y-1) - lambda);
88  }
89 
90  template <typename T_lambda, typename T_cut>
91  typename boost::math::tools::promote_args<T_lambda, T_cut>::type
92  ordered_logistic_lpmf(int y, const T_lambda& lambda,
93  const Eigen::Matrix<T_cut, Eigen::Dynamic, 1>& c) {
94  return ordered_logistic_lpmf<false>(y, lambda, c);
95  }
96 
97  }
98 }
99 #endif
void check_finite(const char *function, const char *name, const T_y &y)
Check if y is finite.
void check_bounded(const char *function, const char *name, const T_y &y, const T_low &low, const T_high &high)
Check if the value is between the low and high values, inclusively.
fvar< T > log(const fvar< T > &x)
Definition: log.hpp:14
T log_inv_logit_diff(const T &alpha, const T &beta)
fvar< T > exp(const fvar< T > &x)
Definition: exp.hpp:10
fvar< T > log1m_exp(const fvar< T > &x)
Return the natural logarithm of one minus the exponentiation of the specified argument.
Definition: log1m_exp.hpp:23
fvar< T > log1p_exp(const fvar< T > &x)
Definition: log1p_exp.hpp:13
boost::math::tools::promote_args< T_lambda, T_cut >::type ordered_logistic_lpmf(int y, const T_lambda &lambda, const Eigen::Matrix< T_cut, Eigen::Dynamic, 1 > &c)
Returns the (natural) log probability of the specified integer outcome given the continuous location ...
void check_greater(const char *function, const char *name, const T_y &y, const T_low &low)
Check if y is strictly greater than low.

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