Fun with coin flips

[This article was first published on Jason.Bryer.org Blog - R, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

We all know that the odds of flipping an unbiased coin is 50% heads, 50% tails. But what happens if you do this a lot of times. Do you expect the same number of heads and tails? What if we took a cumulative sum where heads = +1 and tails = -1. What would that sum be? Here is a function that will do this n times and plot it.

probPlot <- function(n=1000) {
	vals <- rbinom(n=n, size=1, prob=.5)
	vals[vals==0] <- -1
	df = data.frame(x=1:length(vals), y=cumsum(vals))
	range <- c( -max(abs(df$y)), max(abs(df$y)))
	ggplot(df, aes(x=x, y=y)) + 
		geom_hline(yintercept=0, colour='blue') + 
		geom_line() + 
		ylim(range) +
		ylab('Cumulative Sum') + 
		xlab(paste('Point in sequence 1:n coin flips for n=', 
			prettyNum(n, big.mark=',', scientific=FALSE), sep='')) +
		ggtitle(paste('Cumulative sums for succession of ', 
			prettyNum(n, big.mark=',', scientific=FALSE), 
			' coin flips\nwhere Heads = +1 & Tails = -1', sep=''))
}

The results of probPlot(n=10000) is:

But if we run it again we get a different plot:

But after 10,000 coin flips, the possible range is 10,000 for all heads or -10,000 for all tails. If we set the range for the y-axis it appears that the cumulative sum is indeed pretty close to 0.

Using the animation package, we can quickly create an animation zooming in from the full range to see the variation in the cumulative sum.

require(animation)
set.seed(2112)
n <- 10000
nsteps <- 10
p <- probPlot(n) + ggtitle(NULL)
steps <- c(n)
while(steps[length(steps)] / 2 > max(abs(p$data$y))) { 
	steps = c(steps, steps[length(steps)] / 2)
}
saveHTML( {
	for(i in steps) {
		print( p + ylim(c(-i, i)) )
	} }, 
	interval = 0.5, htmlfile='cumulativesum.html', autobrowse=FALSE, outdir=getwd(),
	title = paste('Cumulative sums for succession of ', 
		prettyNum(n, big.mark=',', scientific=FALSE), ' coin flips', sep=''),
	description = paste('Cumulative sums for succession of ',
		prettyNum(n, big.mark=',', scientific=FALSE), 
		'coin flips where Heads = +1 and Tails = -1', sep='')
)

To leave a comment for the author, please follow the link and comment on their blog: Jason.Bryer.org Blog - R.

R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Never miss an update!
Subscribe to R-bloggers to receive
e-mails with the latest R posts.
(You will not see this message again.)

Click here to close (This popup will not appear again)