annotate DEPENDENCIES/generic/include/boost/math/distributions/pareto.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents c530137014c0
children
rev   line source
Chris@16 1 // Copyright John Maddock 2007.
Chris@16 2 // Copyright Paul A. Bristow 2007, 2009
Chris@16 3 // Use, modification and distribution are subject to the
Chris@16 4 // Boost Software License, Version 1.0. (See accompanying file
Chris@16 5 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@16 6
Chris@16 7 #ifndef BOOST_STATS_PARETO_HPP
Chris@16 8 #define BOOST_STATS_PARETO_HPP
Chris@16 9
Chris@16 10 // http://en.wikipedia.org/wiki/Pareto_distribution
Chris@16 11 // http://www.itl.nist.gov/div898/handbook/eda/section3/eda3661.htm
Chris@16 12 // Also:
Chris@16 13 // Weisstein, Eric W. "Pareto Distribution."
Chris@16 14 // From MathWorld--A Wolfram Web Resource.
Chris@16 15 // http://mathworld.wolfram.com/ParetoDistribution.html
Chris@16 16 // Handbook of Statistical Distributions with Applications, K Krishnamoorthy, ISBN 1-58488-635-8, Chapter 23, pp 257 - 267.
Chris@16 17 // Caution KK's a and b are the reverse of Mathworld!
Chris@16 18
Chris@16 19 #include <boost/math/distributions/fwd.hpp>
Chris@16 20 #include <boost/math/distributions/complement.hpp>
Chris@16 21 #include <boost/math/distributions/detail/common_error_handling.hpp>
Chris@16 22 #include <boost/math/special_functions/powm1.hpp>
Chris@16 23
Chris@16 24 #include <utility> // for BOOST_CURRENT_VALUE?
Chris@16 25
Chris@16 26 namespace boost
Chris@16 27 {
Chris@16 28 namespace math
Chris@16 29 {
Chris@16 30 namespace detail
Chris@16 31 { // Parameter checking.
Chris@16 32 template <class RealType, class Policy>
Chris@16 33 inline bool check_pareto_scale(
Chris@16 34 const char* function,
Chris@16 35 RealType scale,
Chris@16 36 RealType* result, const Policy& pol)
Chris@16 37 {
Chris@16 38 if((boost::math::isfinite)(scale))
Chris@16 39 { // any > 0 finite value is OK.
Chris@16 40 if (scale > 0)
Chris@16 41 {
Chris@16 42 return true;
Chris@16 43 }
Chris@16 44 else
Chris@16 45 {
Chris@16 46 *result = policies::raise_domain_error<RealType>(
Chris@16 47 function,
Chris@16 48 "Scale parameter is %1%, but must be > 0!", scale, pol);
Chris@16 49 return false;
Chris@16 50 }
Chris@16 51 }
Chris@16 52 else
Chris@16 53 { // Not finite.
Chris@16 54 *result = policies::raise_domain_error<RealType>(
Chris@16 55 function,
Chris@16 56 "Scale parameter is %1%, but must be finite!", scale, pol);
Chris@16 57 return false;
Chris@16 58 }
Chris@16 59 } // bool check_pareto_scale
Chris@16 60
Chris@16 61 template <class RealType, class Policy>
Chris@16 62 inline bool check_pareto_shape(
Chris@16 63 const char* function,
Chris@16 64 RealType shape,
Chris@16 65 RealType* result, const Policy& pol)
Chris@16 66 {
Chris@16 67 if((boost::math::isfinite)(shape))
Chris@16 68 { // Any finite value > 0 is OK.
Chris@16 69 if (shape > 0)
Chris@16 70 {
Chris@16 71 return true;
Chris@16 72 }
Chris@16 73 else
Chris@16 74 {
Chris@16 75 *result = policies::raise_domain_error<RealType>(
Chris@16 76 function,
Chris@16 77 "Shape parameter is %1%, but must be > 0!", shape, pol);
Chris@16 78 return false;
Chris@16 79 }
Chris@16 80 }
Chris@16 81 else
Chris@16 82 { // Not finite.
Chris@16 83 *result = policies::raise_domain_error<RealType>(
Chris@16 84 function,
Chris@16 85 "Shape parameter is %1%, but must be finite!", shape, pol);
Chris@16 86 return false;
Chris@16 87 }
Chris@16 88 } // bool check_pareto_shape(
Chris@16 89
Chris@16 90 template <class RealType, class Policy>
Chris@16 91 inline bool check_pareto_x(
Chris@16 92 const char* function,
Chris@16 93 RealType const& x,
Chris@16 94 RealType* result, const Policy& pol)
Chris@16 95 {
Chris@16 96 if((boost::math::isfinite)(x))
Chris@16 97 { //
Chris@16 98 if (x > 0)
Chris@16 99 {
Chris@16 100 return true;
Chris@16 101 }
Chris@16 102 else
Chris@16 103 {
Chris@16 104 *result = policies::raise_domain_error<RealType>(
Chris@16 105 function,
Chris@16 106 "x parameter is %1%, but must be > 0 !", x, pol);
Chris@16 107 return false;
Chris@16 108 }
Chris@16 109 }
Chris@16 110 else
Chris@16 111 { // Not finite..
Chris@16 112 *result = policies::raise_domain_error<RealType>(
Chris@16 113 function,
Chris@16 114 "x parameter is %1%, but must be finite!", x, pol);
Chris@16 115 return false;
Chris@16 116 }
Chris@16 117 } // bool check_pareto_x
Chris@16 118
Chris@16 119 template <class RealType, class Policy>
Chris@16 120 inline bool check_pareto( // distribution parameters.
Chris@16 121 const char* function,
Chris@16 122 RealType scale,
Chris@16 123 RealType shape,
Chris@16 124 RealType* result, const Policy& pol)
Chris@16 125 {
Chris@16 126 return check_pareto_scale(function, scale, result, pol)
Chris@16 127 && check_pareto_shape(function, shape, result, pol);
Chris@16 128 } // bool check_pareto(
Chris@16 129
Chris@16 130 } // namespace detail
Chris@16 131
Chris@16 132 template <class RealType = double, class Policy = policies::policy<> >
Chris@16 133 class pareto_distribution
Chris@16 134 {
Chris@16 135 public:
Chris@16 136 typedef RealType value_type;
Chris@16 137 typedef Policy policy_type;
Chris@16 138
Chris@16 139 pareto_distribution(RealType l_scale = 1, RealType l_shape = 1)
Chris@16 140 : m_scale(l_scale), m_shape(l_shape)
Chris@16 141 { // Constructor.
Chris@16 142 RealType result = 0;
Chris@16 143 detail::check_pareto("boost::math::pareto_distribution<%1%>::pareto_distribution", l_scale, l_shape, &result, Policy());
Chris@16 144 }
Chris@16 145
Chris@16 146 RealType scale()const
Chris@16 147 { // AKA Xm and Wolfram b and beta
Chris@16 148 return m_scale;
Chris@16 149 }
Chris@16 150
Chris@16 151 RealType shape()const
Chris@16 152 { // AKA k and Wolfram a and alpha
Chris@16 153 return m_shape;
Chris@16 154 }
Chris@16 155 private:
Chris@16 156 // Data members:
Chris@16 157 RealType m_scale; // distribution scale (xm) or beta
Chris@16 158 RealType m_shape; // distribution shape (k) or alpha
Chris@16 159 };
Chris@16 160
Chris@16 161 typedef pareto_distribution<double> pareto; // Convenience to allow pareto(2., 3.);
Chris@16 162
Chris@16 163 template <class RealType, class Policy>
Chris@16 164 inline const std::pair<RealType, RealType> range(const pareto_distribution<RealType, Policy>& /*dist*/)
Chris@16 165 { // Range of permissible values for random variable x.
Chris@16 166 using boost::math::tools::max_value;
Chris@16 167 return std::pair<RealType, RealType>(static_cast<RealType>(0), max_value<RealType>()); // scale zero to + infinity.
Chris@16 168 } // range
Chris@16 169
Chris@16 170 template <class RealType, class Policy>
Chris@16 171 inline const std::pair<RealType, RealType> support(const pareto_distribution<RealType, Policy>& dist)
Chris@16 172 { // Range of supported values for random variable x.
Chris@16 173 // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
Chris@16 174 using boost::math::tools::max_value;
Chris@16 175 return std::pair<RealType, RealType>(dist.scale(), max_value<RealType>() ); // scale to + infinity.
Chris@16 176 } // support
Chris@16 177
Chris@16 178 template <class RealType, class Policy>
Chris@16 179 inline RealType pdf(const pareto_distribution<RealType, Policy>& dist, const RealType& x)
Chris@16 180 {
Chris@16 181 BOOST_MATH_STD_USING // for ADL of std function pow.
Chris@16 182 static const char* function = "boost::math::pdf(const pareto_distribution<%1%>&, %1%)";
Chris@16 183 RealType scale = dist.scale();
Chris@16 184 RealType shape = dist.shape();
Chris@16 185 RealType result = 0;
Chris@16 186 if(false == (detail::check_pareto_x(function, x, &result, Policy())
Chris@16 187 && detail::check_pareto(function, scale, shape, &result, Policy())))
Chris@16 188 return result;
Chris@16 189 if (x < scale)
Chris@16 190 { // regardless of shape, pdf is zero (or should be disallow x < scale and throw an exception?).
Chris@16 191 return 0;
Chris@16 192 }
Chris@16 193 result = shape * pow(scale, shape) / pow(x, shape+1);
Chris@16 194 return result;
Chris@16 195 } // pdf
Chris@16 196
Chris@16 197 template <class RealType, class Policy>
Chris@16 198 inline RealType cdf(const pareto_distribution<RealType, Policy>& dist, const RealType& x)
Chris@16 199 {
Chris@16 200 BOOST_MATH_STD_USING // for ADL of std function pow.
Chris@16 201 static const char* function = "boost::math::cdf(const pareto_distribution<%1%>&, %1%)";
Chris@16 202 RealType scale = dist.scale();
Chris@16 203 RealType shape = dist.shape();
Chris@16 204 RealType result = 0;
Chris@16 205
Chris@16 206 if(false == (detail::check_pareto_x(function, x, &result, Policy())
Chris@16 207 && detail::check_pareto(function, scale, shape, &result, Policy())))
Chris@16 208 return result;
Chris@16 209
Chris@16 210 if (x <= scale)
Chris@16 211 { // regardless of shape, cdf is zero.
Chris@16 212 return 0;
Chris@16 213 }
Chris@16 214
Chris@16 215 // result = RealType(1) - pow((scale / x), shape);
Chris@16 216 result = -boost::math::powm1(scale/x, shape, Policy()); // should be more accurate.
Chris@16 217 return result;
Chris@16 218 } // cdf
Chris@16 219
Chris@16 220 template <class RealType, class Policy>
Chris@16 221 inline RealType quantile(const pareto_distribution<RealType, Policy>& dist, const RealType& p)
Chris@16 222 {
Chris@16 223 BOOST_MATH_STD_USING // for ADL of std function pow.
Chris@16 224 static const char* function = "boost::math::quantile(const pareto_distribution<%1%>&, %1%)";
Chris@16 225 RealType result = 0;
Chris@16 226 RealType scale = dist.scale();
Chris@16 227 RealType shape = dist.shape();
Chris@16 228 if(false == (detail::check_probability(function, p, &result, Policy())
Chris@16 229 && detail::check_pareto(function, scale, shape, &result, Policy())))
Chris@16 230 {
Chris@16 231 return result;
Chris@16 232 }
Chris@16 233 if (p == 0)
Chris@16 234 {
Chris@16 235 return scale; // x must be scale (or less).
Chris@16 236 }
Chris@16 237 if (p == 1)
Chris@16 238 {
Chris@101 239 return policies::raise_overflow_error<RealType>(function, 0, Policy()); // x = + infinity.
Chris@16 240 }
Chris@16 241 result = scale /
Chris@16 242 (pow((1 - p), 1 / shape));
Chris@16 243 // K. Krishnamoorthy, ISBN 1-58488-635-8 eq 23.1.3
Chris@16 244 return result;
Chris@16 245 } // quantile
Chris@16 246
Chris@16 247 template <class RealType, class Policy>
Chris@16 248 inline RealType cdf(const complemented2_type<pareto_distribution<RealType, Policy>, RealType>& c)
Chris@16 249 {
Chris@16 250 BOOST_MATH_STD_USING // for ADL of std function pow.
Chris@16 251 static const char* function = "boost::math::cdf(const pareto_distribution<%1%>&, %1%)";
Chris@16 252 RealType result = 0;
Chris@16 253 RealType x = c.param;
Chris@16 254 RealType scale = c.dist.scale();
Chris@16 255 RealType shape = c.dist.shape();
Chris@16 256 if(false == (detail::check_pareto_x(function, x, &result, Policy())
Chris@16 257 && detail::check_pareto(function, scale, shape, &result, Policy())))
Chris@16 258 return result;
Chris@16 259
Chris@16 260 if (x <= scale)
Chris@16 261 { // regardless of shape, cdf is zero, and complement is unity.
Chris@16 262 return 1;
Chris@16 263 }
Chris@16 264 result = pow((scale/x), shape);
Chris@16 265
Chris@16 266 return result;
Chris@16 267 } // cdf complement
Chris@16 268
Chris@16 269 template <class RealType, class Policy>
Chris@16 270 inline RealType quantile(const complemented2_type<pareto_distribution<RealType, Policy>, RealType>& c)
Chris@16 271 {
Chris@16 272 BOOST_MATH_STD_USING // for ADL of std function pow.
Chris@16 273 static const char* function = "boost::math::quantile(const pareto_distribution<%1%>&, %1%)";
Chris@16 274 RealType result = 0;
Chris@16 275 RealType q = c.param;
Chris@16 276 RealType scale = c.dist.scale();
Chris@16 277 RealType shape = c.dist.shape();
Chris@16 278 if(false == (detail::check_probability(function, q, &result, Policy())
Chris@16 279 && detail::check_pareto(function, scale, shape, &result, Policy())))
Chris@16 280 {
Chris@16 281 return result;
Chris@16 282 }
Chris@16 283 if (q == 1)
Chris@16 284 {
Chris@16 285 return scale; // x must be scale (or less).
Chris@16 286 }
Chris@16 287 if (q == 0)
Chris@16 288 {
Chris@101 289 return policies::raise_overflow_error<RealType>(function, 0, Policy()); // x = + infinity.
Chris@16 290 }
Chris@16 291 result = scale / (pow(q, 1 / shape));
Chris@16 292 // K. Krishnamoorthy, ISBN 1-58488-635-8 eq 23.1.3
Chris@16 293 return result;
Chris@16 294 } // quantile complement
Chris@16 295
Chris@16 296 template <class RealType, class Policy>
Chris@16 297 inline RealType mean(const pareto_distribution<RealType, Policy>& dist)
Chris@16 298 {
Chris@16 299 RealType result = 0;
Chris@16 300 static const char* function = "boost::math::mean(const pareto_distribution<%1%>&, %1%)";
Chris@16 301 if(false == detail::check_pareto(function, dist.scale(), dist.shape(), &result, Policy()))
Chris@16 302 {
Chris@16 303 return result;
Chris@16 304 }
Chris@16 305 if (dist.shape() > RealType(1))
Chris@16 306 {
Chris@16 307 return dist.shape() * dist.scale() / (dist.shape() - 1);
Chris@16 308 }
Chris@16 309 else
Chris@16 310 {
Chris@16 311 using boost::math::tools::max_value;
Chris@16 312 return max_value<RealType>(); // +infinity.
Chris@16 313 }
Chris@16 314 } // mean
Chris@16 315
Chris@16 316 template <class RealType, class Policy>
Chris@16 317 inline RealType mode(const pareto_distribution<RealType, Policy>& dist)
Chris@16 318 {
Chris@16 319 return dist.scale();
Chris@16 320 } // mode
Chris@16 321
Chris@16 322 template <class RealType, class Policy>
Chris@16 323 inline RealType median(const pareto_distribution<RealType, Policy>& dist)
Chris@16 324 {
Chris@16 325 RealType result = 0;
Chris@16 326 static const char* function = "boost::math::median(const pareto_distribution<%1%>&, %1%)";
Chris@16 327 if(false == detail::check_pareto(function, dist.scale(), dist.shape(), &result, Policy()))
Chris@16 328 {
Chris@16 329 return result;
Chris@16 330 }
Chris@16 331 BOOST_MATH_STD_USING
Chris@16 332 return dist.scale() * pow(RealType(2), (1/dist.shape()));
Chris@16 333 } // median
Chris@16 334
Chris@16 335 template <class RealType, class Policy>
Chris@16 336 inline RealType variance(const pareto_distribution<RealType, Policy>& dist)
Chris@16 337 {
Chris@16 338 RealType result = 0;
Chris@16 339 RealType scale = dist.scale();
Chris@16 340 RealType shape = dist.shape();
Chris@16 341 static const char* function = "boost::math::variance(const pareto_distribution<%1%>&, %1%)";
Chris@16 342 if(false == detail::check_pareto(function, scale, shape, &result, Policy()))
Chris@16 343 {
Chris@16 344 return result;
Chris@16 345 }
Chris@16 346 if (shape > 2)
Chris@16 347 {
Chris@16 348 result = (scale * scale * shape) /
Chris@16 349 ((shape - 1) * (shape - 1) * (shape - 2));
Chris@16 350 }
Chris@16 351 else
Chris@16 352 {
Chris@16 353 result = policies::raise_domain_error<RealType>(
Chris@16 354 function,
Chris@16 355 "variance is undefined for shape <= 2, but got %1%.", dist.shape(), Policy());
Chris@16 356 }
Chris@16 357 return result;
Chris@16 358 } // variance
Chris@16 359
Chris@16 360 template <class RealType, class Policy>
Chris@16 361 inline RealType skewness(const pareto_distribution<RealType, Policy>& dist)
Chris@16 362 {
Chris@16 363 BOOST_MATH_STD_USING
Chris@16 364 RealType result = 0;
Chris@16 365 RealType shape = dist.shape();
Chris@16 366 static const char* function = "boost::math::pdf(const pareto_distribution<%1%>&, %1%)";
Chris@16 367 if(false == detail::check_pareto(function, dist.scale(), shape, &result, Policy()))
Chris@16 368 {
Chris@16 369 return result;
Chris@16 370 }
Chris@16 371 if (shape > 3)
Chris@16 372 {
Chris@16 373 result = sqrt((shape - 2) / shape) *
Chris@16 374 2 * (shape + 1) /
Chris@16 375 (shape - 3);
Chris@16 376 }
Chris@16 377 else
Chris@16 378 {
Chris@16 379 result = policies::raise_domain_error<RealType>(
Chris@16 380 function,
Chris@16 381 "skewness is undefined for shape <= 3, but got %1%.", dist.shape(), Policy());
Chris@16 382 }
Chris@16 383 return result;
Chris@16 384 } // skewness
Chris@16 385
Chris@16 386 template <class RealType, class Policy>
Chris@16 387 inline RealType kurtosis(const pareto_distribution<RealType, Policy>& dist)
Chris@16 388 {
Chris@16 389 RealType result = 0;
Chris@16 390 RealType shape = dist.shape();
Chris@16 391 static const char* function = "boost::math::pdf(const pareto_distribution<%1%>&, %1%)";
Chris@16 392 if(false == detail::check_pareto(function, dist.scale(), shape, &result, Policy()))
Chris@16 393 {
Chris@16 394 return result;
Chris@16 395 }
Chris@16 396 if (shape > 4)
Chris@16 397 {
Chris@16 398 result = 3 * ((shape - 2) * (3 * shape * shape + shape + 2)) /
Chris@16 399 (shape * (shape - 3) * (shape - 4));
Chris@16 400 }
Chris@16 401 else
Chris@16 402 {
Chris@16 403 result = policies::raise_domain_error<RealType>(
Chris@16 404 function,
Chris@16 405 "kurtosis_excess is undefined for shape <= 4, but got %1%.", shape, Policy());
Chris@16 406 }
Chris@16 407 return result;
Chris@16 408 } // kurtosis
Chris@16 409
Chris@16 410 template <class RealType, class Policy>
Chris@16 411 inline RealType kurtosis_excess(const pareto_distribution<RealType, Policy>& dist)
Chris@16 412 {
Chris@16 413 RealType result = 0;
Chris@16 414 RealType shape = dist.shape();
Chris@16 415 static const char* function = "boost::math::pdf(const pareto_distribution<%1%>&, %1%)";
Chris@16 416 if(false == detail::check_pareto(function, dist.scale(), shape, &result, Policy()))
Chris@16 417 {
Chris@16 418 return result;
Chris@16 419 }
Chris@16 420 if (shape > 4)
Chris@16 421 {
Chris@16 422 result = 6 * ((shape * shape * shape) + (shape * shape) - 6 * shape - 2) /
Chris@16 423 (shape * (shape - 3) * (shape - 4));
Chris@16 424 }
Chris@16 425 else
Chris@16 426 {
Chris@16 427 result = policies::raise_domain_error<RealType>(
Chris@16 428 function,
Chris@16 429 "kurtosis_excess is undefined for shape <= 4, but got %1%.", dist.shape(), Policy());
Chris@16 430 }
Chris@16 431 return result;
Chris@16 432 } // kurtosis_excess
Chris@16 433
Chris@16 434 } // namespace math
Chris@16 435 } // namespace boost
Chris@16 436
Chris@16 437 // This include must be at the end, *after* the accessors
Chris@16 438 // for this distribution have been defined, in order to
Chris@16 439 // keep compilers that support two-phase lookup happy.
Chris@16 440 #include <boost/math/distributions/detail/derived_accessors.hpp>
Chris@16 441
Chris@16 442 #endif // BOOST_STATS_PARETO_HPP
Chris@16 443
Chris@16 444