Multinom {stats} | R Documentation |
Generate multinomially distributed random number vectors and compute multinomial probabilities.
rmultinom(n, size, prob) dmultinom(x, size = NULL, prob, log = FALSE)
x |
vector of length K of integers in |
n |
number of random vectors to draw. |
size |
integer, say N, specifying the total number
of objects that are put into K boxes in the typical multinomial
experiment. For |
prob |
numeric non-negative vector of length K, specifying the probability for the K classes; is internally normalized to sum 1. Infinite and missing values are not allowed. |
log |
logical; if TRUE, log probabilities are computed. |
If x
is a K-component vector, dmultinom(x, prob)
is the probability
P(X[1]=x[1], … , X[K]=x[k]) = C * prod(j=1 , …, K) p[j]^x[j]
where C is the ‘multinomial coefficient’
C = N! / (x[1]! * … * x[K]!)
and N = sum(j=1, …, K) x[j].
By definition, each component X[j] is binomially distributed as
Bin(size, prob[j])
for j = 1, …, K.
The rmultinom()
algorithm draws binomials X[j] from
Bin(n[j], P[j]) sequentially, where
n[1] = N (N := size
),
P[1] = p[1] (p is prob
scaled to sum 1),
and for j ≥ 2, recursively,
n[j] = N - sum(k=1, …, j-1) X[k]
and
P[j] = p[j] / (1 - sum(p[1:(j-1)])).
For rmultinom()
,
an integer K x n matrix where each column is a
random vector generated according to the desired multinomial law, and
hence summing to size
. Whereas the transposed result
would seem more natural at first, the returned matrix is more
efficient because of columnwise storage.
dmultinom
is currently not vectorized at all and has
no C interface (API); this may be amended in the future.
Distributions for standard distributions, including
dbinom
which is a special case conceptually.
rmultinom(10, size = 12, prob = c(0.1,0.2,0.8)) pr <- c(1,3,6,10) # normalization not necessary for generation rmultinom(10, 20, prob = pr) ## all possible outcomes of Multinom(N = 3, K = 3) X <- t(as.matrix(expand.grid(0:3, 0:3))); X <- X[, colSums(X) <= 3] X <- rbind(X, 3:3 - colSums(X)); dimnames(X) <- list(letters[1:3], NULL) X round(apply(X, 2, function(x) dmultinom(x, prob = c(1,2,5))), 3)