Sample Size Determination — How Many Observations Do You Need?
Foundations of Statistics
Planning for Statistical Success
Sample size determination ensures studies have adequate power to detect meaningful effects while avoiding unnecessary data collection. It balances statistical requirements against practical constraints like time, cost, and ethics.
- Clinical Trials — Ensuring sufficient power to detect clinically meaningful treatment effects
- Market Research — Optimizing survey costs while maintaining estimate precision
- Quality Assurance — Determining inspection sample sizes for reliable defect detection
The right sample size is the foundation of trustworthy statistical conclusions.
What Is Sample Size Determination?
Core Formulas
Derivation: Inverting the Margin of Error
Proof sketch: The margin of error is the half-width of the CI. Setting to the desired precision and solving for gives the minimum sample size that achieves that precision. Rounding up ensures the actual margin is at most .
Sample Size for Hypothesis Testing (Power Analysis)
Worked Example: Clinical Trial Design
A pharmaceutical company wants to detect a 3 mmHg reduction in blood pressure with 80% power at . Prior studies suggest mmHg.
Step 1: Identify parameters: , , (), power (, ).
Step 2: Compute:
Step 3: Round up: per group, total .
The Effect Size Pyramid
Python Implementation
import numpy as np
from scipy import stats
def sample_size_mean(sigma, E, alpha=0.05):
"""Sample size for estimating a mean with margin of error E."""
z = stats.norm.ppf(1 - alpha / 2)
return int(np.ceil((z * sigma / E) ** 2))
def sample_size_proportion(p, E, alpha=0.05):
"""Sample size for estimating a proportion with margin of error E."""
z = stats.norm.ppf(1 - alpha / 2)
return int(np.ceil(z**2 * p * (1 - p) / E**2))
def sample_size_two_sample(delta, sigma, alpha=0.05, power=0.80):
"""Sample size per group for two-sample t-test."""
z_alpha = stats.norm.ppf(1 - alpha / 2)
z_beta = stats.norm.ppf(power)
return int(np.ceil(2 * sigma**2 * (z_alpha + z_beta)**2 / delta**2))
# Example 1: Mean estimation
print(f"n for σ=10, E=2, 95% CI: {sample_size_mean(10, 2, 0.05)}")
print(f"n for σ=10, E=1, 95% CI: {sample_size_mean(10, 1, 0.05)}")
# Example 2: Proportion estimation
print(f"n for p=0.5, E=0.03, 95% CI: {sample_size_proportion(0.5, 0.03)}")
print(f"n for p=0.2, E=0.03, 95% CI: {sample_size_proportion(0.2, 0.03)}")
# Example 3: Two-sample test
print(f"n per group for δ=3, σ=8, 80% power: {sample_size_two_sample(3, 8, 0.05, 0.80)}")
print(f"n per group for δ=2, σ=8, 80% power: {sample_size_two_sample(2, 8, 0.05, 0.80)}")