[section:nmp Non-Member Properties]

Properties that are common to all distributions are accessed via non-member 
getter functions: non-membership allows more of these functions to be added over time,
as the need arises.  Unfortunately the literature uses many different and
confusing names to refer to a rather small number of actual concepts; refer
to the [link concept_index concept index] to find the property you 
want by the name you are most familiar with. 
Or use the [link function_index function index]
to go straight to the function you want if you already know its name.

[h4 [#function_index]Function Index]

* [link math.dist.cdf cdf].
* [link math.dist.ccdf cdf complement].
* [link math.dist.chf chf].
* [link math.dist.hazard hazard].
* __kurtosis.
* __kurtosis_excess
* __mean.
* [link math.dist.median median].
* __mode.
* [link math.dist.pdf pdf].
* [link math.dist.range range].
* [link math.dist.quantile quantile].
* [link math.dist.quantile_c quantile from the complement].
* __skewness.
* [link math.dist.sd standard_deviation].
* [link math.dist.support support].
* __variance.

[h4 [#concept_index]Conceptual Index]

* __ccdf.
* __cdf.
* __chf.
* [link cdf_inv Inverse Cumulative Distribution Function].
* [link survival_inv Inverse Survival Function].
* __hazard
* [link lower_critical Lower Critical Value].
* __kurtosis.
* __kurtosis_excess
* __mean.
* [link math.dist.median median].
* __mode.
* [link cdfPQ P].
* [link percent Percent Point Function].
* __pdf.
* [link pmf Probability Mass Function].
* [link math.dist.range range].
* [link cdfPQ Q].
* __quantile.
* [link math.dist.quantile_c Quantile from the complement of the probability].
* __skewness.
* __sd
* [link survival Survival Function].
* [link math.dist.support support].
* [link upper_critical Upper Critical Value].
* __variance.

[h4 [#math.dist.cdf]Cumulative Distribution Function]

   template <class RealType, class ``__Policy``>
   RealType cdf(const ``['Distribution-Type]``<RealType, ``__Policy``>& dist, const RealType& x);
   
The __cdf is the probability that 
the variable takes a value less than or equal to x.  It is equivalent
to the integral from -infinity to x of the __pdf.

This function may return a __domain_error if the random variable is outside
the defined range for the distribution.

For example, the following graph shows the cdf for the
normal distribution:

[$../graphs/cdf.png]

[h4 [#math.dist.ccdf]Complement of the Cumulative Distribution Function]

   template <class Distribution, class RealType>
   RealType cdf(const ``['Unspecified-Complement-Type]``<Distribution, RealType>& comp);
   
The complement of the __cdf 
is the probability that 
the variable takes a value greater than x.  It is equivalent
to the integral from x to infinity of the __pdf, or 1 minus the __cdf of x. 

This is also known as the survival function.

This function may return a __domain_error if the random variable is outside
the defined range for the distribution.

In this library, it is obtained by wrapping the arguments to the `cdf`
function in a call to `complement`, for example:

   // standard normal distribution object:
   boost::math::normal norm;
   // print survival function for x=2.0:
   std::cout << cdf(complement(norm, 2.0)) << std::endl;

For example, the following graph shows the __complement of the cdf for the
normal distribution:

[$../graphs/survival.png]

See __why_complements for why the complement is useful and when it should be used.

[h4 [#math.dist.hazard]Hazard Function]

   template <class RealType, class ``__Policy``>
   RealType hazard(const ``['Distribution-Type]``<RealType, ``__Policy``>& dist, const RealType& x);

Returns the __hazard of /x/ and distibution /dist/.

This function may return a __domain_error if the random variable is outside
the defined range for the distribution.

[equation hazard]

[caution
Some authors refer to this as the conditional failure 
density function rather than the hazard function.]

[h4 [#math.dist.chf]Cumulative Hazard Function]

   template <class RealType, class ``__Policy``>
   RealType chf(const ``['Distribution-Type]``<RealType, ``__Policy``>& dist, const RealType& x);

Returns the __chf of /x/ and distibution /dist/.

This function may return a __domain_error if the random variable is outside
the defined range for the distribution.

[equation chf]

[caution 
Some authors refer to this as simply the "Hazard Function".]

[h4 [#math.dist.mean]mean]

   template<class RealType, class ``__Policy``>
   RealType mean(const ``['Distribution-Type]``<RealType, ``__Policy``>& dist);
   
Returns the mean of the distribution /dist/.

This function may return a __domain_error if the distribution does not have
a defined mean (for example the Cauchy distribution).

[h4 [#math.dist.median]median]

   template<class RealType, class ``__Policy``>
   RealType median(const ``['Distribution-Type]``<RealType, ``__Policy``>& dist);
   
Returns the median of the distribution /dist/.

[h4 [#math.dist.mode]mode]

   template<class RealType, ``__Policy``>
   RealType mode(const ``['Distribution-Type]``<RealType, ``__Policy``>& dist);
   
Returns the mode of the distribution /dist/.

This function may return a __domain_error if the distribution does not have
a defined mode.

[h4 [#math.dist.pdf]Probability Density Function]

   template <class RealType, class ``__Policy``>
   RealType pdf(const ``['Distribution-Type]``<RealType, ``__Policy``>& dist, const RealType& x);
   
For a continuous function, the probability density function (pdf) returns 
the probability that the variate has the value x. 
Since for continuous distributions the probability at a single point is actually zero, 
the probability is better expressed as the integral of the pdf between two points:
see the __cdf.

For a discrete distribution, the pdf is the probability that the 
variate takes the value x.

This function may return a __domain_error if the random variable is outside
the defined range for the distribution.

For example, for a standard normal distribution the pdf looks like this:

[$../graphs/pdf.png]

[h4 [#math.dist.range]Range]

   template<class RealType, class ``__Policy``>
   std::pair<RealType, RealType> range(const ``['Distribution-Type]``<RealType, ``__Policy``>& dist);
   
Returns the valid range of the random variable over distribution /dist/.

[h4 [#math.dist.quantile]Quantile]

   template <class RealType, class ``__Policy``>
   RealType quantile(const ``['Distribution-Type]``<RealType, ``__Policy``>& dist, const RealType& p);
   
The quantile is best viewed as the inverse of the __cdf, it returns
a value /x/ such that `cdf(dist, x) == p`.

This is also known as the /percent point function/, or a /percentile/, it is
also the same as calculating the ['lower critical value] of a distribution.

This function returns a __domain_error if the probability lies outside [0,1].
The function may return an __overflow_error if there is no finite value
that has the specified probability.

The following graph shows the quantile function for a standard normal
distribution:

[$../graphs/quantile.png]

[h4 [#math.dist.quantile_c]Quantile from the complement of the probability.]
[link complements complements]


   template <class Distribution, class RealType>
   RealType quantile(const ``['Unspecified-Complement-Type]``<Distribution, RealType>& comp);
   
This is the inverse of the __ccdf.  It is calculated by wrapping
the arguments in a call to the quantile function in a call to
/complement/.  For example:

   // define a standard normal distribution:
   boost::math::normal norm;
   // print the value of x for which the complement
   // of the probability is 0.05:
   std::cout << quantile(complement(norm, 0.05)) << std::endl;

The function computes a value /x/ such that
`cdf(complement(dist, x)) == q` where /q/ is complement of the
probability.

[link why_complements Why complements?]

This function is also called the inverse survival function, and is the
same as calculating the ['upper critical value] of a distribution.

This function returns a __domain_error if the probablity lies outside [0,1].
The function may return an __overflow_error if there is no finite value
that has the specified probability.

The following graph show the inverse survival function for the normal
distribution:

[$../graphs/survival_inv.png]

[h4 [#math.dist.sd]Standard Deviation]

   template <class RealType, class ``__Policy``>
   RealType standard_deviation(const ``['Distribution-Type]``<RealType, ``__Policy``>& dist);
   
Returns the standard deviation of distribution /dist/.   

This function may return a __domain_error if the distribution does not have
a defined standard deviation.

[h4 [#math.dist.support]support]

   template<class RealType, class ``__Policy``>
   std::pair<RealType, RealType> support(const ``['Distribution-Type]``<RealType, ``__Policy``>& dist);
   
Returns the supported range of random variable over the distribution /dist/.

The distribution is said to be 'supported' over a range that is
[@http://en.wikipedia.org/wiki/Probability_distribution
 "the smallest closed set whose complement has probability zero"].
Non-mathematicians might say it means the 'interesting' smallest range
of random variate x that has the cdf going from zero to unity.
Outside are uninteresting zones where the pdf is zero, and the cdf zero or unity.

[h4 [#math.dist.variance]Variance]

   template <class RealType, class ``__Policy``>
   RealType variance(const ``['Distribution-Type]``<RealType, ``__Policy``>& dist);
   
Returns the variance of the distribution /dist/.

This function may return a __domain_error if the distribution does not have
a defined variance.

[h4 [#math.dist.skewness]Skewness]

   template <class RealType, class ``__Policy``>
   RealType skewness(const ``['Distribution-Type]``<RealType, ``__Policy``>& dist);
   
Returns the skewness of the distribution /dist/.

This function may return a __domain_error if the distribution does not have
a defined skewness.

[h4 [#math.dist.kurtosis]Kurtosis]

   template <class RealType, class ``__Policy``>
   RealType kurtosis(const ``['Distribution-Type]``<RealType, ``__Policy``>& dist);
   
Returns the 'proper' kurtosis (normalized fourth moment) of the distribution /dist/.

kertosis = [beta][sub 2][space]= [mu][sub 4][space] / [mu][sub 2][super 2]

Where [mu][sub i][space] is the i'th central moment of the distribution, and
in particular [mu][sub 2][space] is the variance of the distribution.

The kurtosis is a measure of the "peakedness" of a distribution.

Note that the literature definition of kurtosis is confusing.
The definition used here is that used by for example
[@http://mathworld.wolfram.com/Kurtosis.html Wolfram MathWorld]
(that includes a table of formulae for kurtosis excess for various distributions)
but NOT the definition of
[@http://en.wikipedia.org/wiki/Kurtosis kurtosis used by Wikipedia]
which treats "kurtosis" and "kurtosis excess" as the same quantity.

  kurtosis_excess = 'proper' kurtosis - 3

This subtraction of 3 is convenient so that the ['kurtosis excess]
of a normal distribution is zero.

This function may return a __domain_error if the distribution does not have
a defined kurtosis.

'Proper' kurtosis can have a value from zero to + infinity.

[h4 [#math.dist.kurtosis_excess]Kurtosis excess]

   template <class RealType, ``__Policy``>
   RealType kurtosis_excess(const ``['Distribution-Type]``<RealType, ``__Policy``>& dist);
   
Returns the kurtosis excess of the distribution /dist/.

kurtosis excess = [gamma][sub 2][space]= [mu][sub 4][space] / [mu][sub 2][super 2][space]- 3 = kurtosis - 3

Where [mu][sub i][space] is the i'th central moment of the distribution, and
in particular [mu][sub 2][space] is the variance of the distribution.

The kurtosis excess is a measure of the "peakedness" of a distribution, and 
is more widely used than the "kurtosis proper".  It is defined so that
the kurtosis excess of a normal distribution is zero.

This function may return a __domain_error if the distribution does not have
a defined kurtosis excess.

Kurtosis excess can have a value from -2 to + infinity.

  kurtosis = kurtosis_excess +3;
  
The kurtosis excess of a normal distribution is zero.

[h4 [#cdfPQ]P and Q]

The terms P and Q are sometimes used to refer to the __cdf
and its [link math.dist.ccdf complement] respectively.
Lowercase p and q are sometimes used to refer to the values returned
by these functions.

[h4 [#percent]Percent Point Function]

The percent point function, also known as the percentile, is the same as
the __quantile.

[h4 [#cdf_inv]Inverse CDF Function.]

The inverse of the cumulative distribution function, is the same as the 
__quantile.

[h4 [#survival_inv]Inverse Survival Function.]

The inverse of the survival function, is the same as computing the 
[link math.dist.quantile_c quantile
from the complement of the probability].

[h4 [#pmf]Probability Mass Function]

The Probability Mass Function is the same as the __pdf.

The term Mass Function is usually applied to discrete distributions,
while the term __pdf applies to continuous distributions.

[h4 [#lower_critical]Lower Critical Value.]

The lower critical value calculates the value of the random variable
given the area under the left tail of the distribution.  
It is equivalent to calculating the __quantile.

[h4 [#upper_critical]Upper Critical Value.]

The upper critical value calculates the value of the random variable
given the area under the right tail of the distribution.  It is equivalent to 
calculating the [link math.dist.quantile_c quantile from the complement of the
probability].

[h4 [#survival]Survival Function]

Refer to the __ccdf.

[endsect][/section:nmp Non-Member Properties]


[/ non_members.qbk
  Copyright 2006 John Maddock and Paul A. Bristow.
  Distributed under the Boost Software License, Version 1.0.
  (See accompanying file LICENSE_1_0.txt or copy at
  http://www.boost.org/LICENSE_1_0.txt).
]

