blob: 2d49a95b0079e2e41a85a48cbdf8e2ece9d72192 [file] [log] [blame]
# File src/library/stats/R/distn.R
# Part of the R package, https://www.R-project.org
#
# Copyright (C) 1995-2018 The R Core Team
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# A copy of the GNU General Public License is available at
# https://www.R-project.org/Licenses/
dexp <- function(x, rate=1, log = FALSE) .Call(C_dexp, x, 1/rate, log)
pexp <- function(q, rate=1, lower.tail = TRUE, log.p = FALSE)
.Call(C_pexp, q, 1/rate, lower.tail, log.p)
qexp <- function(p, rate=1, lower.tail = TRUE, log.p = FALSE)
.Call(C_qexp, p, 1/rate, lower.tail, log.p)
rexp <- function(n, rate=1) .Call(C_rexp, n, 1/rate)
dunif <- function(x, min=0, max=1, log = FALSE)
.Call(C_dunif, x, min, max, log)
punif <- function(q, min=0, max=1, lower.tail = TRUE, log.p = FALSE)
.Call(C_punif, q, min, max, lower.tail, log.p)
qunif <- function(p, min=0, max=1, lower.tail = TRUE, log.p = FALSE)
.Call(C_qunif, p, min, max, lower.tail, log.p)
runif <- function(n, min=0, max=1) .Call(C_runif, n, min, max)
dnorm <- function(x, mean=0, sd=1, log=FALSE)
.Call(C_dnorm, x, mean, sd, log)
pnorm <- function(q, mean=0, sd=1, lower.tail = TRUE, log.p = FALSE)
.Call(C_pnorm, q, mean, sd, lower.tail, log.p)
qnorm <- function(p, mean=0, sd=1, lower.tail = TRUE, log.p = FALSE)
.Call(C_qnorm, p, mean, sd, lower.tail, log.p)
rnorm <- function(n, mean=0, sd=1) .Call(C_rnorm, n, mean, sd)
dcauchy <- function(x, location=0, scale=1, log = FALSE)
.Call(C_dcauchy, x, location, scale, log)
pcauchy <-
function(q, location=0, scale=1, lower.tail = TRUE, log.p = FALSE)
.Call(C_pcauchy, q, location, scale, lower.tail, log.p)
qcauchy <-
function(p, location=0, scale=1, lower.tail = TRUE, log.p = FALSE)
.Call(C_qcauchy, p, location, scale, lower.tail, log.p)
rcauchy <-
function(n, location=0, scale=1) .Call(C_rcauchy, n, location, scale)
## allow a fuzz of ca 20ulp here.
dgamma <- function(x, shape, rate = 1, scale = 1/rate, log = FALSE)
{
if(!missing(rate) && !missing(scale)) {
if(abs(rate*scale - 1) < 1e-15)
warning("specify 'rate' or 'scale' but not both")
else
stop("specify 'rate' or 'scale' but not both")
}
.Call(C_dgamma, x, shape, scale, log)
}
pgamma <- function(q, shape, rate = 1, scale = 1/rate,
lower.tail = TRUE, log.p = FALSE)
{
if(!missing(rate) && !missing(scale)) {
if(abs(rate*scale - 1) < 1e-15)
warning("specify 'rate' or 'scale' but not both")
else
stop("specify 'rate' or 'scale' but not both")
}
.Call(C_pgamma, q, shape, scale, lower.tail, log.p)
}
qgamma <- function(p, shape, rate = 1, scale = 1/rate,
lower.tail = TRUE, log.p = FALSE)
{
if(!missing(rate) && !missing(scale)) {
if(abs(rate*scale - 1) < 1e-15)
warning("specify 'rate' or 'scale' but not both")
else
stop("specify 'rate' or 'scale' but not both")
}
.Call(C_qgamma, p, shape, scale, lower.tail, log.p)
}
rgamma <- function(n, shape, rate = 1, scale = 1/rate)
{
if(!missing(rate) && !missing(scale)) {
if(abs(rate*scale - 1) < 1e-15)
warning("specify 'rate' or 'scale' but not both")
else
stop("specify 'rate' or 'scale' but not both")
}
.Call(C_rgamma, n, shape, scale)
}
dlnorm <- function(x, meanlog=0, sdlog=1, log=FALSE)
.Call(C_dlnorm, x, meanlog, sdlog, log)
plnorm <- function(q, meanlog=0, sdlog=1, lower.tail = TRUE, log.p = FALSE)
.Call(C_plnorm, q, meanlog, sdlog, lower.tail, log.p)
qlnorm <- function(p, meanlog=0, sdlog=1, lower.tail = TRUE, log.p = FALSE)
.Call(C_qlnorm, p, meanlog, sdlog, lower.tail, log.p)
rlnorm <- function(n, meanlog=0, sdlog=1)
.Call(C_rlnorm, n, meanlog, sdlog)
dlogis <- function(x, location=0, scale=1, log = FALSE)
.Call(C_dlogis, x, location, scale, log)
plogis <- function(q, location=0, scale=1, lower.tail = TRUE, log.p = FALSE)
.Call(C_plogis, q, location, scale, lower.tail, log.p)
qlogis <- function(p, location=0, scale=1, lower.tail = TRUE, log.p = FALSE)
.Call(C_qlogis, p, location, scale, lower.tail, log.p)
rlogis <- function(n, location=0, scale=1)
.Call(C_rlogis, n, location, scale)
dweibull <- function(x, shape, scale=1, log = FALSE)
.Call(C_dweibull, x, shape, scale, log)
pweibull <- function(q, shape, scale=1, lower.tail = TRUE, log.p = FALSE)
.Call(C_pweibull, q, shape, scale, lower.tail, log.p)
qweibull <- function(p, shape, scale=1, lower.tail = TRUE, log.p = FALSE)
.Call(C_qweibull, p, shape, scale, lower.tail, log.p)
rweibull <- function(n, shape, scale=1) .Call(C_rweibull, n, shape, scale)
dbeta <- function(x, shape1, shape2, ncp=0, log = FALSE) {
if(missing(ncp)) .Call(C_dbeta, x, shape1, shape2, log)
else .Call(C_dnbeta, x, shape1, shape2, ncp, log)
}
pbeta <- function(q, shape1, shape2, ncp=0, lower.tail = TRUE, log.p = FALSE) {
if(missing(ncp)) .Call(C_pbeta, q, shape1, shape2, lower.tail, log.p)
else .Call(C_pnbeta, q, shape1, shape2, ncp, lower.tail, log.p)
}
qbeta <- function(p, shape1, shape2, ncp=0, lower.tail = TRUE, log.p = FALSE) {
if(missing(ncp)) .Call(C_qbeta, p, shape1, shape2, lower.tail, log.p)
else .Call(C_qnbeta, p, shape1, shape2, ncp, lower.tail, log.p)
}
rbeta <- function(n, shape1, shape2, ncp = 0) {
if(missing(ncp)) .Call(C_rbeta, n, shape1, shape2)
else {
X <- rchisq(n, 2*shape1, ncp =ncp)
X/(X + rchisq(n, 2*shape2))
}
}
dbinom <- function(x, size, prob, log = FALSE)
.Call(C_dbinom, x, size, prob, log)
pbinom <- function(q, size, prob, lower.tail = TRUE, log.p = FALSE)
.Call(C_pbinom, q, size, prob, lower.tail, log.p)
qbinom <- function(p, size, prob, lower.tail = TRUE, log.p = FALSE)
.Call(C_qbinom, p, size, prob, lower.tail, log.p)
rbinom <- function(n, size, prob) .Call(C_rbinom, n, size, prob)
## Multivariate: that's why there's no C interface (yet) for d...():
dmultinom <- function(x, size = NULL, prob, log = FALSE)
{
K <- length(prob)
if(length(x) != K) stop("x[] and prob[] must be equal length vectors.")
if(any(!is.finite(prob)) || any(prob < 0) || (s <- sum(prob)) == 0)
stop("probabilities must be finite, non-negative and not all 0")
prob <- prob / s
x <- as.integer(x + 0.5)
if(any(x < 0)) stop("'x' must be non-negative")
N <- sum(x)
if(is.null(size)) size <- N
else if (size != N) stop("size != sum(x), i.e. one is wrong")
i0 <- prob == 0
if(any(i0)) {
if(any(x[i0] != 0))
## prob[j] ==0 and x[j] > 0 ==> "impossible" => P = 0
return(if(log)-Inf else 0)
## otherwise : 'all is fine': prob[j]= 0 = x[j] ==> drop j and continue
if(all(i0)) return(if(log)0 else 1)
## else
x <- x[!i0]
prob <- prob[!i0]
}
r <- lgamma(size+1) + sum(x*log(prob) - lgamma(x+1))
if(log) r else exp(r)
}
rmultinom <- function(n, size, prob) .Call(C_rmultinom, n, size, prob)
dchisq <- function(x, df, ncp=0, log = FALSE) {
if(missing(ncp)) .Call(C_dchisq, x, df, log)
else .Call(C_dnchisq, x, df, ncp, log)
}
pchisq <- function(q, df, ncp=0, lower.tail = TRUE, log.p = FALSE) {
if(missing(ncp)) .Call(C_pchisq, q, df, lower.tail, log.p)
else .Call(C_pnchisq, q, df, ncp, lower.tail, log.p)
}
qchisq <- function(p, df, ncp=0, lower.tail = TRUE, log.p = FALSE) {
if(missing(ncp)) .Call(C_qchisq, p, df, lower.tail, log.p)
else .Call(C_qnchisq, p, df, ncp, lower.tail, log.p)
}
rchisq <- function(n, df, ncp=0) {
if(missing(ncp)) .Call(C_rchisq, n, df)
else .Call(C_rnchisq, n, df, ncp)
}
df <- function(x, df1, df2, ncp, log = FALSE) {
if(missing(ncp)) .Call(C_df, x, df1, df2, log)
else .Call(C_dnf, x, df1, df2, ncp, log)
}
pf <- function(q, df1, df2, ncp, lower.tail = TRUE, log.p = FALSE) {
if(missing(ncp)) .Call(C_pf, q, df1, df2, lower.tail, log.p)
else .Call(C_pnf, q, df1, df2, ncp, lower.tail, log.p)
}
qf <- function(p, df1, df2, ncp, lower.tail = TRUE, log.p = FALSE) {
if(missing(ncp)) .Call(C_qf, p, df1, df2, lower.tail, log.p)
else .Call(C_qnf, p, df1, df2, ncp, lower.tail, log.p)
}
rf <- function(n, df1, df2, ncp)
{
if(missing(ncp)) .Call(C_rf, n, df1, df2)
else (rchisq(n, df1, ncp=ncp)/df1)/(rchisq(n, df2)/df2)
}
dgeom <- function(x, prob, log = FALSE) .Call(C_dgeom, x, prob, log)
pgeom <- function(q, prob, lower.tail = TRUE, log.p = FALSE)
.Call(C_pgeom, q, prob, lower.tail, log.p)
qgeom <- function(p, prob, lower.tail = TRUE, log.p = FALSE)
.Call(C_qgeom, p, prob, lower.tail, log.p)
rgeom <- function(n, prob) .Call(C_rgeom, n, prob)
dhyper <- function(x, m, n, k, log = FALSE)
.Call(C_dhyper, x, m, n, k, log)
phyper <- function(q, m, n, k, lower.tail = TRUE, log.p = FALSE)
.Call(C_phyper, q, m, n, k, lower.tail, log.p)
qhyper <- function(p, m, n, k, lower.tail = TRUE, log.p = FALSE)
.Call(C_qhyper, p, m, n, k, lower.tail, log.p)
rhyper <- function(nn, m, n, k) .Call(C_rhyper, nn, m, n, k)
dnbinom <- function(x, size, prob, mu, log = FALSE)
{
if (!missing(mu)) {
if (!missing(prob)) stop("'prob' and 'mu' both specified")
.Call(C_dnbinom_mu, x, size, mu, log)
}
else
.Call(C_dnbinom, x, size, prob, log)
}
pnbinom <- function(q, size, prob, mu, lower.tail = TRUE, log.p = FALSE)
{
if (!missing(mu)) {
if (!missing(prob)) stop("'prob' and 'mu' both specified")
.Call(C_pnbinom_mu, q, size, mu, lower.tail, log.p)
}
else
.Call(C_pnbinom, q, size, prob, lower.tail, log.p)
}
qnbinom <- function(p, size, prob, mu, lower.tail = TRUE, log.p = FALSE)
{
if (!missing(mu)) {
if (!missing(prob)) stop("'prob' and 'mu' both specified")
.Call(C_qnbinom_mu, p, size, mu, lower.tail, log.p)
}
else
.Call(C_qnbinom, p, size, prob, lower.tail, log.p)
}
rnbinom <- function(n, size, prob, mu)
{
if (!missing(mu)) {
if (!missing(prob)) stop("'prob' and 'mu' both specified")
.Call(C_rnbinom_mu, n, size, mu)
} else .Call(C_rnbinom, n, size, prob)
}
dpois <- function(x, lambda, log = FALSE) .Call(C_dpois, x, lambda, log)
ppois <- function(q, lambda, lower.tail = TRUE, log.p = FALSE)
.Call(C_ppois, q, lambda, lower.tail, log.p)
qpois <- function(p, lambda, lower.tail = TRUE, log.p = FALSE)
.Call(C_qpois, p, lambda, lower.tail, log.p)
rpois <- function(n, lambda) .Call(C_rpois, n, lambda)
dt <- function(x, df, ncp, log = FALSE) {
if(missing(ncp)) .Call(C_dt, x, df, log)
else .Call(C_dnt, x, df, ncp, log)
}
pt <- function(q, df, ncp, lower.tail = TRUE, log.p = FALSE) {
if(missing(ncp)) .Call(C_pt, q, df, lower.tail, log.p)
else .Call(C_pnt, q, df, ncp, lower.tail, log.p)
}
qt <- function(p, df, ncp, lower.tail = TRUE, log.p = FALSE) {
if(missing(ncp)) .Call(C_qt, p, df, lower.tail, log.p)
else .Call(C_qnt,p, df, ncp, lower.tail, log.p)
}
rt <- function(n, df, ncp) {
if(missing(ncp)) .Call(C_rt, n, df)
else rnorm(n, ncp)/sqrt(rchisq(n, df)/df)
}
ptukey <- function(q, nmeans, df, nranges=1, lower.tail = TRUE, log.p = FALSE)
.Call(C_ptukey, q, nranges, nmeans, df, lower.tail, log.p)
qtukey <- function(p, nmeans, df, nranges=1, lower.tail = TRUE, log.p = FALSE)
.Call(C_qtukey, p, nranges, nmeans, df, lower.tail, log.p)
dwilcox <- function(x, m, n, log = FALSE)
{
on.exit(.External(C_wilcox_free))
.Call(C_dwilcox, x, m, n, log)
}
pwilcox <- function(q, m, n, lower.tail = TRUE, log.p = FALSE)
{
on.exit(.External(C_wilcox_free))
.Call(C_pwilcox, q, m, n, lower.tail, log.p)
}
qwilcox <- function(p, m, n, lower.tail = TRUE, log.p = FALSE)
{
on.exit(.External(C_wilcox_free))
.Call(C_qwilcox, p, m, n, lower.tail, log.p)
}
rwilcox <- function(nn, m, n) .Call(C_rwilcox, nn, m, n)
dsignrank <- function(x, n, log = FALSE)
{
on.exit(.External(C_signrank_free))
.Call(C_dsignrank, x, n, log)
}
psignrank <- function(q, n, lower.tail = TRUE, log.p = FALSE)
{
on.exit(.External(C_signrank_free))
.Call(C_psignrank, q, n, lower.tail, log.p)
}
qsignrank <- function(p, n, lower.tail = TRUE, log.p = FALSE)
{
on.exit(.External(C_signrank_free))
.Call(C_qsignrank, p, n, lower.tail, log.p)
}
rsignrank <- function(nn, n) .Call(C_rsignrank, nn, n)
##' Random sample from a Wishart distribution
rWishart <- function(n, df, Sigma) .Call(C_rWishart, n, df, Sigma)