Skip to content

Instantly share code, notes, and snippets.

@soumyaray
Created March 1, 2017 06:29
Show Gist options
  • Save soumyaray/285296600b8712b04b52201010bbbd9f to your computer and use it in GitHub Desktop.
Save soumyaray/285296600b8712b04b52201010bbbd9f to your computer and use it in GitHub Desktop.
Confidence Intervals Demonstration in R
# Visualize the confidence intervals of samples drawn from a population
# e.g.,
# visualize_sample_ci(sample_size=300, distr_func=rnorm, mean=50, sd=10)
# visualize_sample_ci(sample_size=300, distr_func=runif, min=17, max=35)
visualize_sample_ci <- function(num_samples = 100, sample_size = 100,
pop_size=10000, distr_func=rnorm, ...) {
# Simulate a large population
population_data <- distr_func(pop_size, ...)
pop_mean <- mean(population_data)
pop_sd <- sd(population_data)
# Simulate samples
samples <- replicate(num_samples,
sample(population_data, sample_size, replace=FALSE))
# Calculate descriptives of samples
sample_means = apply(samples, 2, FUN=mean)
sample_stdevs = apply(samples, 2, FUN=sd)
sample_stderrs <- sample_stdevs/sqrt(sample_size)
ci95_low <- sample_means - sample_stderrs*1.96
ci95_high <- sample_means + sample_stderrs*1.96
ci99_low <- sample_means - sample_stderrs*2.58
ci99_high <- sample_means + sample_stderrs*2.58
# Visualize confidence intervals of all samples
plot(NULL, xlim=c(pop_mean-(pop_sd/2), pop_mean+(pop_sd/2)),
ylim=c(1,num_samples), ylab="Samples", xlab="Confidence Intervals")
add_ci_segment(ci95_low, ci95_high, ci99_low, ci99_high,
sample_means, 1:num_samples, good=TRUE)
# Visualize samples with CIs that don't include population mean
bad = which(((ci95_low > pop_mean) | (ci95_high < pop_mean)) |
((ci99_low > pop_mean) | (ci99_high < pop_mean)))
add_ci_segment(ci95_low[bad], ci95_high[bad], ci99_low[bad], ci99_high[bad],
sample_means[bad], bad, good=FALSE)
# Draw true population mean
abline(v=mean(population_data))
}
add_ci_segment <- function(ci95_low, ci95_high, ci99_low, ci99_high,
sample_means, indices, good=TRUE) {
segment_colors <- list(c("lightcoral", "coral3", "coral4"),
c("lightskyblue", "skyblue3", "skyblue4"))
color <- segment_colors[[as.integer(good)+1]]
segments(ci99_low, indices, ci99_high, indices, lwd=3, col=color[1])
segments(ci95_low, indices, ci95_high, indices, lwd=3, col=color[2])
points(sample_means, indices, pch=18, cex=0.6, col=color[3])
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment