value to evaluate InvCDF
total population size
number of relevant objects in population
number of draws
import mir.test: should; 0.0.hypergeometricInvCDF(40, 15, 20).should == 0; 0.1.hypergeometricInvCDF(40, 15, 20).should == 6; 0.2.hypergeometricInvCDF(40, 15, 20).should == 6; 0.3.hypergeometricInvCDF(40, 15, 20).should == 7; 0.4.hypergeometricInvCDF(40, 15, 20).should == 7; 0.5.hypergeometricInvCDF(40, 15, 20).should == 7; 0.6.hypergeometricInvCDF(40, 15, 20).should == 8; 0.7.hypergeometricInvCDF(40, 15, 20).should == 8; 0.8.hypergeometricInvCDF(40, 15, 20).should == 9; 0.9.hypergeometricInvCDF(40, 15, 20).should == 9; 1.0.hypergeometricInvCDF(40, 15, 20).should == 15;
Alternate algorithms
import mir.test: shouldApprox; import mir.math.common: exp; // Can approximate hypergeometric with binomial distribution 0.5.hypergeometricInvCDF!"approxBinomial"(750_000, 250_000, 50).shouldApprox!double == 17; // Can approximate hypergeometric with poisson distribution 0.4.hypergeometricInvCDF!"approxPoisson"(100_000, 100, 5_000).shouldApprox!double == 4; // Can approximate hypergeometric with normal distribution 0.6.hypergeometricInvCDF!"approxNormal"(10_000, 7_500, 5_000).shouldApprox!double == 3755; // Can approximate hypergeometric with normal distribution 0.6.hypergeometricInvCDF!"approxNormalContinuityCorrection"(10_000, 7_500, 5_000).shouldApprox!double(1) == 3755;
Computes the hypergeometric inverse cumulative distribution function (InvCDF).
Additional algorithms may be provided for calculating InvCDF that allow trading off time and accuracy. If approxPoisson is provided, PoissonAlgo.direct is assumed. This is different from other functions that use PoissonAlgo.gamma since in this case it does not provide the same result.
Setting hypergeometricAlgo = HypergeometricAlgo.direct results in direct summation being used, which can result in significant slowdowns for large values of k.