The OpenD Programming Language

hypergeometricPMF

Computes the hypergeometric probability mass function (PMF).

Additional algorithms may be provided for calculating PMF that allow trading off time and accuracy. If approxPoisson is provided, PoissonAlgo.gamma is assumed.

  1. T hypergeometricPMF(size_t k, size_t N, size_t K, size_t n)
    @safe pure @nogc nothrow
    T
    hypergeometricPMF
    (
    const size_t k
    ,
    const size_t N
    ,
    const size_t K
    ,
    const size_t n
    )
    if (
    isFloatingPoint!T
    )
  2. template hypergeometricPMF(HypergeometricAlgo hypergeometricAlgo = HypergeometricAlgo.direct)
  3. template hypergeometricPMF(T, string hypergeometricAlgo)
  4. template hypergeometricPMF(string hypergeometricAlgo)

Parameters

k size_t

value to evaluate PMF (e.g. number of correct draws of object of interest)

N size_t

total population size

K size_t

number of relevant objects in population

n size_t

number of draws

Examples

import mir.test: shouldApprox;

0.hypergeometricPMF(7, 4, 3).shouldApprox == 0.02857143;
1.hypergeometricPMF(7, 4, 3).shouldApprox == 0.3428571;
2.hypergeometricPMF(7, 4, 3).shouldApprox == 0.5142857;
3.hypergeometricPMF(7, 4, 3).shouldApprox == 0.1142857;

// can also provide a template argument to change output type
static assert(is(typeof(hypergeometricPMF!float(3, 7, 4, 3)) == float));

Alternate algorithms

import mir.test: shouldApprox;
import mir.math.common: exp;

// Can approximate hypergeometric with binomial distribution
20.hypergeometricPMF!"approxBinomial"(750_000, 250_000, 50).shouldApprox == exp(hypergeometricLPMF(20, 750_000, 250_000, 50));
// Can approximate hypergeometric with poisson distribution
20.hypergeometricPMF!"approxPoisson"(100_000, 100, 5_000).shouldApprox == exp(hypergeometricLPMF(20, 100_000, 100, 5_000));
// Can approximate hypergeometric with normal distribution
3_500.hypergeometricPMF!"approxNormal"(10_000, 7_500, 5_000).shouldApprox == exp(hypergeometricLPMF(3_500, 10_000, 7_500, 5_000));
// Can approximate hypergeometric with normal distribution (with continuity correction)
3_500.hypergeometricPMF!"approxNormalContinuityCorrection"(10_000, 7_500, 5_000).shouldApprox == exp(hypergeometricLPMF(3_500, 10_000, 7_500, 5_000));

See Also

Meta