Copyright | (c) 2009 Bryan O'Sullivan |
---|---|
License | BSD3 |
Maintainer | bos@serpentine.com |
Stability | experimental |
Portability | portable |
Safe Haskell | None |
Language | Haskell98 |
Type classes for probability distributions
- class Distribution d where
- class Distribution d => DiscreteDistr d where
- class Distribution d => ContDistr d where
- class Distribution d => MaybeMean d where
- class MaybeMean d => Mean d where
- class MaybeMean d => MaybeVariance d where
- class (Mean d, MaybeVariance d) => Variance d where
- class Distribution d => MaybeEntropy d where
- class MaybeEntropy d => Entropy d where
- class Distribution d => ContGen d where
- class (DiscreteDistr d, ContGen d) => DiscreteGen d where
- genContinous :: (ContDistr d, PrimMonad m) => d -> Gen (PrimState m) -> m Double
- findRoot :: ContDistr d => d -> Double -> Double -> Double -> Double -> Double
- sumProbabilities :: DiscreteDistr d => d -> Int -> Int -> Double
Type classes
class Distribution d where #
Type class common to all distributions. Only c.d.f. could be defined for both discrete and continous distributions.
cumulative :: d -> Double -> Double #
Cumulative distribution function. The probability that a random variable X is less or equal than x, i.e. P(X≤x). Cumulative should be defined for infinities as well:
cumulative d +∞ = 1 cumulative d -∞ = 0
complCumulative :: d -> Double -> Double #
One's complement of cumulative distibution:
complCumulative d x = 1 - cumulative d x
It's useful when one is interested in P(X>x) and expression on the right side begin to lose precision. This function have default implementation but implementors are encouraged to provide more precise implementation.
class Distribution d => DiscreteDistr d where #
Discrete probability distribution.
probability :: d -> Int -> Double #
Probability of n-th outcome.
logProbability :: d -> Int -> Double #
Logarithm of probability of n-th outcome
class Distribution d => ContDistr d where #
Continuous probability distributuion.
Minimal complete definition is quantile
and either density
or
logDensity
.
density :: d -> Double -> Double #
Probability density function. Probability that random variable X lies in the infinitesimal interval [x,x+δx) equal to density(x)⋅δx
quantile :: d -> Double -> Double #
Inverse of the cumulative distribution function. The value
x for which P(X≤x) = p. If probability is outside
of [0,1] range function should call error
logDensity :: d -> Double -> Double #
Natural logarithm of density.
Distribution statistics
class Distribution d => MaybeMean d where #
Type class for distributions with mean. maybeMean
should return
Nothing
if it's undefined for current value of data
class MaybeMean d => Mean d where #
Type class for distributions with mean. If distribution have finite mean for all valid values of parameters it should be instance of this type class.
class MaybeMean d => MaybeVariance d where #
Type class for distributions with variance. If variance is
undefined for some parameter values both maybeVariance
and
maybeStdDev
should return Nothing.
Minimal complete definition is maybeVariance
or maybeStdDev
maybeVariance :: d -> Maybe Double #
maybeStdDev :: d -> Maybe Double #
class (Mean d, MaybeVariance d) => Variance d where #
Type class for distributions with variance. If distibution have finite variance for all valid parameter values it should be instance of this type class.
class Distribution d => MaybeEntropy d where #
Type class for distributions with entropy, meaning Shannon entropy
in the case of a discrete distribution, or differential entropy in the
case of a continuous one. maybeEntropy
should return Nothing
if
entropy is undefined for the chosen parameter values.
maybeEntropy :: d -> Maybe Double #
Returns the entropy of a distribution, in nats, if such is defined.
class MaybeEntropy d => Entropy d where #
Type class for distributions with entropy, meaning Shannon entropy in the case of a discrete distribution, or differential entropy in the case of a continuous one. If the distribution has well-defined entropy for all valid parameter values then it should be an instance of this type class.
Random number generation
class Distribution d => ContGen d where #
Generate discrete random variates which have given distribution.
class (DiscreteDistr d, ContGen d) => DiscreteGen d where #
Generate discrete random variates which have given
distribution. ContGen
is superclass because it's always possible
to generate real-valued variates from integer values
genContinous :: (ContDistr d, PrimMonad m) => d -> Gen (PrimState m) -> m Double #
Generate variates from continous distribution using inverse transform rule.
Helper functions
:: ContDistr d | |
=> d | Distribution |
-> Double | Probability p |
-> Double | Initial guess |
-> Double | Lower bound on interval |
-> Double | Upper bound on interval |
-> Double |
Approximate the value of X for which P(x>X)=p.
This method uses a combination of Newton-Raphson iteration and bisection with the given guess as a starting point. The upper and lower bounds specify the interval in which the probability distribution reaches the value p.
sumProbabilities :: DiscreteDistr d => d -> Int -> Int -> Double #
Sum probabilities in inclusive interval.