Power Analysis¶
Statistical power is the probability that a test correctly rejects a false null hypothesis. HypoTestX provides functions to calculate required sample sizes before a study and to compute post-hoc power after data collection.
Required sample size — two-sample t-test¶
How many participants per group do you need to detect an effect of a given size?
import hypotestx as hx
n = hx.n_ttest_two_sample(effect_size=0.5, alpha=0.05, power=0.8)
print(f"Required n per group: {n}") # 64
Parameter |
Type |
Default |
Description |
|---|---|---|---|
|
|
— |
Cohen’s d (standardised mean difference) |
|
|
|
Significance level (Type I error rate) |
|
|
|
Desired power (1 − Type II error rate) |
|
|
|
|
Common effect size guidelines (Cohen’s d)¶
d |
Magnitude |
|---|---|
0.2 |
Small |
0.5 |
Medium |
0.8 |
Large |
# Need to detect a small effect with 90% power
n_small = hx.n_ttest_two_sample(effect_size=0.2, alpha=0.05, power=0.9)
print(f"Small effect, 90% power: n = {n_small} per group")
# One-tailed test (directional hypothesis)
n_one = hx.n_ttest_two_sample(
effect_size=0.5, alpha=0.05, power=0.8, alternative="greater"
)
Post-hoc power — two-sample t-test¶
After collecting data, compute the power actually achieved:
pow_result = hx.power_ttest_two_sample(
effect_size=0.4,
n1=30,
n2=30,
alpha=0.05,
alternative="two-sided",
)
print(f"Achieved power: {pow_result.power:.2f}")
Parameter |
Type |
Description |
|---|---|---|
|
|
Cohen’s d |
|
|
Size of group 1 |
|
|
Size of group 2 |
|
|
Significance level used in the test |
|
|
|
The returned object has a .power attribute (float 0–1).
Worked Example: Planning a Study¶
import hypotestx as hx
# Before the study: power calculation
# Expecting a medium effect (d = 0.5), standard alpha, 80% power
n_required = hx.n_ttest_two_sample(effect_size=0.5, alpha=0.05, power=0.8)
print(f"Collect at least {n_required} participants per group")
# After the study: you collected 45 per group
# Effect observed was d = 0.42 (slightly smaller than expected)
achieved = hx.power_ttest_two_sample(
effect_size=0.42,
n1=45,
n2=45,
alpha=0.05,
)
print(f"Post-hoc power: {achieved.power:.1%}")
# Run the actual test
result = hx.ttest_2samp(group1, group2, alpha=0.05)
print(result.summary())
Power Curves¶
To visualise how power changes with sample size:
import hypotestx as hx
effect = 0.5 # medium effect
alpha = 0.05
ns = list(range(10, 200, 5))
powers = [
hx.power_ttest_two_sample(effect, n1=n, n2=n, alpha=alpha).power
for n in ns
]
# Find minimum n for 80% power
adequate = [(n, p) for n, p in zip(ns, powers) if p >= 0.80]
if adequate:
print(f"First n with ≥80% power: {adequate[0][0]}")