Probability in R: Tossing Coins and Rolling Dice
What is the probality of heads? If we’re using a fair coin, the probability should be 0.5. We can test this using R to generate data given our probability model for a fair, two-sided coin.
# Make Coin Toss Function
# -----------------------
coin_toss <- function(times=100,run=1,bias=.5){
require(foreach)
outcomes <- times(times) %do% {
paste(sample(c(rep("H",len=100*bias),
rep("T",len=100*(1-bias))),
size=run,replace=T),collapse="")
}
return(outcomes)
}
# Flip the coin once.
coin_toss(times=1)
[1] "T"
# Flip it again.
coin_toss(times=1)
[1] "H"
# If we flip the coin 1,000 times, what do we get?
library(ggplot2)
library(dplyr)
data.frame(out=coin_toss(times=1000)) %>%
group_by(out) %>%
summarize(N=n()) %>%
mutate(prop=N/sum(N)) %>%
ggplot(aes(out,prop,label=round(prop,3))) +
geom_col(width=.25) +
geom_text(vjust=1,color="white") +
labs(x="Heads or Tails?",
y="Proportion") +
theme_classic() +
geom_hline(yintercept=0.5,linetype=3)

# Now, show how the proportion of times we get heads changes the more times we flip the coin
data.frame(prop_heads=foreach(i=1:100,.combine = "c") %do% mean(coin_toss(times=i)=="H"),
tosses=1:100) %>% # Note the use of a for loop.
ggplot(aes(tosses,prop_heads)) + geom_line(color="blue") +
geom_point(color="blue") +
geom_hline(yintercept=0.5,linetype=2) +
theme_classic() +
labs(x="Number of Tosses",y="Proportion Heads")

# Note that the probability of tails is the complement of the probability of heads
heads <- coin_toss()=="H"
mean(heads) # Probability of heads
[1] 0.46
1-mean(heads) # Probability of tails
[1] 0.54
# Conditional probability.
## What if the prability of heads was determined by the presence of a magnet (we have a special coin that is magnetic), and that if the floor is magnetic the probability of getting heads is 0.75?
## Let's assume that the magnet in the floor is activated at random.
library(foreach)
data.frame(magnet=sample(c(0.5,0.75),size=500,replace=T)) %>%
mutate(toss=unlist(foreach(i=magnet) %do% coin_toss(times=1,bias=i))) %>%
group_by(magnet,toss) %>% summarize(N=n()) %>%
mutate(prop=N/sum(N)) %>% ungroup() %>%
mutate(magnet=car::recode(magnet,"0.50='off';0.75='on'")) %>%
ggplot(aes(toss,prop,fill=magnet)) +
geom_col(width=.25,position="dodge") +
theme_classic() +
labs(x="Heads or Tails?",y="Proportion")
NAs introduced by coercion

# So can we calculate the conditional probability of heads given the magnet is turned on?
library(broom)
tidy(glm(Heads ~ Magnet, family = binomial,
data.frame(Magnet=sample(c(0.5,0.75),size=500,replace=T)) %>%
mutate(Heads=unlist(foreach(i=Magnet) %do% coin_toss(times=1,bias=i))=="H",
Magnet=car::recode(Magnet,"0.5='Off';0.75='On'")))) %>%
mutate(Probability_of_Heads=exp(estimate)/(1+exp(estimate)),
Magnet=c("Off","On")) %>%
select(Magnet,Probability_of_Heads)
NAs introduced by coercionNAs introduced by coercion
# From coins to dice...
## Create Dice Rolling Function:
dice_roll <- function(times=100,sides=6,dice=1) {
require(foreach)
outcome <- times(times) %do% {
sum(sample(1:sides,size=dice,replace=T))
}
return(outcome)
}
ggplot(NULL,aes(dice_roll(times=10000,dice=10))) +
geom_histogram(fill="grey",binwidth = 1) +
theme_classic() +
labs(x="Sum of Values after Rolling 10 Dice",
y="Frequency")

