Chris@16
|
1 // boost\math\distributions\beta.hpp
|
Chris@16
|
2
|
Chris@16
|
3 // Copyright John Maddock 2006.
|
Chris@16
|
4 // Copyright Paul A. Bristow 2006.
|
Chris@16
|
5
|
Chris@16
|
6 // Use, modification and distribution are subject to the
|
Chris@16
|
7 // Boost Software License, Version 1.0.
|
Chris@16
|
8 // (See accompanying file LICENSE_1_0.txt
|
Chris@16
|
9 // or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
10
|
Chris@16
|
11 // http://en.wikipedia.org/wiki/Beta_distribution
|
Chris@16
|
12 // http://www.itl.nist.gov/div898/handbook/eda/section3/eda366h.htm
|
Chris@16
|
13 // http://mathworld.wolfram.com/BetaDistribution.html
|
Chris@16
|
14
|
Chris@16
|
15 // The Beta Distribution is a continuous probability distribution.
|
Chris@16
|
16 // The beta distribution is used to model events which are constrained to take place
|
Chris@16
|
17 // within an interval defined by maxima and minima,
|
Chris@16
|
18 // so is used extensively in PERT and other project management systems
|
Chris@16
|
19 // to describe the time to completion.
|
Chris@16
|
20 // The cdf of the beta distribution is used as a convenient way
|
Chris@16
|
21 // of obtaining the sum over a set of binomial outcomes.
|
Chris@16
|
22 // The beta distribution is also used in Bayesian statistics.
|
Chris@16
|
23
|
Chris@16
|
24 #ifndef BOOST_MATH_DIST_BETA_HPP
|
Chris@16
|
25 #define BOOST_MATH_DIST_BETA_HPP
|
Chris@16
|
26
|
Chris@16
|
27 #include <boost/math/distributions/fwd.hpp>
|
Chris@16
|
28 #include <boost/math/special_functions/beta.hpp> // for beta.
|
Chris@16
|
29 #include <boost/math/distributions/complement.hpp> // complements.
|
Chris@16
|
30 #include <boost/math/distributions/detail/common_error_handling.hpp> // error checks
|
Chris@16
|
31 #include <boost/math/special_functions/fpclassify.hpp> // isnan.
|
Chris@16
|
32 #include <boost/math/tools/roots.hpp> // for root finding.
|
Chris@16
|
33
|
Chris@16
|
34 #if defined (BOOST_MSVC)
|
Chris@16
|
35 # pragma warning(push)
|
Chris@16
|
36 # pragma warning(disable: 4702) // unreachable code
|
Chris@16
|
37 // in domain_error_imp in error_handling
|
Chris@16
|
38 #endif
|
Chris@16
|
39
|
Chris@16
|
40 #include <utility>
|
Chris@16
|
41
|
Chris@16
|
42 namespace boost
|
Chris@16
|
43 {
|
Chris@16
|
44 namespace math
|
Chris@16
|
45 {
|
Chris@16
|
46 namespace beta_detail
|
Chris@16
|
47 {
|
Chris@16
|
48 // Common error checking routines for beta distribution functions:
|
Chris@16
|
49 template <class RealType, class Policy>
|
Chris@16
|
50 inline bool check_alpha(const char* function, const RealType& alpha, RealType* result, const Policy& pol)
|
Chris@16
|
51 {
|
Chris@16
|
52 if(!(boost::math::isfinite)(alpha) || (alpha <= 0))
|
Chris@16
|
53 {
|
Chris@16
|
54 *result = policies::raise_domain_error<RealType>(
|
Chris@16
|
55 function,
|
Chris@16
|
56 "Alpha argument is %1%, but must be > 0 !", alpha, pol);
|
Chris@16
|
57 return false;
|
Chris@16
|
58 }
|
Chris@16
|
59 return true;
|
Chris@16
|
60 } // bool check_alpha
|
Chris@16
|
61
|
Chris@16
|
62 template <class RealType, class Policy>
|
Chris@16
|
63 inline bool check_beta(const char* function, const RealType& beta, RealType* result, const Policy& pol)
|
Chris@16
|
64 {
|
Chris@16
|
65 if(!(boost::math::isfinite)(beta) || (beta <= 0))
|
Chris@16
|
66 {
|
Chris@16
|
67 *result = policies::raise_domain_error<RealType>(
|
Chris@16
|
68 function,
|
Chris@16
|
69 "Beta argument is %1%, but must be > 0 !", beta, pol);
|
Chris@16
|
70 return false;
|
Chris@16
|
71 }
|
Chris@16
|
72 return true;
|
Chris@16
|
73 } // bool check_beta
|
Chris@16
|
74
|
Chris@16
|
75 template <class RealType, class Policy>
|
Chris@16
|
76 inline bool check_prob(const char* function, const RealType& p, RealType* result, const Policy& pol)
|
Chris@16
|
77 {
|
Chris@16
|
78 if((p < 0) || (p > 1) || !(boost::math::isfinite)(p))
|
Chris@16
|
79 {
|
Chris@16
|
80 *result = policies::raise_domain_error<RealType>(
|
Chris@16
|
81 function,
|
Chris@16
|
82 "Probability argument is %1%, but must be >= 0 and <= 1 !", p, pol);
|
Chris@16
|
83 return false;
|
Chris@16
|
84 }
|
Chris@16
|
85 return true;
|
Chris@16
|
86 } // bool check_prob
|
Chris@16
|
87
|
Chris@16
|
88 template <class RealType, class Policy>
|
Chris@16
|
89 inline bool check_x(const char* function, const RealType& x, RealType* result, const Policy& pol)
|
Chris@16
|
90 {
|
Chris@16
|
91 if(!(boost::math::isfinite)(x) || (x < 0) || (x > 1))
|
Chris@16
|
92 {
|
Chris@16
|
93 *result = policies::raise_domain_error<RealType>(
|
Chris@16
|
94 function,
|
Chris@16
|
95 "x argument is %1%, but must be >= 0 and <= 1 !", x, pol);
|
Chris@16
|
96 return false;
|
Chris@16
|
97 }
|
Chris@16
|
98 return true;
|
Chris@16
|
99 } // bool check_x
|
Chris@16
|
100
|
Chris@16
|
101 template <class RealType, class Policy>
|
Chris@16
|
102 inline bool check_dist(const char* function, const RealType& alpha, const RealType& beta, RealType* result, const Policy& pol)
|
Chris@16
|
103 { // Check both alpha and beta.
|
Chris@16
|
104 return check_alpha(function, alpha, result, pol)
|
Chris@16
|
105 && check_beta(function, beta, result, pol);
|
Chris@16
|
106 } // bool check_dist
|
Chris@16
|
107
|
Chris@16
|
108 template <class RealType, class Policy>
|
Chris@16
|
109 inline bool check_dist_and_x(const char* function, const RealType& alpha, const RealType& beta, RealType x, RealType* result, const Policy& pol)
|
Chris@16
|
110 {
|
Chris@16
|
111 return check_dist(function, alpha, beta, result, pol)
|
Chris@16
|
112 && beta_detail::check_x(function, x, result, pol);
|
Chris@16
|
113 } // bool check_dist_and_x
|
Chris@16
|
114
|
Chris@16
|
115 template <class RealType, class Policy>
|
Chris@16
|
116 inline bool check_dist_and_prob(const char* function, const RealType& alpha, const RealType& beta, RealType p, RealType* result, const Policy& pol)
|
Chris@16
|
117 {
|
Chris@16
|
118 return check_dist(function, alpha, beta, result, pol)
|
Chris@16
|
119 && check_prob(function, p, result, pol);
|
Chris@16
|
120 } // bool check_dist_and_prob
|
Chris@16
|
121
|
Chris@16
|
122 template <class RealType, class Policy>
|
Chris@16
|
123 inline bool check_mean(const char* function, const RealType& mean, RealType* result, const Policy& pol)
|
Chris@16
|
124 {
|
Chris@16
|
125 if(!(boost::math::isfinite)(mean) || (mean <= 0))
|
Chris@16
|
126 {
|
Chris@16
|
127 *result = policies::raise_domain_error<RealType>(
|
Chris@16
|
128 function,
|
Chris@16
|
129 "mean argument is %1%, but must be > 0 !", mean, pol);
|
Chris@16
|
130 return false;
|
Chris@16
|
131 }
|
Chris@16
|
132 return true;
|
Chris@16
|
133 } // bool check_mean
|
Chris@16
|
134 template <class RealType, class Policy>
|
Chris@16
|
135 inline bool check_variance(const char* function, const RealType& variance, RealType* result, const Policy& pol)
|
Chris@16
|
136 {
|
Chris@16
|
137 if(!(boost::math::isfinite)(variance) || (variance <= 0))
|
Chris@16
|
138 {
|
Chris@16
|
139 *result = policies::raise_domain_error<RealType>(
|
Chris@16
|
140 function,
|
Chris@16
|
141 "variance argument is %1%, but must be > 0 !", variance, pol);
|
Chris@16
|
142 return false;
|
Chris@16
|
143 }
|
Chris@16
|
144 return true;
|
Chris@16
|
145 } // bool check_variance
|
Chris@16
|
146 } // namespace beta_detail
|
Chris@16
|
147
|
Chris@16
|
148 // typedef beta_distribution<double> beta;
|
Chris@16
|
149 // is deliberately NOT included to avoid a name clash with the beta function.
|
Chris@16
|
150 // Use beta_distribution<> mybeta(...) to construct type double.
|
Chris@16
|
151
|
Chris@16
|
152 template <class RealType = double, class Policy = policies::policy<> >
|
Chris@16
|
153 class beta_distribution
|
Chris@16
|
154 {
|
Chris@16
|
155 public:
|
Chris@16
|
156 typedef RealType value_type;
|
Chris@16
|
157 typedef Policy policy_type;
|
Chris@16
|
158
|
Chris@16
|
159 beta_distribution(RealType l_alpha = 1, RealType l_beta = 1) : m_alpha(l_alpha), m_beta(l_beta)
|
Chris@16
|
160 {
|
Chris@16
|
161 RealType result;
|
Chris@16
|
162 beta_detail::check_dist(
|
Chris@16
|
163 "boost::math::beta_distribution<%1%>::beta_distribution",
|
Chris@16
|
164 m_alpha,
|
Chris@16
|
165 m_beta,
|
Chris@16
|
166 &result, Policy());
|
Chris@16
|
167 } // beta_distribution constructor.
|
Chris@16
|
168 // Accessor functions:
|
Chris@16
|
169 RealType alpha() const
|
Chris@16
|
170 {
|
Chris@16
|
171 return m_alpha;
|
Chris@16
|
172 }
|
Chris@16
|
173 RealType beta() const
|
Chris@16
|
174 { // .
|
Chris@16
|
175 return m_beta;
|
Chris@16
|
176 }
|
Chris@16
|
177
|
Chris@16
|
178 // Estimation of the alpha & beta parameters.
|
Chris@16
|
179 // http://en.wikipedia.org/wiki/Beta_distribution
|
Chris@16
|
180 // gives formulae in section on parameter estimation.
|
Chris@16
|
181 // Also NIST EDA page 3 & 4 give the same.
|
Chris@16
|
182 // http://www.itl.nist.gov/div898/handbook/eda/section3/eda366h.htm
|
Chris@16
|
183 // http://www.epi.ucdavis.edu/diagnostictests/betabuster.html
|
Chris@16
|
184
|
Chris@16
|
185 static RealType find_alpha(
|
Chris@16
|
186 RealType mean, // Expected value of mean.
|
Chris@16
|
187 RealType variance) // Expected value of variance.
|
Chris@16
|
188 {
|
Chris@16
|
189 static const char* function = "boost::math::beta_distribution<%1%>::find_alpha";
|
Chris@16
|
190 RealType result = 0; // of error checks.
|
Chris@16
|
191 if(false ==
|
Chris@16
|
192 (
|
Chris@16
|
193 beta_detail::check_mean(function, mean, &result, Policy())
|
Chris@16
|
194 && beta_detail::check_variance(function, variance, &result, Policy())
|
Chris@16
|
195 )
|
Chris@16
|
196 )
|
Chris@16
|
197 {
|
Chris@16
|
198 return result;
|
Chris@16
|
199 }
|
Chris@16
|
200 return mean * (( (mean * (1 - mean)) / variance)- 1);
|
Chris@16
|
201 } // RealType find_alpha
|
Chris@16
|
202
|
Chris@16
|
203 static RealType find_beta(
|
Chris@16
|
204 RealType mean, // Expected value of mean.
|
Chris@16
|
205 RealType variance) // Expected value of variance.
|
Chris@16
|
206 {
|
Chris@16
|
207 static const char* function = "boost::math::beta_distribution<%1%>::find_beta";
|
Chris@16
|
208 RealType result = 0; // of error checks.
|
Chris@16
|
209 if(false ==
|
Chris@16
|
210 (
|
Chris@16
|
211 beta_detail::check_mean(function, mean, &result, Policy())
|
Chris@16
|
212 &&
|
Chris@16
|
213 beta_detail::check_variance(function, variance, &result, Policy())
|
Chris@16
|
214 )
|
Chris@16
|
215 )
|
Chris@16
|
216 {
|
Chris@16
|
217 return result;
|
Chris@16
|
218 }
|
Chris@16
|
219 return (1 - mean) * (((mean * (1 - mean)) /variance)-1);
|
Chris@16
|
220 } // RealType find_beta
|
Chris@16
|
221
|
Chris@16
|
222 // Estimate alpha & beta from either alpha or beta, and x and probability.
|
Chris@16
|
223 // Uses for these parameter estimators are unclear.
|
Chris@16
|
224
|
Chris@16
|
225 static RealType find_alpha(
|
Chris@16
|
226 RealType beta, // from beta.
|
Chris@16
|
227 RealType x, // x.
|
Chris@16
|
228 RealType probability) // cdf
|
Chris@16
|
229 {
|
Chris@16
|
230 static const char* function = "boost::math::beta_distribution<%1%>::find_alpha";
|
Chris@16
|
231 RealType result = 0; // of error checks.
|
Chris@16
|
232 if(false ==
|
Chris@16
|
233 (
|
Chris@16
|
234 beta_detail::check_prob(function, probability, &result, Policy())
|
Chris@16
|
235 &&
|
Chris@16
|
236 beta_detail::check_beta(function, beta, &result, Policy())
|
Chris@16
|
237 &&
|
Chris@16
|
238 beta_detail::check_x(function, x, &result, Policy())
|
Chris@16
|
239 )
|
Chris@16
|
240 )
|
Chris@16
|
241 {
|
Chris@16
|
242 return result;
|
Chris@16
|
243 }
|
Chris@16
|
244 return ibeta_inva(beta, x, probability, Policy());
|
Chris@16
|
245 } // RealType find_alpha(beta, a, probability)
|
Chris@16
|
246
|
Chris@16
|
247 static RealType find_beta(
|
Chris@16
|
248 // ibeta_invb(T b, T x, T p); (alpha, x, cdf,)
|
Chris@16
|
249 RealType alpha, // alpha.
|
Chris@16
|
250 RealType x, // probability x.
|
Chris@16
|
251 RealType probability) // probability cdf.
|
Chris@16
|
252 {
|
Chris@16
|
253 static const char* function = "boost::math::beta_distribution<%1%>::find_beta";
|
Chris@16
|
254 RealType result = 0; // of error checks.
|
Chris@16
|
255 if(false ==
|
Chris@16
|
256 (
|
Chris@16
|
257 beta_detail::check_prob(function, probability, &result, Policy())
|
Chris@16
|
258 &&
|
Chris@16
|
259 beta_detail::check_alpha(function, alpha, &result, Policy())
|
Chris@16
|
260 &&
|
Chris@16
|
261 beta_detail::check_x(function, x, &result, Policy())
|
Chris@16
|
262 )
|
Chris@16
|
263 )
|
Chris@16
|
264 {
|
Chris@16
|
265 return result;
|
Chris@16
|
266 }
|
Chris@16
|
267 return ibeta_invb(alpha, x, probability, Policy());
|
Chris@16
|
268 } // RealType find_beta(alpha, x, probability)
|
Chris@16
|
269
|
Chris@16
|
270 private:
|
Chris@16
|
271 RealType m_alpha; // Two parameters of the beta distribution.
|
Chris@16
|
272 RealType m_beta;
|
Chris@16
|
273 }; // template <class RealType, class Policy> class beta_distribution
|
Chris@16
|
274
|
Chris@16
|
275 template <class RealType, class Policy>
|
Chris@16
|
276 inline const std::pair<RealType, RealType> range(const beta_distribution<RealType, Policy>& /* dist */)
|
Chris@16
|
277 { // Range of permissible values for random variable x.
|
Chris@16
|
278 using boost::math::tools::max_value;
|
Chris@16
|
279 return std::pair<RealType, RealType>(static_cast<RealType>(0), static_cast<RealType>(1));
|
Chris@16
|
280 }
|
Chris@16
|
281
|
Chris@16
|
282 template <class RealType, class Policy>
|
Chris@16
|
283 inline const std::pair<RealType, RealType> support(const beta_distribution<RealType, Policy>& /* dist */)
|
Chris@16
|
284 { // Range of supported values for random variable x.
|
Chris@16
|
285 // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
|
Chris@16
|
286 return std::pair<RealType, RealType>(static_cast<RealType>(0), static_cast<RealType>(1));
|
Chris@16
|
287 }
|
Chris@16
|
288
|
Chris@16
|
289 template <class RealType, class Policy>
|
Chris@16
|
290 inline RealType mean(const beta_distribution<RealType, Policy>& dist)
|
Chris@16
|
291 { // Mean of beta distribution = np.
|
Chris@16
|
292 return dist.alpha() / (dist.alpha() + dist.beta());
|
Chris@16
|
293 } // mean
|
Chris@16
|
294
|
Chris@16
|
295 template <class RealType, class Policy>
|
Chris@16
|
296 inline RealType variance(const beta_distribution<RealType, Policy>& dist)
|
Chris@16
|
297 { // Variance of beta distribution = np(1-p).
|
Chris@16
|
298 RealType a = dist.alpha();
|
Chris@16
|
299 RealType b = dist.beta();
|
Chris@16
|
300 return (a * b) / ((a + b ) * (a + b) * (a + b + 1));
|
Chris@16
|
301 } // variance
|
Chris@16
|
302
|
Chris@16
|
303 template <class RealType, class Policy>
|
Chris@16
|
304 inline RealType mode(const beta_distribution<RealType, Policy>& dist)
|
Chris@16
|
305 {
|
Chris@16
|
306 static const char* function = "boost::math::mode(beta_distribution<%1%> const&)";
|
Chris@16
|
307
|
Chris@16
|
308 RealType result;
|
Chris@16
|
309 if ((dist.alpha() <= 1))
|
Chris@16
|
310 {
|
Chris@16
|
311 result = policies::raise_domain_error<RealType>(
|
Chris@16
|
312 function,
|
Chris@16
|
313 "mode undefined for alpha = %1%, must be > 1!", dist.alpha(), Policy());
|
Chris@16
|
314 return result;
|
Chris@16
|
315 }
|
Chris@16
|
316
|
Chris@16
|
317 if ((dist.beta() <= 1))
|
Chris@16
|
318 {
|
Chris@16
|
319 result = policies::raise_domain_error<RealType>(
|
Chris@16
|
320 function,
|
Chris@16
|
321 "mode undefined for beta = %1%, must be > 1!", dist.beta(), Policy());
|
Chris@16
|
322 return result;
|
Chris@16
|
323 }
|
Chris@16
|
324 RealType a = dist.alpha();
|
Chris@16
|
325 RealType b = dist.beta();
|
Chris@16
|
326 return (a-1) / (a + b - 2);
|
Chris@16
|
327 } // mode
|
Chris@16
|
328
|
Chris@16
|
329 //template <class RealType, class Policy>
|
Chris@16
|
330 //inline RealType median(const beta_distribution<RealType, Policy>& dist)
|
Chris@16
|
331 //{ // Median of beta distribution is not defined.
|
Chris@16
|
332 // return tools::domain_error<RealType>(function, "Median is not implemented, result is %1%!", std::numeric_limits<RealType>::quiet_NaN());
|
Chris@16
|
333 //} // median
|
Chris@16
|
334
|
Chris@16
|
335 //But WILL be provided by the derived accessor as quantile(0.5).
|
Chris@16
|
336
|
Chris@16
|
337 template <class RealType, class Policy>
|
Chris@16
|
338 inline RealType skewness(const beta_distribution<RealType, Policy>& dist)
|
Chris@16
|
339 {
|
Chris@16
|
340 BOOST_MATH_STD_USING // ADL of std functions.
|
Chris@16
|
341 RealType a = dist.alpha();
|
Chris@16
|
342 RealType b = dist.beta();
|
Chris@16
|
343 return (2 * (b-a) * sqrt(a + b + 1)) / ((a + b + 2) * sqrt(a * b));
|
Chris@16
|
344 } // skewness
|
Chris@16
|
345
|
Chris@16
|
346 template <class RealType, class Policy>
|
Chris@16
|
347 inline RealType kurtosis_excess(const beta_distribution<RealType, Policy>& dist)
|
Chris@16
|
348 {
|
Chris@16
|
349 RealType a = dist.alpha();
|
Chris@16
|
350 RealType b = dist.beta();
|
Chris@16
|
351 RealType a_2 = a * a;
|
Chris@16
|
352 RealType n = 6 * (a_2 * a - a_2 * (2 * b - 1) + b * b * (b + 1) - 2 * a * b * (b + 2));
|
Chris@16
|
353 RealType d = a * b * (a + b + 2) * (a + b + 3);
|
Chris@16
|
354 return n / d;
|
Chris@16
|
355 } // kurtosis_excess
|
Chris@16
|
356
|
Chris@16
|
357 template <class RealType, class Policy>
|
Chris@16
|
358 inline RealType kurtosis(const beta_distribution<RealType, Policy>& dist)
|
Chris@16
|
359 {
|
Chris@16
|
360 return 3 + kurtosis_excess(dist);
|
Chris@16
|
361 } // kurtosis
|
Chris@16
|
362
|
Chris@16
|
363 template <class RealType, class Policy>
|
Chris@16
|
364 inline RealType pdf(const beta_distribution<RealType, Policy>& dist, const RealType& x)
|
Chris@16
|
365 { // Probability Density/Mass Function.
|
Chris@16
|
366 BOOST_FPU_EXCEPTION_GUARD
|
Chris@16
|
367
|
Chris@16
|
368 static const char* function = "boost::math::pdf(beta_distribution<%1%> const&, %1%)";
|
Chris@16
|
369
|
Chris@16
|
370 BOOST_MATH_STD_USING // for ADL of std functions
|
Chris@16
|
371
|
Chris@16
|
372 RealType a = dist.alpha();
|
Chris@16
|
373 RealType b = dist.beta();
|
Chris@16
|
374
|
Chris@16
|
375 // Argument checks:
|
Chris@16
|
376 RealType result = 0;
|
Chris@16
|
377 if(false == beta_detail::check_dist_and_x(
|
Chris@16
|
378 function,
|
Chris@16
|
379 a, b, x,
|
Chris@16
|
380 &result, Policy()))
|
Chris@16
|
381 {
|
Chris@16
|
382 return result;
|
Chris@16
|
383 }
|
Chris@16
|
384 using boost::math::beta;
|
Chris@16
|
385 return ibeta_derivative(a, b, x, Policy());
|
Chris@16
|
386 } // pdf
|
Chris@16
|
387
|
Chris@16
|
388 template <class RealType, class Policy>
|
Chris@16
|
389 inline RealType cdf(const beta_distribution<RealType, Policy>& dist, const RealType& x)
|
Chris@16
|
390 { // Cumulative Distribution Function beta.
|
Chris@16
|
391 BOOST_MATH_STD_USING // for ADL of std functions
|
Chris@16
|
392
|
Chris@16
|
393 static const char* function = "boost::math::cdf(beta_distribution<%1%> const&, %1%)";
|
Chris@16
|
394
|
Chris@16
|
395 RealType a = dist.alpha();
|
Chris@16
|
396 RealType b = dist.beta();
|
Chris@16
|
397
|
Chris@16
|
398 // Argument checks:
|
Chris@16
|
399 RealType result = 0;
|
Chris@16
|
400 if(false == beta_detail::check_dist_and_x(
|
Chris@16
|
401 function,
|
Chris@16
|
402 a, b, x,
|
Chris@16
|
403 &result, Policy()))
|
Chris@16
|
404 {
|
Chris@16
|
405 return result;
|
Chris@16
|
406 }
|
Chris@16
|
407 // Special cases:
|
Chris@16
|
408 if (x == 0)
|
Chris@16
|
409 {
|
Chris@16
|
410 return 0;
|
Chris@16
|
411 }
|
Chris@16
|
412 else if (x == 1)
|
Chris@16
|
413 {
|
Chris@16
|
414 return 1;
|
Chris@16
|
415 }
|
Chris@16
|
416 return ibeta(a, b, x, Policy());
|
Chris@16
|
417 } // beta cdf
|
Chris@16
|
418
|
Chris@16
|
419 template <class RealType, class Policy>
|
Chris@16
|
420 inline RealType cdf(const complemented2_type<beta_distribution<RealType, Policy>, RealType>& c)
|
Chris@16
|
421 { // Complemented Cumulative Distribution Function beta.
|
Chris@16
|
422
|
Chris@16
|
423 BOOST_MATH_STD_USING // for ADL of std functions
|
Chris@16
|
424
|
Chris@16
|
425 static const char* function = "boost::math::cdf(beta_distribution<%1%> const&, %1%)";
|
Chris@16
|
426
|
Chris@16
|
427 RealType const& x = c.param;
|
Chris@16
|
428 beta_distribution<RealType, Policy> const& dist = c.dist;
|
Chris@16
|
429 RealType a = dist.alpha();
|
Chris@16
|
430 RealType b = dist.beta();
|
Chris@16
|
431
|
Chris@16
|
432 // Argument checks:
|
Chris@16
|
433 RealType result = 0;
|
Chris@16
|
434 if(false == beta_detail::check_dist_and_x(
|
Chris@16
|
435 function,
|
Chris@16
|
436 a, b, x,
|
Chris@16
|
437 &result, Policy()))
|
Chris@16
|
438 {
|
Chris@16
|
439 return result;
|
Chris@16
|
440 }
|
Chris@16
|
441 if (x == 0)
|
Chris@16
|
442 {
|
Chris@16
|
443 return 1;
|
Chris@16
|
444 }
|
Chris@16
|
445 else if (x == 1)
|
Chris@16
|
446 {
|
Chris@16
|
447 return 0;
|
Chris@16
|
448 }
|
Chris@16
|
449 // Calculate cdf beta using the incomplete beta function.
|
Chris@16
|
450 // Use of ibeta here prevents cancellation errors in calculating
|
Chris@16
|
451 // 1 - x if x is very small, perhaps smaller than machine epsilon.
|
Chris@16
|
452 return ibetac(a, b, x, Policy());
|
Chris@16
|
453 } // beta cdf
|
Chris@16
|
454
|
Chris@16
|
455 template <class RealType, class Policy>
|
Chris@16
|
456 inline RealType quantile(const beta_distribution<RealType, Policy>& dist, const RealType& p)
|
Chris@16
|
457 { // Quantile or Percent Point beta function or
|
Chris@16
|
458 // Inverse Cumulative probability distribution function CDF.
|
Chris@16
|
459 // Return x (0 <= x <= 1),
|
Chris@16
|
460 // for a given probability p (0 <= p <= 1).
|
Chris@16
|
461 // These functions take a probability as an argument
|
Chris@16
|
462 // and return a value such that the probability that a random variable x
|
Chris@16
|
463 // will be less than or equal to that value
|
Chris@16
|
464 // is whatever probability you supplied as an argument.
|
Chris@16
|
465
|
Chris@16
|
466 static const char* function = "boost::math::quantile(beta_distribution<%1%> const&, %1%)";
|
Chris@16
|
467
|
Chris@16
|
468 RealType result = 0; // of argument checks:
|
Chris@16
|
469 RealType a = dist.alpha();
|
Chris@16
|
470 RealType b = dist.beta();
|
Chris@16
|
471 if(false == beta_detail::check_dist_and_prob(
|
Chris@16
|
472 function,
|
Chris@16
|
473 a, b, p,
|
Chris@16
|
474 &result, Policy()))
|
Chris@16
|
475 {
|
Chris@16
|
476 return result;
|
Chris@16
|
477 }
|
Chris@16
|
478 // Special cases:
|
Chris@16
|
479 if (p == 0)
|
Chris@16
|
480 {
|
Chris@16
|
481 return 0;
|
Chris@16
|
482 }
|
Chris@16
|
483 if (p == 1)
|
Chris@16
|
484 {
|
Chris@16
|
485 return 1;
|
Chris@16
|
486 }
|
Chris@16
|
487 return ibeta_inv(a, b, p, static_cast<RealType*>(0), Policy());
|
Chris@16
|
488 } // quantile
|
Chris@16
|
489
|
Chris@16
|
490 template <class RealType, class Policy>
|
Chris@16
|
491 inline RealType quantile(const complemented2_type<beta_distribution<RealType, Policy>, RealType>& c)
|
Chris@16
|
492 { // Complement Quantile or Percent Point beta function .
|
Chris@16
|
493 // Return the number of expected x for a given
|
Chris@16
|
494 // complement of the probability q.
|
Chris@16
|
495
|
Chris@16
|
496 static const char* function = "boost::math::quantile(beta_distribution<%1%> const&, %1%)";
|
Chris@16
|
497
|
Chris@16
|
498 //
|
Chris@16
|
499 // Error checks:
|
Chris@16
|
500 RealType q = c.param;
|
Chris@16
|
501 const beta_distribution<RealType, Policy>& dist = c.dist;
|
Chris@16
|
502 RealType result = 0;
|
Chris@16
|
503 RealType a = dist.alpha();
|
Chris@16
|
504 RealType b = dist.beta();
|
Chris@16
|
505 if(false == beta_detail::check_dist_and_prob(
|
Chris@16
|
506 function,
|
Chris@16
|
507 a,
|
Chris@16
|
508 b,
|
Chris@16
|
509 q,
|
Chris@16
|
510 &result, Policy()))
|
Chris@16
|
511 {
|
Chris@16
|
512 return result;
|
Chris@16
|
513 }
|
Chris@16
|
514 // Special cases:
|
Chris@16
|
515 if(q == 1)
|
Chris@16
|
516 {
|
Chris@16
|
517 return 0;
|
Chris@16
|
518 }
|
Chris@16
|
519 if(q == 0)
|
Chris@16
|
520 {
|
Chris@16
|
521 return 1;
|
Chris@16
|
522 }
|
Chris@16
|
523
|
Chris@16
|
524 return ibetac_inv(a, b, q, static_cast<RealType*>(0), Policy());
|
Chris@16
|
525 } // Quantile Complement
|
Chris@16
|
526
|
Chris@16
|
527 } // namespace math
|
Chris@16
|
528 } // namespace boost
|
Chris@16
|
529
|
Chris@16
|
530 // This include must be at the end, *after* the accessors
|
Chris@16
|
531 // for this distribution have been defined, in order to
|
Chris@16
|
532 // keep compilers that support two-phase lookup happy.
|
Chris@16
|
533 #include <boost/math/distributions/detail/derived_accessors.hpp>
|
Chris@16
|
534
|
Chris@16
|
535 #if defined (BOOST_MSVC)
|
Chris@16
|
536 # pragma warning(pop)
|
Chris@16
|
537 #endif
|
Chris@16
|
538
|
Chris@16
|
539 #endif // BOOST_MATH_DIST_BETA_HPP
|
Chris@16
|
540
|
Chris@16
|
541
|