dhyperQ {DPQmpfr} | R Documentation |
Exact Hypergeometric Distribution Probabilites
Description
Computes exact probabilities for the hypergeometric distribution
(see, e.g., dhyper()
in R), using package gmp's
big integer and rational numbers, notably chooseZ()
.
Usage
dhyperQ(x, m, n, k)
phyperQ(x, m, n, k, lower.tail=TRUE)
phyperQall(m, n, k, lower.tail=TRUE)
Arguments
x |
the number of white balls drawn without replacement from an urn which contains both black and white balls. |
m |
the number of white balls in the urn. |
n |
the number of black balls in the urn. |
k |
the number of balls drawn from the urn, hence must be in
|
lower.tail |
logical indicating if the lower or upper tail probability should be computed. |
Value
a bigrational (class "bigq"
from package gmp) vector
“as” x
; currently of length one (as all the function
arguments must be “scalar”, currently).
Author(s)
Martin Maechler
See Also
chooseZ
(pkg gmp),
and R's own Hypergeometric
Examples
## dhyperQ() is simply
function (x, m, n, k)
{
stopifnot(k - x == as.integer(k - x))
chooseZ(m, x) * chooseZ(n, k - x) / chooseZ(m + n, k)
}
# a case where phyper(11, 15, 0, 12, log=TRUE) gave 'NaN'
(phyp5.0.12 <- cumsum(dhyperQ(0:12, m=15,n=0,k=12)))
stopifnot(phyp5.0.12 == c(rep(0, 12), 1))
for(x in 0:9)
stopifnot(phyperQ(x, 10,7,8) +
phyperQ(x, 10,7,8, lower.tail=FALSE) == 1)
(ph. <- phyperQall(m=10, n=7, k=8))
## Big Rational ('bigq') object of length 8:
## [1] 1/2431 5/374 569/4862 2039/4862 3803/4862 4685/4862 4853/4862 1
stopifnot(identical(gmp::c_bigq(list(0, ph.)),
1- c(phyperQall(10,7,8, lower.tail=FALSE), 0)))
(doExtras <- DPQmpfr:::doExtras())
if(doExtras) { # too slow for standard testing
k <- 5000
system.time(ph <- phyper(k, 2*k, 2*k, 2*k)) # 0 (< 0.001 sec)
system.time(phQ <- phyperQ(k, 2*k, 2*k, 2*k)) # 5.6 (was 6.3) sec
## Relative error of R's phyper()
stopifnot(print(gmp::asNumeric(1 - ph/phQ)) < 1e-14) # seen 1.063e-15
}
[Package DPQmpfr version 0.3-2 Index]