LS0tDQp0aXRsZTogIlByb2JhYmlsaXR5IGluIFIiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIFN1bW1hcnkNClJlY2FsbCBzb21lIGJhc2ljIHJ1bGVzIG9mIHByb2JhYmlsaXR5Og0KDQogIC0gJFAoXHRleHR7bm90aGluZ30pPTAkDQogIC0gRm9yIGFueSBldmVuICRBJCwgJDBcbGVxIFAoQSkgXGxlcSAxJA0KICAtICRQKEFeQyk9MS1QKEEpJA0KICAtIElmICRBXHN1YnNldCBCJCB0aGVuICRQKEEpXGxlcSBQKEIpJA0KICAtIEZvciBhbnkgdHdvIGV2ZW50cyAkQSQgYW5kICRCJCwgJFAoQVxiaWdjdXAgQik9UChBKSArIFAoQiktUChBXGJpZ2NhcCBCKSQNCiAgLSBGb3IgYW55IHNlcXVlbmNlIG9mICRuJCBldmVudHMgJEFfMSwuLi4sQV9uJDoNCiQkUFxsZWZ0KFxiaWdjdXBfe2lcaW4gbn1BX2lccmlnaHQpXGxlcSBcc3VtX3tpIFxpbiBufVAoQV9pKSQkDQoNClJlY2FsbCB0aGF0IGZvciBjb25kaXRpb25hbCBwcm9iYWJpbGl0eToNCg0KICAtICRQKEF8Qik9XGZyYWN7UChBXGJpZ2NhcCBCKX17UChCKX0kDQogIC0gV2l0aCB0aGUgbXVsdGlwbGljYXRpdmUgbGF3IG9mIHByb2JhYmlsaXR5OiAkUChBXGJpZ2NhcCBCKT1QKEEpUChCfEEpPVAoQilQKEJ8QSkkDQoNCkJheWVzIFJ1bGU6DQokJFAoSXxFKT1cZnJhY3tQKEVcYmlnY2FwIEkpfXtQKEUpfT1cZnJhY3tQKEkpUChFfEkpfXtQKEkpUChFfEkpK1AoRylQKEV8Ryl9JCQNCg0KIyBQcm9iYWJpbGl0eSBpbiBSOiBUb3NzaW5nIENvaW5zIGFuZCBSb2xsaW5nIERpY2UNCg0KV2hhdCBpcyB0aGUgcHJvYmFsaXR5IG9mIGhlYWRzPyBJZiB3ZSdyZSB1c2luZyBhIGZhaXIgY29pbiwgdGhlIHByb2JhYmlsaXR5IHNob3VsZCBiZSAwLjUuIFdlIGNhbiB0ZXN0IHRoaXMgdXNpbmcgUiB0byBnZW5lcmF0ZSBkYXRhIGdpdmVuIG91ciBwcm9iYWJpbGl0eSBtb2RlbCBmb3IgYSBmYWlyLCB0d28tc2lkZWQgY29pbi4NCg0KYGBge3J9DQojIE1ha2UgQ29pbiBUb3NzIEZ1bmN0aW9uDQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpjb2luX3Rvc3MgPC0gZnVuY3Rpb24odGltZXM9MTAwLHJ1bj0xLGJpYXM9LjUpew0KICByZXF1aXJlKGZvcmVhY2gpDQogIG91dGNvbWVzIDwtIHRpbWVzKHRpbWVzKSAlZG8lIHsNCiAgICBwYXN0ZShzYW1wbGUoYyhyZXAoIkgiLGxlbj0xMDAqYmlhcyksDQogICAgICAgICAgICAgICAgICAgcmVwKCJUIixsZW49MTAwKigxLWJpYXMpKSksDQogICAgICAgICAgICAgICAgIHNpemU9cnVuLHJlcGxhY2U9VCksY29sbGFwc2U9IiIpDQogIH0NCiAgcmV0dXJuKG91dGNvbWVzKQ0KfQ0KDQojIEZsaXAgdGhlIGNvaW4gb25jZS4NCmNvaW5fdG9zcyh0aW1lcz0xKQ0KDQojIEZsaXAgaXQgYWdhaW4uDQpjb2luX3Rvc3ModGltZXM9MSkNCg0KIyBJZiB3ZSBmbGlwIHRoZSBjb2luIDEsMDAwIHRpbWVzLCB3aGF0IGRvIHdlIGdldD8NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQpkYXRhLmZyYW1lKG91dD1jb2luX3Rvc3ModGltZXM9MTAwMCkpICU+JQ0KICBncm91cF9ieShvdXQpICU+JQ0KICBzdW1tYXJpemUoTj1uKCkpICU+JQ0KICBtdXRhdGUocHJvcD1OL3N1bShOKSkgJT4lDQogIGdncGxvdChhZXMob3V0LHByb3AsbGFiZWw9cm91bmQocHJvcCwzKSkpICsgDQogIGdlb21fY29sKHdpZHRoPS4yNSkgKw0KICBnZW9tX3RleHQodmp1c3Q9MSxjb2xvcj0id2hpdGUiKSArDQogIGxhYnMoeD0iSGVhZHMgb3IgVGFpbHM/IiwNCiAgICAgICB5PSJQcm9wb3J0aW9uIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKyANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAuNSxsaW5ldHlwZT0zKQ0KDQojIE5vdywgc2hvdyBob3cgdGhlIHByb3BvcnRpb24gb2YgdGltZXMgd2UgZ2V0IGhlYWRzIGNoYW5nZXMgdGhlIG1vcmUgdGltZXMgd2UgZmxpcCB0aGUgY29pbg0KZGF0YS5mcmFtZShwcm9wX2hlYWRzPWZvcmVhY2goaT0xOjEwMCwuY29tYmluZSA9ICJjIikgJWRvJSBtZWFuKGNvaW5fdG9zcyh0aW1lcz1pKT09IkgiKSwNCiAgICAgICAgICAgdG9zc2VzPTE6MTAwKSAlPiUgIyBOb3RlIHRoZSB1c2Ugb2YgYSBmb3IgbG9vcC4NCiAgZ2dwbG90KGFlcyh0b3NzZXMscHJvcF9oZWFkcykpICsgZ2VvbV9saW5lKGNvbG9yPSJibHVlIikgKw0KICBnZW9tX3BvaW50KGNvbG9yPSJibHVlIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MC41LGxpbmV0eXBlPTIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgbGFicyh4PSJOdW1iZXIgb2YgVG9zc2VzIix5PSJQcm9wb3J0aW9uIEhlYWRzIikNCiAgDQoNCiMgTm90ZSB0aGF0IHRoZSBwcm9iYWJpbGl0eSBvZiB0YWlscyBpcyB0aGUgY29tcGxlbWVudCBvZiB0aGUgcHJvYmFiaWxpdHkgb2YgaGVhZHMNCmhlYWRzIDwtIGNvaW5fdG9zcygpPT0iSCINCg0KbWVhbihoZWFkcykgIyBQcm9iYWJpbGl0eSBvZiBoZWFkcw0KMS1tZWFuKGhlYWRzKSAjIFByb2JhYmlsaXR5IG9mIHRhaWxzDQoNCiMgQ29uZGl0aW9uYWwgcHJvYmFiaWxpdHkuDQojIyBXaGF0IGlmIHRoZSBwcmFiaWxpdHkgb2YgaGVhZHMgd2FzIGRldGVybWluZWQgYnkgdGhlIHByZXNlbmNlIG9mIGEgbWFnbmV0ICh3ZSBoYXZlIGEgc3BlY2lhbCBjb2luIHRoYXQgaXMgbWFnbmV0aWMpLCBhbmQgdGhhdCBpZiB0aGUgZmxvb3IgaXMgbWFnbmV0aWMgdGhlIHByb2JhYmlsaXR5IG9mIGdldHRpbmcgaGVhZHMgaXMgMC43NT8NCiMjIExldCdzIGFzc3VtZSB0aGF0IHRoZSBtYWduZXQgaW4gdGhlIGZsb29yIGlzIGFjdGl2YXRlZCBhdCByYW5kb20uIA0KbGlicmFyeShmb3JlYWNoKQ0KZGF0YS5mcmFtZShtYWduZXQ9c2FtcGxlKGMoMC41LDAuNzUpLHNpemU9NTAwLHJlcGxhY2U9VCkpICU+JQ0KICBtdXRhdGUodG9zcz11bmxpc3QoZm9yZWFjaChpPW1hZ25ldCkgJWRvJSBjb2luX3Rvc3ModGltZXM9MSxiaWFzPWkpKSkgJT4lDQogIGdyb3VwX2J5KG1hZ25ldCx0b3NzKSAlPiUgc3VtbWFyaXplKE49bigpKSAlPiUNCiAgbXV0YXRlKHByb3A9Ti9zdW0oTikpICU+JSB1bmdyb3VwKCkgJT4lDQogIG11dGF0ZShtYWduZXQ9Y2FyOjpyZWNvZGUobWFnbmV0LCIwLjUwPSdvZmYnOzAuNzU9J29uJyIpKSAlPiUNCiAgZ2dwbG90KGFlcyh0b3NzLHByb3AsZmlsbD1tYWduZXQpKSArDQogIGdlb21fY29sKHdpZHRoPS4yNSxwb3NpdGlvbj0iZG9kZ2UiKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIGxhYnMoeD0iSGVhZHMgb3IgVGFpbHM/Iix5PSJQcm9wb3J0aW9uIikNCg0KIyBTbyBjYW4gd2UgY2FsY3VsYXRlIHRoZSBjb25kaXRpb25hbCBwcm9iYWJpbGl0eSBvZiBoZWFkcyBnaXZlbiB0aGUgbWFnbmV0IGlzIHR1cm5lZCBvbj8NCmxpYnJhcnkoYnJvb20pDQp0aWR5KGdsbShIZWFkcyB+IE1hZ25ldCwgZmFtaWx5ID0gYmlub21pYWwsDQogICAgICAgICBkYXRhLmZyYW1lKE1hZ25ldD1zYW1wbGUoYygwLjUsMC43NSksc2l6ZT01MDAscmVwbGFjZT1UKSkgJT4lDQogICAgICAgICAgIG11dGF0ZShIZWFkcz11bmxpc3QoZm9yZWFjaChpPU1hZ25ldCkgJWRvJSBjb2luX3Rvc3ModGltZXM9MSxiaWFzPWkpKT09IkgiLA0KICAgICAgICAgICAgICAgICAgTWFnbmV0PWNhcjo6cmVjb2RlKE1hZ25ldCwiMC41PSdPZmYnOzAuNzU9J09uJyIpKSkpICU+JQ0KICBtdXRhdGUoUHJvYmFiaWxpdHlfb2ZfSGVhZHM9ZXhwKGVzdGltYXRlKS8oMStleHAoZXN0aW1hdGUpKSwNCiAgICAgICAgIE1hZ25ldD1jKCJPZmYiLCJPbiIpKSAlPiUNCiAgc2VsZWN0KE1hZ25ldCxQcm9iYWJpbGl0eV9vZl9IZWFkcykNCg0KIyBGcm9tIGNvaW5zIHRvIGRpY2UuLi4NCiMjIENyZWF0ZSBEaWNlIFJvbGxpbmcgRnVuY3Rpb246DQpkaWNlX3JvbGwgPC0gZnVuY3Rpb24odGltZXM9MTAwLHNpZGVzPTYsZGljZT0xKSB7DQogIHJlcXVpcmUoZm9yZWFjaCkNCiAgb3V0Y29tZSA8LSB0aW1lcyh0aW1lcykgJWRvJSB7DQogICAgc3VtKHNhbXBsZSgxOnNpZGVzLHNpemU9ZGljZSxyZXBsYWNlPVQpKQ0KICB9DQogIHJldHVybihvdXRjb21lKQ0KfQ0KDQpnZ3Bsb3QoTlVMTCxhZXMoZGljZV9yb2xsKHRpbWVzPTEwMDAwLGRpY2U9MTApKSkgKyANCiAgZ2VvbV9oaXN0b2dyYW0oZmlsbD0iZ3JleSIsYmlud2lkdGggPSAxKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIGxhYnMoeD0iU3VtIG9mIFZhbHVlcyBhZnRlciBSb2xsaW5nIDEwIERpY2UiLA0KICAgICAgIHk9IkZyZXF1ZW5jeSIpDQpgYGANCg0KDQo=