Multiple comparisons and subgroup analyses
Multiplicity is not a technical detail about discounting p-values; it is a question about what was promised. An alpha of 0.05 guarantees an error rate for one test, and guarantees nothing once you look at twenty. This page measures the inflation of the type I error rate, what three adjustment procedures actually deliver, and why a finely cut subgroup forest plot will almost always hand you a "positive" subgroup.
An alpha of 0.05 is a promise about one test, not about twenty
α = 0.05 means: if there is no effect, this one test has a 5% chance of claiming there is one. It promises nothing whatsoever about anything other than “this one”.
If twenty outcomes are independent and every one of them truly has no effect, the probability that at least one comes out “significant” is
| Number of tests k | Probability of at least one false positive |
|---|---|
| 1 | 5.0% |
| 2 | 9.8% |
| 5 | 22.6% |
| 10 | 40.1% |
| 20 | 64.2% |
| 50 | 92.3% |
| 100 | 99.4% |
That is arithmetic, not simulation. What follows is simulation: 5,000 fictional trials, each with 60 patients per arm and 20 outcome measures, and both arms of every measure are drawn from the same distribution in the code — all true effects are zero, so every “significant” finding is a false positive by construction, with nothing to infer.
- On average each trial produces 0.995 “significant” results (the theoretical value is exactly 20 × 0.05 = 1)
- 64.3% of trials have at least one
- The worst single trial produced 5
Three adjustment procedures, guaranteeing three different things
figures/scripts/B8-05-multiplicity.R| Approach | Family-wise error rate |
|---|---|
| No adjustment | 64.26% |
| Bonferroni | 5.06% |
| Holm | 5.06% |
| Benjamini-Hochberg (FDR) | 5.12% |
| Procedure | What it guarantees | When to use it |
|---|---|---|
| Bonferroni | The family-wise error rate stays below α: the probability of any false positive anywhere in the family of tests | Confirmatory analyses, few outcomes, every conclusion has to stand on its own |
| Holm | The same guarantee, arrived at stepwise; it never rejects fewer hypotheses than Bonferroni | Almost anywhere you were about to use Bonferroni |
| Benjamini–Hochberg | The false discovery rate stays below α: the proportion of the findings you declared positive that are wrong. ⚠️ That guarantee requires the tests to be independent or positively dependent; under arbitrary dependence use Benjamini–Yekutieli instead | Exploratory, screening-scale testing (genes, metabolites, PheWAS) |
All three adjusted rows in the table above land near 5.06% and look interchangeable — and that is because every effect in this simulation is truly zero. When all hypotheses are null, false discovery rate control and family-wise error rate control coincide. As soon as some effects are real, Benjamini–Hochberg rejects more than Bonferroni does, at the price of tolerating a defined proportion of errors among the findings it declares positive.
The volcano plot in an omics paper (genomics, proteomics, metabolomics, PheWAS) is this same section drawn differently: effect size across, up, so the smaller the p-value the higher the point and the more extreme the effect the further out it sits, and the two decision rules become two horizontal lines. The plot below uses no new data. It is trial 2 from the very simulation on this page, picked by a rule fixed in advance — the first trial whose count of unadjusted hits equals the expected count, 20 × 0.05 = 1, rather than the best-looking one — and all 20 of its endpoints are truly null. The number of points above the unadjusted line at 0.05 is 1; above the Benjamini–Hochberg line it is 0. That point above the red line is not a signal, it is the kind of false positive this whole page is about — its raw p is 0.029 and its BH-adjusted p is 0.57. Which is to say that “is anything floating above the line?” is a conclusion, not a property of the data: the same points give a different answer under a different line, and moving the line requires no reanalysis at all. The first thing to ask of one of these plots is therefore which kind of threshold that line is.
Where the green line sits needs one more sentence, because it is not a fixed height. Benjamini–Hochberg is a step-up procedure: sort the 20 p-values from smallest to largest and judge the i-th against its own rung of a ladder, α × i / 20. The largest p-value that still clears its own rung sets the line, and everything at or below it is declared positive — so the line moves with the data, and with real signal present it can sit far above where Bonferroni would. Bonferroni, by contrast, holds every p-value to the bottom rung and only to that rung. In this trial nothing cleared any rung, so no such p-value exists and the honest line to draw is the bottom rung itself, α / 20 = 0.0025 — numerically the same threshold as Bonferroni. That is not a contradiction of the table above: when nothing climbs the ladder at all, the two procedures meet at its foot.
figures/scripts/B8-05-multiplicity.RSubgroup analyses: the problem is not the missing adjustment, it is the wrong question
The commonest multiplicity problem in a clinical trial is not twenty outcome measures; it is one subgroup forest plot. The simulation below has a single outcome and a single real effect, and the true effect is identical in every subgroup — no interaction exists at all. The total trial size is fixed and cut into g equal parts.
| Number of subgroups | At least one significant and at least one not | False positive rate of the interaction test |
|---|---|---|
| 2 | 11.3% | 5.2% |
| 4 | 76.2% | 5.7% |
| 6 | 96.7% | 5.7% |
| 8 | 98.7% | 6.4% |
| 10 | 97.5% | 7.0% |
The middle column is where sentences like “this drug works in one group but not another” come from — and how much to believe one depends on how many subgroups were cut. A plain split by sex is a different case: at 2 subgroups the split rate is 11.3%, which the Callout below returns to. Cut into 6 subgroups, 96.7% of trials produce a split result — at least one subgroup significant and at least one not — while the truth is that every subgroup has exactly the same effect.
The right-hand column is the control: the correct question is not “which subgroup was significant” but “do the subgroup effects actually differ”, which is the test for interaction. Its false positive rate stays between 5.2% and 7.0% throughout — hugging the nominal 5%, with the upper end running slightly above it (with many subgroups each one is down to a few dozen people and the large-sample approximation starts to strain; see the end of this section).
Two honest caveats, because they are on the same table:
- The middle column reads 98.7% at 8 subgroups and then falls slightly to 97.5% at 10. It is not monotone: past a certain fineness every subgroup is too small, so “nothing is significant anywhere” starts to become common — and a result with nothing significant is not a split. A falling split rate does not mean the problem is shrinking; it means the information has been diluted until nothing is visible.
- The right-hand column reaches 7.0% at 10 subgroups, somewhat above its nominal 5%. That is the large-sample approximation straining when each subgroup is down to a few dozen people, not a failure of the interaction test as such — but it is a reminder that past a certain number of subgroups, even the correct test starts to become unreliable.
When adjustment is called for, and when it is not
| Situation | Adjust? | Why |
|---|---|---|
| One pre-specified primary outcome | No | There is only one test; the promise attached to 0.05 still holds |
| Several co-primary outcomes, success claimed if any one is met | Yes | This is the defining situation for the family-wise error rate |
| Several co-primary outcomes, success claimed only if all are met | No | Every one has to pass, so the type I error rate is lower, not higher |
| Secondary outcomes explicitly labelled supportive or exploratory | It depends | If they are not used to draw conclusions, adjustment is beside the point; labelling them honestly is not |
| Interim analyses | Yes | The same outcome is inspected repeatedly; use an alpha spending function |
| Post hoc subgroups | Adjustment cannot rescue them | The problem is that the analysis was not pre-specified, not that the threshold was too lenient |
| Sensitivity analyses (same question, different method) | No | The purpose is to see whether the conclusion is stable, not to hunt for significance |
| High-throughput screening | Yes, via the false discovery rate | Family-wise control would suppress the real signals as well |
What to look for when reading a paper
- Which outcome the protocol or the registry entry names as primary. If the sentence in the abstract is about a different one, ask why first.
- How many outcomes were measured in total. If the methods list fifteen and the results report three, ask where the other twelve went.
- Whether subgroups were pre-specified or post hoc. CONSORT requires this to be stated; if it is not stated, treat them as post hoc.
- Whether an interaction p-value is reported. Giving only each subgroup’s effect and each subgroup’s p-value is an invitation for the reader to make exactly the comparison that goes wrong.
- Whether the adjustment method is named, and which error rate it controls. “Bonferroni-corrected” and “FDR < 0.05” are two different claims.
- How much alpha the interim analyses spent. The final significance threshold is usually smaller than 0.05.
Run it yourself
set.seed(20260822)
# One trial: 20 endpoints, no effect anywhere
one_trial <- function(k = 20, n = 60) {
replicate(k, t.test(rnorm(n), rnorm(n), var.equal = TRUE)$p.value)
}
p <- one_trial()
sum(p < 0.05) # how many "significant" findings from nothing
p.adjust(p, "bonferroni") < 0.05 # all FALSE, almost always
p.adjust(p, "holm") < 0.05
p.adjust(p, "BH") < 0.05
# The family-wise error rate, measured rather than asserted
mean(replicate(1000, any(one_trial() < 0.05))) # about 0.64
mean(replicate(1000, any(p.adjust(one_trial(), "holm") < 0.05))) # about 0.05Verified with R 4.6.0. Every number on this page is simulated, with the seed fixed at 20260822.
import numpy as np
from scipy import stats
from statsmodels.stats.multitest import multipletests
rng = np.random.default_rng(20260822)
def one_trial(k=20, n=60):
return np.array([stats.ttest_ind(rng.normal(size=n), rng.normal(size=n)).pvalue
for _ in range(k)])
p = one_trial()
print((p < 0.05).sum())
for method in ("bonferroni", "holm", "fdr_bh"):
print(method, multipletests(p, alpha=0.05, method=method)[0].sum())
print(np.mean([(one_trial() < 0.05).any() for _ in range(1000)])) # about 0.64statsmodels' multipletests covers Bonferroni, Holm and BH, and its interface lines up with R's p.adjust.
Common misuses
| Misuse | Why it is wrong |
|---|---|
| Measuring a dozen or more outcomes and reporting only the significant ones | That is selective reporting; adjusting p-values does nothing about what was never reported |
| “This drug works in men but not in women” | The test for interaction is what answers that; once the subgroups are many, a split subgroup result is almost bound to appear anyway |
| Using the size of a subgroup’s p-value as evidence of interaction | One large and one small p-value is not the same thing as two different effects |
| Applying a stricter threshold to a post hoc subgroup and calling it handled | The problem is that the analysis was not pre-specified, not that the threshold was too lenient |
| Describing false discovery rate control as “corrected p-values” | It controls the error rate among the findings declared positive, not the family-wise error rate |
| Applying a multiplicity adjustment to sensitivity analyses | A sensitivity analysis asks about stability, not about additional significance |
| Looking three times at an interim analysis and still judging at 0.05 | Repeated looks inflate the type I error rate; the final threshold has to be smaller |
| Controlling the family-wise error rate in an exploratory analysis | It suppresses the real signals too; use the false discovery rate |
| Skipping multiplicity entirely on the grounds that “this study is exploratory” | Being exploratory is not an exemption; it is a requirement to list every comparison that was made |
Reproducing every number on this page
/opt/homebrew/bin/Rscript figures/scripts/B8-05-multiplicity.RRead the figure
The answer comes from the same statistical output that produced this page's figures, not from a number typed in beside them.
Twenty independent endpoints, all of them genuinely null, each tested once at 0.05. What is the probability that at least one comes out significant?
Show the answer and why
Correct answer: 0.642. What 0.05 promises is one test; after twenty it no longer promises anything
0.642 is the complement of twenty tests all going right: each has a ninety-five percent chance of not erring, and twenty in a row without an error falls below four tenths. 0.050 is the single-test row, and carrying it over to twenty tests is exactly the misreading that alpha covers the whole set - a promise alpha never made. 0.226 is the five-test row, and using it to conclude that the climb is slow understates how easily a table with twenty cells grows a positive. The table also explains why a confirmatory trial pre-specifies a single primary endpoint: not because the other endpoints do not matter, but because the 0.05 threshold only means anything under the premise of one test.
In the simulation all three adjustment procedures land near the nominal family-wise error rate, while no adjustment gives 0.643. Does that show the three procedures are equivalent?
Show the answer and why
Correct answer: No. Benjamini-Hochberg reaches 0.0512 here only because every true effect in this simulation is zero; once some effects are real it rejects more than Bonferroni, at the price of a share of the claimed positives being wrong
0.0512 and 0.0506 really are almost identical in this simulation, but only because every true effect is zero - under a complete null, false-discovery-rate control and family-wise error control coincide. What they guarantee differs: Bonferroni and Holm hold the probability of any false positive anywhere in the set below the threshold, while Benjamini-Hochberg holds the share of the claimed positives that are wrong. So reading 0.0506 against 0.0512 as Bonferroni being safer goes wrong twice over: a gap that small across five thousand simulated trials is noise, and the two numbers are not measuring the same thing, which leaves the comparison with nothing to mean. 0.0500 is the nominal value, and all three hugging it does not make them interchangeable either. The choice starts from what one error costs: deciding whether a drug reaches the market cannot tolerate a single false positive, while picking a hundred genes out of thirty thousand for follow-up experiments can tolerate several wrong ones.
One point on the volcano plot floats above the unadjusted line at 0.05, with a raw p of 0.029, and all twenty endpoints in this plot are genuinely null. Which statement is right?
Show the answer and why
Correct answer: That point is a false positive. Adjusted, it becomes 0.5711, and nothing at all clears the green line - whether a point floats above a line on a volcano plot is a conclusion, not a property of the data
0.5711 is the same point after adjustment, nowhere near any threshold, and nothing clears the green line. All twenty endpoints are genuinely null, so whatever floats above the red line has to be a false positive, and the expected number of them was twenty times 0.05 all along. 0.3870 is that point's effect size, and it is indeed the most extreme of the batch, but under a complete null the most extreme value is just the maximum of random variation, so magnitude cannot vouch for significance. 0.0025 is the bottom rung of the step-up ladder in this particular run: nothing cleared its own rung, so the line drops to the foot of the ladder and coincides numerically with the Bonferroni threshold. Reading not far from the threshold as borderline evidence lets a visible number override a computable conclusion. The first thing to ask about a volcano plot is which kind of threshold that line is, because the same points change verdict with the line, and moving the line requires re-running nothing.
A trial has one outcome and one true effect, and every subgroup shares exactly the same true effect. Split into 6 subgroups, what is the probability of at least one significant and at least one non-significant subgroup?
Show the answer and why
Correct answer: 0.9665. A split result is nearly inevitable, because each subgroup holds a fraction of the trial and loses power with it, so two subgroups with identical effects land on opposite sides of the threshold as soon as one is lucky and the other is not
0.9665 is close to a certainty, and the truth is that every subgroup has exactly the same effect. This column is where sentences like the drug works in one group and not in another come from, and how much they are worth depends on how finely the trial was cut. 0.0570 is the interaction test's false-positive rate in the same row - that is the column hugging the nominal threshold, and it is also the right question to ask: not which subgroup is significant, but whether the subgroups genuinely differ. 0.1135 is the split rate with only two subgroups, an entirely different scale from 0.9665, so this table refutes the claim that the number of subgroups barely matters. A subgroup analysis split by sex alone and a finely cut forest plot are not the same order of problem. What a subgroup analysis should look like: pre-specified, few, reporting the interaction p value, and read as hypothesis generation rather than hypothesis testing.
The subgroup split rate is 0.987 at 8 subgroups and edges down at 10. Does that fall mean the problem has eased?
Show the answer and why
Correct answer: No. At 10 subgroups it is 0.9755, and the fall happens because every subgroup is now too small, so all non-significant starts to become common, and all non-significant is not a split
0.9755 is a little below 0.987, but that is not good news: cut finely enough and each subgroup holds only a few dozen, so all non-significant starts to become common, and all non-significant is not a split. A falling split rate means the information has been diluted until nothing is visible, not that the inference has become reliable. 0.0695 is the interaction test's false-positive rate in the same row, slightly above nominal, and it comes from the large-sample approximation straining when each subgroup is tiny - past a certain number of subgroups even the correct test starts to misbehave. 0.7620 is the four-subgroup row rather than the ten-subgroup one, and the claim riding on it wires together two columns that do not connect: the interaction test lives in the column on the right and rises as the subgroups multiply - 0.0695 is its bottom entry - so nothing about it presses the split rate on the left downwards. This column is not monotone, and reading it means asking why it fell.
Five thousand simulated trials, each testing twenty endpoints whose true effects are all zero. How many false positives does an average trial grow?
Show the answer and why
Correct answer: 0.995. Twenty times 0.05 is exactly this figure - an average trial grows one significant result, and all of them are false
0.995 is the average count, and 0.05 times twenty is precisely it. 0.643 is a different quantity: the share of trials carrying at least one false positive. The two are not equal, because a single trial can grow more than one - the busiest run in this batch grew five - so the average count exceeds the at-least-one share. 0.226 is the at-least-one probability when only five tests are run, and using it to conclude that twenty tests are not a problem understates a table with twenty cells. The practical translation: a table reporting twenty secondary endpoints is expected to have one fall below the threshold, so when a significant secondary endpoint turns up, the first question is how many cells the table has.
Chapters that use this method
Sources and licences
- CONSORT 2025 Statement: Updated Guideline for Reporting Randomised TrialsCC BYStating whether a subgroup analysis was pre-specified is a long-standing requirement of the CONSORT family of reporting guidelines; this page cites that requirement only, and the prose is original.