Multinomial {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 |
n |
number of random vectors to draw. |
size |
integer, say |
prob |
numeric non-negative vector of length |
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,\ldots,X_K=x_k) = C \times \prod_{j=1}^K \pi_j^{x_j}
where C
is the ‘multinomial coefficient’
C = N! / (x_1! \cdots 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,\ldots,K
.
The rmultinom()
algorithm draws binomials from
Bin(n_j,P_j)
sequentially, where
n_1 = N
(N := size
),
P_1 = \pi_1
(\pi
is prob
scaled to sum 1),
and for j \ge 2
, recursively
n_j = N - \sum_{k=1}^{j-1} n_k
and
P_j = \pi_j / (1 - \sum_{k=1}^{j-1} \pi_k)
.
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)