ds@mcpanalytics.aiEmail your data and your question and get an answer about your own data, with the method shown.Email your data and question. Get an answer.
Home › Articles › Multiple comparisons
For analystsStatistical methods

Holm-Bonferroni Method: Formula, Steps and When to Use It

Updated October 2026

Holm limits the chance of any false positive in a family of tests exactly as Bonferroni does, and never keeps fewer results than Bonferroni.

66pairwise correlations among 12 red-wine measurements
55significant at 0.05, uncorrected
43still significant after Holm (and Bonferroni)
By MCP Analytics TeamOctober 2026Real data: 1,599 red wines in the UCI Wine Quality data set (Cortez et al., 2009)

The short answer

Take 66 correlation tests from 1,599 red wines. 55 of them are significant at 0.05. Holm keeps 43, exactly what Bonferroni keeps. Benjamini-Hochberg keeps 54, and it assumes the tests are independent or positively dependent. The 12 that Holm and Bonferroni drop are significant at 0.05 but did not clear the stricter bar, not proven chance results: a stricter bar can drop a true effect.

Have your own p-values? Run Bonferroni, Holm and Benjamini-Hochberg side by side in the free multiple comparisons tool.

For why a correction is needed at all, read the multiple comparisons problem.

Holm never keeps fewer than Bonferroni, and here it keeps the same. It gains only when a p-value lands between alpha / m and alpha / (m - k), where k is how many Bonferroni already keeps. On this data nothing lands there: the first test both methods drop, volatile acidity against total sulfur dioxide (r = 0.076), misses Holm's bar by about 2 percent. So the real choice on this data is strict against lenient, 43 against 54, not Holm against Bonferroni. Holm gives the same guarantee as Bonferroni: whichever of your null hypotheses are true, the chance that you declare even one of those significant stays at or below your alpha. It needs no assumption about how your tests relate to each other.

Our position: if you need that guarantee, use Holm and never plain Bonferroni. If you can live with a known share of false discoveries among your findings, use Benjamini-Hochberg instead. Do not mix the two in one family.

Rank143445566
Bonferroni threshold0.000760.000760.000760.000760.00076
Holm threshold0.000760.002080.002170.004170.05000
Raw p-value of the test at that rank4.1e-2200.000610.002210.04280.939
Kept by Holmyesyesnonono
Bar chart of 66 tests. Uncorrected: 55. Benjamini-Hochberg: 54. Holm: 43. Bonferroni: 43.
Of 66 tests, 55 look significant before any correction. 43 survive Bonferroni and Holm, and 54 survive Benjamini-Hochberg. Data: Cortez, Cerdeira, Almeida, Matos and Reis (2009), Wine Quality (red), UCI Machine Learning Repository, CC BY 4.0.

How the Holm thresholds climb

Chart of the 66 sorted p values. The Holm bar rises from 0.00076 toward 0.05; the Bonferroni bar stays flat at 0.00076. The first 43 tests sit under their bars; ranks 44 to 66 sit above.
Holm's bar climbs with every test while Bonferroni's stays one flat bar. The 66 p values are sorted smallest first; all 43 kept tests sit under their bars (tests 1 to 42 below the zoomed axis floor, test 43 just above it). Data: Cortez, Cerdeira, Almeida, Matos and Reis (2009), Wine Quality (red), UCI Machine Learning Repository, CC BY 4.0.

Holm sorts the p-values from smallest to largest and tests them in that order. The i-th smallest is compared with alpha / (m - i + 1), where m is the number of tests. So the first test faces alpha / 66, the second alpha / 65, and so on, one step easier each time. Here is the walk on the wine family, at alpha 0.05:

RankPairrRaw pHolm barDecision
1fixed acidity ~ pH-0.6834.1e-2200.000758keep
2fixed acidity ~ citric acid0.6722.5e-2100.000769keep
10chlorides ~ sulphates0.3712.0e-530.000877keep
20citric acid ~ quality0.2265.0e-200.001064keep
30total sulfur dioxide ~ quality-0.1858.6e-140.001351keep
40citric acid ~ alcohol0.1101.1e-050.001852keep
41fixed acidity ~ chlorides0.0940.0001750.001923keep
42sulphates ~ alcohol0.0940.0001780.002000keep
43residual sugar ~ pH-0.0860.0006070.002083keep
44volatile acidity ~ total sulfur dioxide0.0760.002210.002174stop

