Learn R Programming

extraDistr (version 1.10.0)

BetaNegBinom: Beta-negative binomial distribution

Description

Probability mass function and random generation for the beta-negative binomial distribution.

Usage

dbnbinom(x, size, alpha = 1, beta = 1, log = FALSE)

pbnbinom(q, size, alpha = 1, beta = 1, lower.tail = TRUE, log.p = FALSE)

rbnbinom(n, size, alpha = 1, beta = 1)

Arguments

x, q

vector of quantiles.

size

number of trials (zero or more). Must be strictly positive, need not be integer.

alpha, beta

non-negative parameters of the beta distribution.

log, log.p

logical; if TRUE, probabilities p are given as log(p).

lower.tail

logical; if TRUE (default), probabilities are \(P[X \le x]\) otherwise, \(P[X > x]\).

n

number of observations. If length(n) > 1, the length is taken to be the number required.

Details

If \(p \sim \mathrm{Beta}(\alpha, \beta)\) and \(X \sim \mathrm{NegBinomial}(r, p)\), then \(X \sim \mathrm{BetaNegBinomial}(r, \alpha, \beta)\).

Probability mass function $$ f(x) = \frac{\Gamma(r+x)}{x! \,\Gamma(r)} \frac{\mathrm{B}(\alpha+r, \beta+x)}{\mathrm{B}(\alpha, \beta)} $$

Cumulative distribution function is calculated using recursive algorithm that employs the fact that \(\Gamma(x) = (x - 1)!\) and \( \mathrm{B}(x, y) = \frac{\Gamma(x)\Gamma(y)}{\Gamma(x+y)} \). This enables re-writing probability mass function as

$$ f(x) = \frac{(r+x-1)!}{x! \, \Gamma(r)} \frac{\frac{(\alpha+r-1)!\,(\beta+x-1)!}{(\alpha+\beta+r+x-1)!}}{\mathrm{B}(\alpha,\beta)} $$

what makes recursive updating from \(x\) to \(x+1\) easy using the properties of factorials

$$ f(x+1) = \frac{(r+x-1)!\,(r+x)}{x!\,(x+1) \, \Gamma(r)} \frac{\frac{(\alpha+r-1)!\,(\beta+x-1)!\,(\beta+x)}{(\alpha+\beta+r+x-1)!\,(\alpha+\beta+r+x)}}{\mathrm{B}(\alpha,\beta)} $$

and let's us efficiently calculate cumulative distribution function as a sum of probability mass functions

$$F(x) = \sum_{k=0}^x f(k)$$

See Also

Examples

Run this code

x <- rbnbinom(1e5, 1000, 5, 13)
xx <- 0:1e5
hist(x, 100, freq = FALSE)
lines(xx-0.5, dbnbinom(xx, 1000, 5, 13), col = "red")
hist(pbnbinom(x, 1000, 5, 13))
xx <- seq(0, 1e5, by = 0.1)
plot(ecdf(x))
lines(xx, pbnbinom(xx, 1000, 5, 13), col = "red", lwd = 2)

Run the code above in your browser using DataLab