Multinomial {stats} | R Documentation |
Generate multinomially distributed random number vectors and compute multinomial “density” probabilities.
rmultinom(n, size, prob) dmultinom(x, size = NULL, prob, log = FALSE)
x |
vector of length K of integers in 0:size . |
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 dmultinom , it defaults to sum(x) . |
prob |
numeric non-negative vector of length K, specifying the probability for the K classes; is internally normalized to sum 1. |
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 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) n[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.
rbinom
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)