The Multiple Comparisons Problem: How to Stop Inflating False Positives

⏱️ 3 min read 📈 Data Analysis

Every test you run at α = 0.05 has a 5% chance of a false positive when nothing is going on. Run 10 tests and the chance that at least one comes back "significant" by luck is 40%, not 5%. That is the multiple comparisons problem, and it is why a dashboard with 20 metrics almost always shows a winner somewhere.

Quick answer: With m independent tests at α = 0.05, the chance of at least one false positive is 1 - (1 - 0.05)^m: 22.6% for 5 tests, 40.1% for 10, 64.2% for 20. Fix it with Bonferroni (compare each p-value to α/m, e.g. 0.05/10 = 0.005) when any single false positive is costly, or Benjamini-Hochberg (sort p-values ascending and find the largest rank i where p₍ᵢ₎ ≤ (i/m) × 0.05, then reject everything up to it) when you want to control the false discovery rate and keep more power.

Why does testing more metrics inflate false positives?

Because each test gets its own independent 5% chance to fire, and those chances compound. The probability of at least one false positive across m independent null tests is called the family-wise error rate (FWER).

FWER = 1 - (1 - α)^m        with α = 0.05
Tests (m)Family-wise error rateBonferroni threshold (α/m)
15.0%0.05
29.8%0.025
522.6%0.010
1040.1%0.005
2064.2%0.0025
5092.3%0.001

This is why "we tested the new checkout and it did not move conversion, but it lifted mobile session length for logged-in users in Germany" is not a finding. It is the arithmetic above doing its job. If your metrics are correlated, the real FWER sits somewhere below these numbers, but it is still far above 5%.

How does the Bonferroni correction work?

Divide your α by the number of tests and compare every raw p-value to that stricter threshold. Testing 10 metrics at an overall 5% error rate means each individual p-value must be below 0.005.

Adjusted threshold: α* = α / m           (compare raw p to α*)
Equivalent form:    p_adjusted = min(1, p × m)   (compare to α)

10 metrics, α = 0.05  →  each p must be < 0.005

Bonferroni controls the FWER: the probability of even one false positive across the whole family stays at or below 5%. It makes no assumption about independence, which is why it is safe on correlated metrics. The cost is power. At m = 20 you need p < 0.0025, and real effects that would comfortably clear 0.05 vanish.

Use Bonferroni when a single false positive is genuinely expensive: a drug safety endpoint, a pricing change, a claim you will put in a press release. Use it when m is small, ideally under 10.

How does Benjamini-Hochberg differ from Bonferroni?

Benjamini-Hochberg (BH) controls the false discovery rate (FDR) instead of the family-wise error rate. It accepts that some proportion of your declared discoveries will be wrong, and caps that proportion, which recovers a lot of the power Bonferroni gives away.

Benjamini-Hochberg procedure (FDR level q = 0.05):
1. Sort the m p-values ascending: p₍₁₎ ≤ p₍₂₎ ≤ … ≤ p₍m₎
2. For each rank i, compute the critical value (i / m) × q
3. Find the LARGEST i where p₍ᵢ₎ ≤ (i / m) × q
4. Reject the null for ranks 1 through i (all of them, even any
   whose own p-value exceeded its own critical value)

Here is the same set of 10 p-values run through no correction, Bonferroni, and BH at q = 0.05:

Rank ip-valueBH critical (i/10 × 0.05)Bonferroni (0.005)BH
10.0010.005rejectreject
20.0040.010rejectreject
30.0110.015reject
40.0140.020reject
50.0210.025reject
60.0410.030
70.2400.035
80.3900.040
90.5500.045
100.8700.050

Uncorrected, six results look significant. Bonferroni keeps two. BH keeps five: rank 5 is the largest rank whose p-value (0.021) falls under its critical value (0.025), so ranks 1 through 5 are all rejected. The interpretation of the BH set is "roughly 5% of these five discoveries are expected to be false," not "each of these five is individually safe at 5%."

Which correction should I use?

Match the correction to the cost of being wrong: Bonferroni when one false positive is unacceptable, BH when you are screening many candidates and can tolerate a known fraction of duds.

BonferroniBenjamini-Hochberg
ControlsFamily-wise error rateFalse discovery rate
GuaranteeP(≥1 false positive) ≤ αExpected share of false ones among discoveries ≤ q
PowerLow, drops fast as m growsMuch higher, degrades gently
AssumptionsNone (holds under any dependence)Independence or positive dependence
Good form < 10, high-stakes single claimsm in the dozens to thousands, screening
Typical useConfirmatory A/B guardrailsFeature selection, exploratory metric scans

A practical middle path for experiments: designate one primary metric up front and test it at the full α = 0.05, then treat every other metric as exploratory and either correct it or label it as a hypothesis for a follow-up test. That is how most mature experimentation programs handle it, and it is covered in the planning step of our hypothesis testing walkthrough.

Is peeking at results a multiple comparisons problem?

Yes. Every time you check an in-flight test and are willing to stop on p < 0.05, you have run another test. Checking daily for two weeks is closer to 14 comparisons than one, and the true false positive rate climbs well past 5%.

Sequential peeking is not exactly the independent-test case in the table above, because the looks are strongly correlated with each other, but the direction is the same and the inflation is severe. The standard fixes:

Common mistakes with multiple comparisons

Pro Tip: Before an experiment starts, write down the single primary metric, the guardrails, and the exact number of comparisons you intend to make. That pre-registered count is your m. It takes five minutes, it makes the correction mechanical instead of a negotiation after the results are in, and it removes the single biggest source of arguments in experiment reviews.

← Back to Data Analysis Tips