The bar rises from 0.000758 at rank 1, the same as Bonferroni's single cutoff, to 0.002174 at rank 44. Every one of the first 43 p-values sits far below its own bar. Rank 44 is the first to land above it, by a margin of about 0.00004, and that is where the walk ends: Holm retains rank 44 and everything ranked after it, even the tests that would pass an unadjusted 0.05. Only a p-value between Bonferroni's 0.000758 and Holm's 0.002174 at that rank could have been a gain, and none of the 66 falls in that gap. (The bars are arithmetic; the p-values come from the file described below.)

The data behind it

The 66 tests come from the Wine Quality data of Cortez, Cerdeira, Almeida, Matos and Reis (2009), UCI Machine Learning Repository, DOI 10.24432/C56S3T, licensed CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/). The 66 p-values are our computation from the file; the data are unchanged. Every red wine in it has eleven lab measurements and a sensory quality score. Pairing each of those twelve columns with every other gives 66 Pearson tests, all run at alpha 0.05 on the same 1,599 bottles.

Holm's last keeper is residual sugar against pH, with r = -0.086. Its raw p of 0.000607 becomes a Holm-adjusted 0.0146: the raw p times 24, the number of tests still in play at rank 43. That is a correlation you can detect with this many wines and could barely see on a scatter plot. A step-down correction rules on chance, not on size, so read r beside every kept pair.

Because the tests reuse the same bottles, and each column enters eleven pairs, their p-values move together. Holm's guarantee does not depend on that structure, so the 43 stand as they are. If nothing in the data were related, about 3.3 of 66 tests would still reach 0.05 by luck (66 x 0.05).

Holm against the other corrections

MethodError it limitsDecision ruleAssumptionPick it when
BonferroniFamily-wiseEvery test against alpha / mNoneYou must fix the cutoff before any p-value exists
HolmFamily-wiseSorted walk, stop at the first missNoneA single false positive is expensive
HochbergFamily-wiseWalk up from the largest p-valueIndependent or positively dependent testsYou can defend that and want slightly more than Holm
Benjamini-HochbergFalse discovery rateRank-scaled bars, keep up to the last passIndependent or positively dependent testsYou are screening a long list and will follow up

The family-wise rate is the probability of one or more false positives anywhere in the family. Holm holds it at alpha in the strong sense: under every mix of true and false nulls, not only when all are true. That is the whole reason to pick it over a false discovery rate method, whose promise is about the average share of mistakes in the kept set.

Chart of ranks 40 to 48. Ranks 40 to 43 sit under the bars. Rank 44 has p 0.002214, just above the Holm bar of 0.002174, and ranks 45 to 48 sit higher.
The next test, rank 44, has p 0.002214 against the Holm bar 0.002174, just above it, so Holm keeps 43, the same as Bonferroni. Data: Cortez, Cerdeira, Almeida, Matos and Reis (2009), Wine Quality (red), UCI Machine Learning Repository, CC BY 4.0.
Three questions. 1: Are you screening, or confirming? 2: Family-wise guarantee? Holm, not Bonferroni. 3: How many tests did you run? Correct for those.
The three questions that decide which correction fits. Data: Cortez, Cerdeira, Almeida, Matos and Reis (2009), Wine Quality (red), UCI Machine Learning Repository, CC BY 4.0.

Reading a Holm result

  • Each kept test inherits the family's guarantee. With alpha at 0.05, the probability that even one of the 43 is a false positive is at most 5 percent. Report each with its r and interval, because the step-down rule says nothing about magnitude.
  • The stop is final. Once rank 44 misses, ranks 45 to 66 are retained without looking at them, even the ones under 0.05. Do not cherry-pick a later test back in.
  • Retained is not refuted. A test after the stop simply lacked the evidence to clear a bar raised by the size of the family. Its interval is still worth showing.
  • Fix the family before the walk. Dropping a test after seeing it shortens m and loosens every bar; adding a duplicate lengthens m and tightens them.
  • Correlated tests cost Holm power, not validity of its promise. When tests move together strongly, a permutation-based step-down can keep more under the same guarantee.
  • A clear primary outcome changes the design. If one hypothesis matters most, a fixed-sequence or gatekeeping order can beat a flat Holm family.

