Multinomial Distribution - The distributions for non-binary,
categorical outcomes
The multinomial distribution is like the binomial distribution, but
instead of 2 outcomes, it has a total of \(I\) outcomes:
\[P(Y_1 = y_1, Y_2 = y_2, ..., Y_I = y_i)
= n!\prod_{i=1}^I \frac{\pi_i^{y_i}}{y_i!} =
\frac{n!}{y_1! y_2! ... y_I!} \pi_1^{y_1}\pi_2^{y_2}...\pi_I^{y_I}
\]
Unlike the binomial distribution, there are just 2 functions:
dbinom = \(P(Y_1 = a, Y_2
= b, ...)\)
rmultinom for generating a random sample of
multinomial data
1) dmultinom()
dmultinom() has 2 arguments
x = which has to be a vector with length equal to the
number of different outcomes
- If it is a trinomial (ie poor/moderate/good),
x needs
to be a vector with 3 numbers:
- the number of poor results in the sample
- the number of moderate results in the sample
- the number of good results in the sample
prob = the vector of probabilities that an observation
falls into that category
- trinomial with \(\{p_1, p_2, p_3\} =
\{0.2, 0.5, 0.3\}\)
- Make sure that the vector of probabilities sums to 1, or R will
force it to sum to 1!
It has an size = argument, but it will calculate \(N\) to be the sum of the elements in
x so you shouldn’t use it!
Let’s say from a random sample of 20, there were 4 bad, 11 moderate,
and 5 good
# Done correctly since prob sums to 1:
dmultinom(x = c( 4, 11, 5),
prob = c(0.20, 0.50, 0.30))
## [1] 0.04017656
# Done incorrectly: prob = c(0.2, 0.4, 0.3)
dmultinom(x = c( 4, 11, 5),
prob = c(0.20, 0.40, 0.30))
## [1] 0.02838653
If the prob vector doesn’t sum to 1, it will “normalize”
the vector (aka, force it to sum to 1):
\[\left\{ \frac{p_1}{p_1 + p_2 + p_3},
\frac{p_2}{p_1 + p_2 + p_3}, \frac{p_3}{p_1 + p_2 +
p_3} \right\}\]
2) rmultinom()
rmultinom() has 3 arguments
n =: Scalar - how many random vectors to
create
size =: Scalar - the total number of trials
prob =: Vector - the vector of probabilities for
each outcome
Let’s create 10 random vectors with 20 trials each for 4 groups of
equal probability \(\pi_i = 0.25\)
rmultinom(n = 10,size = 20, prob = rep(x = 0.25, times = 4))
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,] 10 4 6 6 6 5 7 5 6 4
## [2,] 4 3 3 4 5 7 10 8 6 7
## [3,] 3 4 6 5 4 3 3 4 5 4
## [4,] 3 9 5 5 5 5 0 3 3 5
# by default, it creates a column for each random multinomial result
# If you want the rows named to their corresponding groups (say g1 to g4), you can do so in prob =
rmultinom(n = 10,
size = 20,
prob = c(g1 = 0.25,
g2 = 0.25,
g3 = 0.25,
g4 = 0.25))
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## g1 5 4 6 7 5 3 5 6 5 3
## g2 4 1 6 7 6 9 8 3 4 5
## g3 8 9 3 2 4 4 4 7 5 7
## g4 3 6 5 4 5 4 3 4 6 5
# It's often more convenient to have each new sample in a row rather than a column. We can use t() to transpose the results:
rmultinom(n = 10,
size = 20,
prob = c(g1 = 0.25,
g2 = 0.25,
g3 = 0.25,
g4 = 0.25)) |>
t() |>
data.frame() |>
mutate(trial = row_number(),
.before = g1)
## trial g1 g2 g3 g4
## 1 1 5 6 3 6
## 2 2 6 3 6 5
## 3 3 6 8 2 4
## 4 4 9 1 3 7
## 5 5 4 5 4 7
## 6 6 3 8 4 5
## 7 7 3 5 5 7
## 8 8 2 3 6 9
## 9 9 5 4 7 4
## 10 10 5 6 3 6
LS0tDQp0aXRsZTogIk11bHRpbm9taWFsIERpc3RyaWJ1dGlvbiBpbiBSIg0KYXV0aG9yOiAiQ2hhcHRlciAxOiBQcm9iYWJpbGl0eSBEaXN0cmlidXRpb25zIg0KZGF0ZTogIlNUQSA0NTA0Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGZpZ193aWR0aDogNg0KICAgIGZpZ19oZWlnaHQ6IDYNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiBubw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHllcw0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCB3YXJuaW5nID0gRiwgbWVzc2FnZSA9IEYsIGZpZy5hbGlnbiA9ICdjZW50ZXInKQ0KcGFjbWFuOjpwX2xvYWQodGlkeXZlcnNlKQ0KYGBgDQoNCg0KIyMgSW5pdGlhbCBEZXNjcmlwdGlvbjogRm91ciBEaXN0cmlidXRpb24gTGV0dGVycw0KDQpUaGUgZGlmZmVyZW50IHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbiBmdW5jdGlvbnMgYWxsIHN0YXJ0IHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgNCBsZXR0ZXJzOg0KDQoxKSBkICRccmlnaHRhcnJvdyQgZGVuc2l0eTogRmluZCB0aGUgcHJvYmFiaWxpdHkgZm9yIGEgc3BlY2lmaWMgdmFsdWUgICRQKFk9YSkkDQoNCjIpIHAgJFxyaWdodGFycm93JCBGaW5kIHRoZSBwcm9iYWJpbGl0eSBmb3IgdGhlIHNwZWNpZmljIHZhbHVlIGFuZCBhbGwgdmFsdWVzIGxlc3MgdGhhbiBpdCAoYWthLCBjdW11bGF0aXZlIHByb2JhYmlsaXR5KTogJFAoWSBcbGUgYSkkDQoNCjMpIHEgJFxyaWdodGFycm93JCBxdWFudGlsZTogRmluZHMgdGhlIHNtYWxsZXN0IHZhbHVlIG9mIHRoZSByYW5kb20gdmFyaWFibGUsICRhJCwgc28gdGhhdCAkUChZIFxsZSBhKSBcZ2UgcCQNCiAgLSBJdCdzIGJhc2ljYWxseSBwIGluIHJldmVyc2U6IElmIHdlIGtub3cgdGhlIHByb2JhYmlsaXR5LCB3aGF0IGlzIHRoZSB2YWx1ZSBvZiB0aGUgcmFuZG9tIHZhcmlhYmxlPw0KDQo0KSByICRccmlnaHRhcnJvdyQgZ2VuZXJhdGUgYSB2YWx1ZSBvZiB0aGUgcmFuZG9tIHZhcmlhYmxlIFkgZ2l2ZW4gdGhlIHBhcmFtZXRlcnMNCg0KDQoNCiMjIE11bHRpbm9taWFsIERpc3RyaWJ1dGlvbiAtIFRoZSBkaXN0cmlidXRpb25zIGZvciBub24tYmluYXJ5LCBjYXRlZ29yaWNhbCBvdXRjb21lcw0KDQpUaGUgbXVsdGlub21pYWwgZGlzdHJpYnV0aW9uIGlzIGxpa2UgdGhlIGJpbm9taWFsIGRpc3RyaWJ1dGlvbiwgYnV0IGluc3RlYWQgb2YgMiBvdXRjb21lcywgaXQgaGFzIGEgdG90YWwgb2YgJEkkIG91dGNvbWVzOg0KDQokJFAoWV8xID0geV8xLCBZXzIgPSB5XzIsIC4uLiwgWV9JID0geV9pKSA9IG4hXHByb2Rfe2k9MX1eSSBcZnJhY3tccGlfaV57eV9pfX17eV9pIX0gPSANClxmcmFje24hfXt5XzEhIHlfMiEgLi4uIHlfSSF9IFxwaV8xXnt5XzF9XHBpXzJee3lfMn0uLi5ccGlfSV57eV9JfQ0KJCQNCg0KVW5saWtlIHRoZSBiaW5vbWlhbCBkaXN0cmlidXRpb24sIHRoZXJlIGFyZSBqdXN0IDIgZnVuY3Rpb25zOiANCg0KMSkgYGRiaW5vbSA9IGAgJFAoWV8xID0gYSwgWV8yID0gYiwgLi4uKSQNCg0KMikgYHJtdWx0aW5vbWAgZm9yIGdlbmVyYXRpbmcgYSByYW5kb20gc2FtcGxlIG9mIG11bHRpbm9taWFsIGRhdGENCg0KDQoNCiMjIyAxKSBgZG11bHRpbm9tKClgDQoNCmBkbXVsdGlub20oKWAgaGFzIDIgYXJndW1lbnRzIA0KDQoxKSBgeCA9IGAgd2hpY2ggaGFzIHRvIGJlIGEgdmVjdG9yIHdpdGggbGVuZ3RoIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IG91dGNvbWVzDQogIC0gSWYgaXQgaXMgYSB0cmlub21pYWwgKGllIHBvb3IvbW9kZXJhdGUvZ29vZCksIGB4YCBuZWVkcyB0byBiZSBhIHZlY3RvciB3aXRoIDMgbnVtYmVyczoNCiAgICBhKSB0aGUgbnVtYmVyIG9mIHBvb3IgcmVzdWx0cyBpbiB0aGUgc2FtcGxlDQogICAgYikgdGhlIG51bWJlciBvZiBtb2RlcmF0ZSByZXN1bHRzIGluIHRoZSBzYW1wbGUNCiAgICBjKSB0aGUgbnVtYmVyIG9mIGdvb2QgcmVzdWx0cyBpbiB0aGUgc2FtcGxlDQoNCjIpIGBwcm9iID0gYCB0aGUgdmVjdG9yIG9mIHByb2JhYmlsaXRpZXMgdGhhdCBhbiBvYnNlcnZhdGlvbiBmYWxscyBpbnRvIHRoYXQgY2F0ZWdvcnkNCiAgLSB0cmlub21pYWwgd2l0aCAkXHtwXzEsIHBfMiwgcF8zXH0gPSBcezAuMiwgMC41LCAwLjNcfSQNCiAgLSBNYWtlIHN1cmUgdGhhdCB0aGUgdmVjdG9yIG9mIHByb2JhYmlsaXRpZXMgc3VtcyB0byAxLCBvciBSIHdpbGwgZm9yY2UgaXQgdG8gc3VtIHRvIDEhDQoNCg0KSXQgaGFzIGFuIGBzaXplID0gYCBhcmd1bWVudCwgYnV0IGl0IHdpbGwgY2FsY3VsYXRlICROJCB0byBiZSB0aGUgc3VtIG9mIHRoZSBlbGVtZW50cyBpbiBgeGAgc28geW91IHNob3VsZG4ndCB1c2UgaXQhDQoNCg0KTGV0J3Mgc2F5IGZyb20gYSByYW5kb20gc2FtcGxlIG9mIDIwLCB0aGVyZSB3ZXJlIDQgYmFkLCAxMSBtb2RlcmF0ZSwgYW5kIDUgZ29vZCANCg0KYGBge3IgZG11bHRpbm9tfQ0KIyBEb25lIGNvcnJlY3RseSBzaW5jZSBwcm9iIHN1bXMgdG8gMToNCmRtdWx0aW5vbSh4ID0gYyggICAgICA0LCAgIDExLCAgICA1KSwgDQogICAgICAgICAgcHJvYiA9IGMoMC4yMCwgMC41MCwgMC4zMCkpDQoNCiMgRG9uZSBpbmNvcnJlY3RseTogcHJvYiA9IGMoMC4yLCAwLjQsIDAuMykNCmRtdWx0aW5vbSh4ID0gYyggICAgICA0LCAgIDExLCAgICA1KSwgDQogICAgICAgICAgcHJvYiA9IGMoMC4yMCwgMC40MCwgMC4zMCkpDQoNCg0KYGBgDQoNCklmIHRoZSBgcHJvYmAgdmVjdG9yIGRvZXNuJ3Qgc3VtIHRvIDEsIGl0IHdpbGwgIm5vcm1hbGl6ZSIgdGhlIHZlY3RvciAoYWthLCBmb3JjZSBpdCB0byBzdW0gdG8gMSk6DQoNCiQkXGxlZnRceyBcZnJhY3twXzF9e3BfMSArIHBfMiArIHBfM30sIFxmcmFje3BfMn17cF8xICsgcF8yICsgcF8zfSwgXGZyYWN7cF8zfXtwXzEgKyBwXzIgKyBwXzN9ICBccmlnaHRcfSQkDQoNCg0KIyMjIDIpIGBybXVsdGlub20oKWANCg0KYHJtdWx0aW5vbSgpYCBoYXMgMyBhcmd1bWVudHMNCg0KMSkgYG4gPSBgOiBTY2FsYXIgLSBob3cgbWFueSByYW5kb20gdmVjdG9ycyB0byBjcmVhdGUNCg0KMikgYHNpemUgPSBgOiBTY2FsYXIgLSB0aGUgdG90YWwgbnVtYmVyIG9mIHRyaWFscw0KDQozKSBgcHJvYiA9IGA6IFZlY3RvciAtIHRoZSB2ZWN0b3Igb2YgcHJvYmFiaWxpdGllcyBmb3IgZWFjaCBvdXRjb21lDQoNCg0KTGV0J3MgY3JlYXRlIDEwIHJhbmRvbSB2ZWN0b3JzIHdpdGggMjAgdHJpYWxzIGVhY2ggZm9yIDQgZ3JvdXBzIG9mIGVxdWFsIHByb2JhYmlsaXR5ICRccGlfaSA9IDAuMjUkDQoNCmBgYHtyIHJtdWxpbm9taWFsfQ0Kcm11bHRpbm9tKG4gPSAxMCxzaXplID0gMjAsIHByb2IgPSByZXAoeCA9IDAuMjUsIHRpbWVzID0gNCkpDQoNCiMgYnkgZGVmYXVsdCwgaXQgY3JlYXRlcyBhIGNvbHVtbiBmb3IgZWFjaCByYW5kb20gbXVsdGlub21pYWwgcmVzdWx0DQoNCg0KIyBJZiB5b3Ugd2FudCB0aGUgcm93cyBuYW1lZCB0byB0aGVpciBjb3JyZXNwb25kaW5nIGdyb3VwcyAoc2F5IGcxIHRvIGc0KSwgeW91IGNhbiBkbyBzbyBpbiBwcm9iID0gDQpybXVsdGlub20obiA9IDEwLA0KICAgICAgICAgIHNpemUgPSAyMCwNCiAgICAgICAgICBwcm9iID0gYyhnMSA9IDAuMjUsDQogICAgICAgICAgICAgICAgICAgZzIgPSAwLjI1LA0KICAgICAgICAgICAgICAgICAgIGczID0gMC4yNSwNCiAgICAgICAgICAgICAgICAgICBnNCA9IDAuMjUpKQ0KDQojIEl0J3Mgb2Z0ZW4gbW9yZSBjb252ZW5pZW50IHRvIGhhdmUgZWFjaCBuZXcgc2FtcGxlIGluIGEgcm93IHJhdGhlciB0aGFuIGEgY29sdW1uLiBXZSBjYW4gdXNlIHQoKSB0byB0cmFuc3Bvc2UgdGhlIHJlc3VsdHM6DQpybXVsdGlub20obiA9IDEwLA0KICAgICAgICAgIHNpemUgPSAyMCwNCiAgICAgICAgICBwcm9iID0gYyhnMSA9IDAuMjUsDQogICAgICAgICAgICAgICAgICAgZzIgPSAwLjI1LA0KICAgICAgICAgICAgICAgICAgIGczID0gMC4yNSwNCiAgICAgICAgICAgICAgICAgICBnNCA9IDAuMjUpKSB8PiANCiAgdCgpIHw+IA0KICANCiAgZGF0YS5mcmFtZSgpIHw+IA0KICANCiAgbXV0YXRlKHRyaWFsID0gcm93X251bWJlcigpLA0KICAgICAgICAgLmJlZm9yZSA9IGcxKQ0KDQoNCg0KYGBgDQoNCg0KDQoNCg0KDQoNCg==