Special {base} | R Documentation |
Special mathematical functions related to the beta and gamma functions.
beta(a, b) lbeta(a, b) gamma(x) lgamma(x) psigamma(x, deriv = 0) digamma(x) trigamma(x) choose(n, k) lchoose(n, k) factorial(x) lfactorial(x)
a, b, x |
numeric vectors. |
n, k, deriv |
integer vectors. |
The functions beta
and lbeta
return the beta function
and the natural logarithm of the beta function,
B(a,b) = (Gamma(a)Gamma(b))/(Gamma(a+b)).
The functions gamma
and lgamma
return the gamma function
Γ(x) and the natural logarithm of the absolute value of the
gamma function. factorial(x)
is x! and identical to
gamma(x+1)
and lfactorial
is lgamma(x+1)
.
The functions digamma
and trigamma
return the first and second
derivatives of the logarithm of the gamma function.
psigamma(x, deriv)
(deriv >= 0
) is more generally
computing the deriv
-th derivative of psi(x).
digamma(x)
= psi(x) = d/dx {ln Gamma(x)} = Gamma'(x) / Gamma(x)
The functions choose
and lchoose
return binomial
coefficients and their logarithms.
All the *gamma*
functions are generic: methods can be
defined for them individually or via the Math
group generic.
Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988)
The New S Language.
Wadsworth & Brooks/Cole. (for gamma
and lgamma
.)
Abramowitz, M. and Stegun, I. A. (1972) Handbook of Mathematical Functions. New York: Dover. Chapter 6: Gamma and Related Functions.
Arithmetic
for simple, sqrt
for
miscellaneous mathematical functions and Bessel
for the
real Bessel functions.
choose(5, 2) for (n in 0:10) print(choose(n, k = 0:n)) factorial(100) lfactorial(10000) ## gamma has 1st order poles at 0, -1, -2, ... x <- sort(c(seq(-3,4, length=201), outer(0:-3, (-1:1)*1e-6, "+"))) plot(x, gamma(x), ylim=c(-20,20), col="red", type="l", lwd=2, main=expression(Gamma(x))) abline(h=0, v=-3:0, lty=3, col="midnightblue") x <- seq(.1, 4, length = 201); dx <- diff(x)[1] par(mfrow = c(2, 3)) for (ch in c("", "l","di","tri","tetra","penta")) { is.deriv <- nchar(ch) >= 2 nm <- paste(ch, "gamma", sep = "") if (is.deriv) { dy <- diff(y) / dx # finite difference der <- which(ch == c("di","tri","tetra","penta")) - 1 nm2 <- paste("psigamma(*, deriv = ", der,")",sep='') nm <- if(der >= 2) nm2 else paste(nm, nm2, sep = " ==\n") y <- psigamma(x, deriv=der) } else { y <- get(nm)(x) } plot(x, y, type = "l", main = nm, col = "red") abline(h = 0, col = "lightgray") if (is.deriv) lines(x[-1], dy, col = "blue", lty = 2) }