# 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)