Multinomial {stats} | R Documentation |
The Multinomial Distribution
Description
Generate multinomially distributed random number vectors and compute multinomial probabilities.
Usage
rmultinom(n, size, prob)
dmultinom(x, size = NULL, prob, log = FALSE)
Arguments
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. |
Details
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)
.
Value
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.
Note
dmultinom
is currently not vectorized at all and has
no C interface (API); this may be amended in the future.
See Also
rbinom
which is a special case conceptually.
Examples
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)