dgamma-utils | R Documentation |
dgamma()
EtcThe “binomial deviance” function
bd0(x, M) :=
D_0(x,M) := M \cdot d_0(x/M)
,
where d_0(r) := r\log(r) + 1-r
.
Mostly, pure R transcriptions of the C code utility functions for
dgamma()
, dbinom()
, dpois()
, dt()
,
and similar “base” density functions by Catherine Loader.
These have extra arguments with defaults that correspond
to R's Mathlib C code hardwired cutoffs and tolerances.
dpois_raw(x, lambda, log=FALSE,
version,
small.x__lambda = .Machine$double.eps,
## the defaults for version will probably change in the future
bd0.delta = 0.1,
## optional arguments of log1pmx() :
tol_logcf = 1e-14, eps2 = 0.01, minL1 = -0.79149064, trace.lcf = verbose,
logCF = if (is.numeric(x)) logcf else logcfR,
verbose = FALSE)
dpois_simpl (x, lambda, log=FALSE)
dpois_simpl0(x, lambda, log=FALSE)
bd0(x, np,
delta = 0.1, maxit = as.integer(-1100 / log2(delta)),
s0 = .Machine$double.xmin,
verbose = getOption("verbose"))
bd0C(x, np, delta = 0.1, maxit = 1000L, version = "R4.0", verbose = getOption("verbose"))
# "simple" log1pmx() based versions :
bd0_p1l1d1(x, M, tol_logcf = 1e-14, ...)
bd0_p1l1d (x, M, tol_logcf = 1e-14, ...)
bd0_l1pm (x, M, tol_logcf = 1e-14, ...)
ebd0 (x, M, verbose = getOption("verbose"), ...) # experimental, may disappear !!
ebd0C(x, M, verbose = getOption("verbose"))
x |
|
lambda , np , M |
each |
log |
logical indicating if the log-density should be returned,
otherwise the density at |
verbose |
logical indicating if some information about the computations are to be printed. |
small.x__lambda |
positive number; for |
delta , bd0.delta |
a non-negative number |
tol_logcf , eps2 , minL1 , trace.lcf , logCF , ... |
optional tuning arguments passed to |
maxit |
the number of series expansion terms to be used in
|
s0 |
the very small |
version |
a |
bd0()
:Loader's “Binomial Deviance” function; for
x, M > 0
(where the limit x \to 0
is allowed).
In the case of dbinom
, x
are integers (and
M = n p
), but in general x
is real.
bd_0(x,M) := M \cdot D_0\bigl(\frac{x}{M}\bigr),
where
D_0(u) := u \log(u) + 1-u = u(\log(u) - 1) + 1
. Hence
bd_0(x,M) = M \cdot \bigl(\frac{x}{M}(\log(\frac{x}{M}) -1) +1 \bigr) =
x \log(\frac{x}{M}) - x + M.
A different way to rewrite this from Martyn Plummer, notably for important situation when
\left|x-M \right| \ll M
, is using t := (x-M)/M
(and \left|t \right| \ll 1
for that situation),
equivalently, \frac{x}{M} = 1+t
.
Using t
,
bd_0(x,M) = \log(1+t) - t \cdot M = M \cdot [(t+1)(\log(1+t) - 1) + 1]
= M \cdot [(t+1) \log(1+t) - t]
= M \cdot p_1l_1(t),
and
p_1l_1(t) := (t+1)\log(1+t) - t = \frac{t^2}{2} - \frac{t^3}{6} ...
where
the Taylor series expansion is useful for small |t|
.
Note that bd0(x, M)
now also works when x
and/or
M
are arbitrary-accurate mpfr-numbers (package Rmpfr).
bd0C()
interfaces to C code which corresponds to R's C Mathlib (Rmath) bd0()
.
a numeric vector “like” x
; in some cases may also be an
(high accuracy) "mpfr"-number vector, using CRAN package Rmpfr.
ebd0()
(R code) and ebd0C()
(interface to C
code) are experimental, meant to be precision-extended version of
bd0()
, returning (yh, yl)
(high- and low-part of y
,
the numeric result). In order to work for long vectors x
,
yh, yl
need to be list
components; hence we return a
two-column data.frame
with column names "yh"
and
"yl"
.
Martin Maechler
C. Loader (2000), see dbinom
's documentation.
Our package vignette log1pmx, bd0, stirlerr - Probability Computations in R.
stirlerr
for Stirling's error function,
complementing bd0()
for computation of Gamma, Beta, Binomial and Poisson probabilities.
dgamma
,
dpois
.
x <- 800:1200
bd0x1k <- bd0(x, np = 1000)
plot(x, bd0x1k, type="l", ylab = "bd0(x, np=1000)")
bd0x1kC <- bd0C(x, np = 1000)
lines(x, bd0x1kC, col=2)
bd0.1d1 <- bd0_p1l1d1(x, 1000)
bd0.1d <- bd0_p1l1d (x, 1000)
bd0.1pm <- bd0_l1pm (x, 1000)
stopifnot(exprs = {
all.equal(bd0x1kC, bd0x1k, tol=1e-14) # even tol=0 currently ..
all.equal(bd0x1kC, bd0.1d1, tol=1e-14)
all.equal(bd0x1kC, bd0.1d , tol=1e-14)
all.equal(bd0x1kC, bd0.1pm, tol=1e-14)
})
str(log1pmx) ##--> play with { tol_logcf, eps2, minL1, trace.lcf, logCF }
ebd0x1k <- ebd0 (x, 1000)
exC <- ebd0C(x, 1000)
stopifnot(all.equal(exC, ebd0x1k, tol=4e-16))
lines(x, rowSums(ebd0x1k), col=adjustcolor(4, 1/2), lwd=4)
x <- 0:250
dp <- dpois (x, 48, log=TRUE)# R's 'stats' pkg function
dp.r <- dpois_raw(x, 48, log=TRUE)
all.equal(dp, dp.r, tol = 0) # on Linux 64b, see TRUE
stopifnot(all.equal(dp, dp.r, tol = 1e-14))
## dpois_raw() versions:
(vers <- eval(formals(dpois_raw)$version))
mv <- sapply(vers, function(v) dpois_raw(x, 48, version=v))
matplot(x, mv, type="h", log="y", main="dpois_raw(x, 48, version=*)") # "fine"
if(all(mv[,"ebd0_C1"] == mv[,"ebd0_v1"])) {
cat("versions 'ebd0_C1' and 'ebd0_v1' are identical for lambda=48\n")
mv <- mv[, vers != "ebd0_C1"]
}
## now look at *relative* errors -- need "Rmpfr" for "truth"
if(requireNamespace("Rmpfr")) {
dM <- Rmpfr::dpois(Rmpfr::mpfr(x, 256), 48)
asN <- Rmpfr::asNumeric
relE <- asN(mv / dM - 1)
cols <- adjustcolor(1:ncol(mv), 1/2)
mtit <- "relative Errors of dpois_raw(x, 48, version = * )"
matplot(x, relE, type="l", col=cols, lwd=3, lty=1, main=mtit)
legend("topleft", colnames(mv), col=cols, lwd=3, bty="n")
matplot(x, abs(relE), ylim=pmax(1e-18, range(abs(relE))), type="l", log="y",
main=mtit, col=cols, lwd=2, lty=1, yaxt="n")
sfsmisc::eaxis(2)
legend("bottomright", colnames(mv), col=cols, lwd=2, bty="n", ncol=3)
ee <- c(.5, 1, 2)* 2^-52; eC <- quote(epsilon[C])
abline(h=ee, lty=2, col="gray", lwd=c(1,2,1))
axis(4, at=ee[2:3], expression(epsilon[C], 2 * epsilon[C]), col="gray", las=1)
par(new=TRUE)
plot(x, asN(dM), type="h", col=adjustcolor("darkgreen", 1/3), axes=FALSE, ann=FALSE)
stopifnot(abs(relE) < 8e-13) # seen 2.57e-13
}# Rmpfr
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.