How to do it on your own data

  1. Gather the unrounded p-value for every test in the family; rounding creates ties that scramble the order.
  2. Sort ascending and number the ranks 1 to m.
  3. Give rank i the bar alpha / (m - i + 1).
  4. Walk from rank 1. Keep while the p-value is at or under its bar. At the first miss, stop and retain that test and all later ones.
  5. For adjusted p-values: multiply p(i) by (m - i + 1), carry the running maximum forward, cap at 1, and compare every result with alpha. Same decisions as the walk.

The walk, written out, then the library call that does it:

import numpy as np
            from statsmodels.stats.multitest import multipletests

            p = np.asarray(p)
            order = np.argsort(p)
            m = len(p)
            keep = np.zeros(m, dtype=bool)
            for step, idx in enumerate(order):          # step 0 is rank 1
                if p[idx] <= 0.05 / (m - step):
                    keep[idx] = True
                else:
                    break                               # Holm stops at the first miss

            reject, p_holm, _, _ = multipletests(p, alpha=0.05, method="holm")
            assert (reject == keep).all()

An illustration, not a result. Six tests with these made-up p-values: 0.001, 0.009, 0.025, 0.040, 0.120, 0.350, at alpha 0.05. The bars are 0.0083, 0.0100, 0.0125, 0.0167, 0.0250, 0.0500. The first two pass (0.001 is at most 0.0083; 0.009 is at most 0.0100). The third, 0.025, is above 0.0125, so the walk stops and the other four are retained. The adjusted p-values are 0.006, 0.045, 0.100, 0.120, 0.240 and 0.350. Four raw p-values are below 0.05, and only two survive.

Planning sample size for Holm. Power each test as if it faced rank 1's bar, alpha / m, because the smallest effect you care about may be the first one tested. Later ranks can only be easier. If that sample is out of reach, shrink the confirmatory family to the questions that matter and move the rest into an exploratory set.

Run it on your own p-values

Paste or upload a column of p-values, up to 10,000 rows, and the free tool returns the Holm decisions and adjusted p-values next to Bonferroni and Benjamini-Hochberg, with the R code that produced them. The ready-check on the left says what the file needs.

Run the free correction on your file · Try the example file first

Questions analysts ask

Is Holm ever worse than Bonferroni?

No. Every hypothesis Bonferroni rejects, Holm rejects too, under the same family-wise guarantee. On the wine family the two tie at 43; elsewhere Holm can keep more. Bonferroni's one advantage is that it needs no sorting.

Does Holm need independent tests?

No. Its control of the family-wise error rate holds under any dependence. Strong positive correlation makes it more conservative than it needs to be, which is a loss of power, not a broken promise.

Why does Holm stop at the first miss instead of checking every test?

Because each bar is only valid if every earlier hypothesis was rejected. Once rank i misses, the argument that justified alpha / (m - i) for rank i + 1 no longer holds, so every later test is retained.

What if my p-values are rounded, or one is reported as less than 0.0001?

Rounding causes ties, which break the ordering; use the unrounded values when you have them. Treat a bound such as <0.0001 as the bound itself. That can only make a result harder to keep, never easier.

How many tests do I need before Holm and Bonferroni differ?

With under about ten tests the two bars barely separate. The gap widens as the family grows and as more tests pass early. For hundreds of tests, a false discovery rate method usually fits the question better.

Writing this up for publication? See statistical analysis for researchers. Citations and R code included.

How we know

How we checked the 66 tests

For Holm, the check that matters most is Few rounded or censored values: Holm walks the ranks in order, so ties change it. It holds here: none repeated or given as a bound. The other four checks run in the free tool.

1

Few rounded or censored values

Rounded p-values tie, and a bound such as <0.0001 is analysed at the bound, which can only make a result harder to keep. Here: none repeated or given as a bound. Holds.

under 10%

Your turn

Bring your own data and the question you actually need answered.

MCP AnalyticsData science by email Send us your data and your question, and we will reply. ds@mcpanalytics.ai

Run it on your family of tests

Upload a file of p-values and see which tests Bonferroni, Holm and Benjamini-Hochberg keep, with the adjusted p-values.