Skip to main content
Back to blog
Bayesian Statistics
Convergence Diagnostics
MCMC
PyMC
R-hat

Who Decided R-hat Had to Be 1.01?

How Bayesian convergence went from 1.2 to 1.1 to 1.05 to 1.01, and why none of those numbers is actually a law. The statistic, the published recommendation and the software warning all moved on different clocks, and in 2026 the major packages still do not agree on one number.

Niall OultonAugust 27, 202613 min read

Open a recent PyMC model with one awkward parameter and you may see a very specific warning:

The rhat statistic is larger than 1.01 for some parameters. This indicates problems during sampling.

That number feels oddly precise. Why 1.01? Why not 1.1, which many people learned from older books, blogs and Stan-era folklore? Why do some packages still use 1.05, while others are looser still? And if one nuisance parameter lands at 1.02, did the whole posterior suddenly become unusable?

This post is the answer, but in a format you can skim.

Published recommendation
19 Mar 2019
Vehtari et al. recommend modern R-hat with at least four chains, and trusting the sample only when R-hat < 1.01.
PyMC warning threshold
4 Mar 2022
PyMC PR #5516 removes the old 1.4 / 1.2 / 1.05 warning bands and replaces them with a single 1.01 check.
Universal law?
Never
1.01 never became a universal mathematical requirement. It is a very good conservative alarm, not a theorem of Bayesian inference.

Short version: the modern recommendation appears in 2019, ArviZ implements it almost immediately, PyMC turns it into a warning in 2022, and the broader ecosystem still does not fully agree on one number in 2026.

Timeline from the 1992 Gelman and Rubin paper through the 2019 recommendation and the 2022 PyMC pull request to the mixed package defaults of 2026
The statistic, the recommendation and the software warning all moved on different clocks.Swipe the chart to see all of it

Convergence in 60 seconds

If you only remember one idea from this whole article, make it this one:

Convergence means the chains have stopped meaningfully remembering where they started and are now exploring the same stationary target distribution.

That matters because MCMC draws are only useful if the sampler is actually spending time in the right parts of the posterior. If different chains disagree about where the posterior is, or one chain is still drifting, any summary you compute from those draws can be misleading.

Illustration of chains started in different places settling into the same stationary distribution
The basic intuition. Good convergence means independently started chains end up looking like samples from the same distribution.Swipe the chart to see all of it

What R-hat asks

R-hat compares two things:

  • within-chain variation: how variable each chain is by itself;
  • between-chain variation: how different the chains are from one another.

If the chains are all sampling the same stationary target, those two stories should broadly agree. If not, between-chain variation stays inflated and R-hat rises above 1.

What R-hat does not guarantee

R-hat is useful, but humble.

  • It does not prove the model is correct.
  • It does not prove the sampler found every mode.
  • It does not mean a parameter at 1.02 is either automatically fatal or automatically fine.
  • It does not replace divergences, ESS, MCSE, rank plots or posterior predictive checks.

So yes, it is important. No, it is not magic.

The formula, without the pain

Suppose we have M chains and N post-warmup draws per chain. For some scalar posterior quantity, define:

  • W: the average within-chain variance
  • B: the between-chain variance based on the chain means
  • +: a pooled estimate of marginal variance

Then a familiar form of the diagnostic is:

R̂ = √( V̂+ / W )

If between-chain and within-chain information agree, R̂ approaches 1.

Visual derivation of R-hat from within-chain and between-chain variance
The idea behind R-hat is simple: if separate chains tell the same variance story, the ratio moves towards one.Swipe the chart to see all of it

Why split R-hat became a thing

Classic R-hat could miss some forms of slow within-chain drift. Splitting each chain in half turns a temporal problem into a cross-chain disagreement problem.

Diagram showing a drifting chain split into two halves that disagree with each other
Splitting each chain in half makes it easier to catch the case where one chain is still moving.Swipe the chart to see all of it

The short history of acceptable numbers

The threshold story is easier to follow if you separate the statistic, the recommendation, and the package default.

1992: Gelman and Rubin introduce the idea

The original 1992 paper, Inference from Iterative Simulation Using Multiple Sequences, introduced the potential scale reduction factor, or PSRF, from which modern R-hat descends.

Important detail: they did not hand down 1.01 as a law.

They introduced a diagnostic that should be near one when multiple chains agree. The exact numeric cutoffs came later through practice, pedagogy and software.

1998: 1.2 and 1.1 become part of the culture

Brooks and Gelman extended the diagnostic toolkit in 1998. Around this era, 1.2 was a common practical threshold, with 1.1 later becoming the better-known conservative rule of thumb.

This is the period many older answers on forums, blogs and lecture notes still reflect.

2013: split-R-hat becomes mainstream

By the Bayesian Data Analysis third edition era, split-R-hat had become normal workflow in the Stan world.

That matters because the statistic itself was improving, even before the 1.01 recommendation arrived.

2018: Vats and Knudson challenge the old comfort zone

In Revisiting the Gelman-Rubin Diagnostic, Vats and Knudson linked Gelman-Rubin style diagnostics to effective sample size.

That changed the conversation. Instead of asking only whether 1.1 is close enough to 1, we could ask how much Monte Carlo precision we need for the quantity we actually care about.

That is a far better question.

19 March 2019: the real origin of the modern 1.01 recommendation

This is the key date.

Vehtari, Gelman, Simpson, Carpenter and Bürkner released the preprint that introduced the modern rank-normalised, folded, split R-hat and explicitly recommended:

  • at least four chains, and
  • only using the sample if R-hat < 1.01.

The later journal version appeared in Bayesian Analysis in 2021.

That paper also explains why the tighter threshold is useful. In their synthetic trend experiment, 1.01 detects much subtler non-stationarity than 1.1.

Comparison showing that a 1.01 threshold flags drift that a 1.1 threshold passes
The tighter threshold was not chosen for aesthetics. It catches problems 1.1 can miss.Swipe the chart to see all of it

What changed in the statistic itself?

When people compare old 1.1 with new 1.01, they often talk as though only the cutoff changed. It did not. The statistic improved too.

VariantWhat it adds
ClassicCompares within-chain and between-chain variation using raw means and variances.
SplitSplits each chain in half, so slow within-chain drift shows up as disagreement between the halves.
Rank-normalisedReplaces fragile raw-scale behaviour with rank-based normal scores, which is far more robust in heavy-tailed situations.
FoldedHelps detect differences in scale even when the chain means look similar.

So when the community moved towards 1.01, it was also moving towards a better diagnostic, not just a fussier threshold.

The Python ecosystem moved fast

The nice thing about open-source history is that it leaves timestamps behind.

ArviZ moved almost immediately

The chronology is unusually clean:

DateEvent
19 Mar 2019Vehtari et al. preprint and Dan Simpson explainer
20 Mar 2019ArviZ issue #621 opened
21 Mar 2019ArviZ PR #623 opened
11 May 2019ArviZ PR #623 merged

So modern R-hat entered the Python diagnostics ecosystem essentially in real time with the research.

But PyMC itself kept the old warnings for years

This is the part many people miss. PyMC 3.11.5 still had a tiered warning system that looked like this in spirit:

python
if rhat_max > 1.4:
    # sampler did not converge
elif rhat_max > 1.2:
    # warning
elif rhat_max > 1.05:
    # slight problems during sampling

So there was a transition period where:

  • the better diagnostic existed,
  • the 1.01 recommendation existed,
  • but the PyMC warning policy was still from the older era.

The exact PyMC moment: PR #5516

If your question is specifically when did PyMC decide to warn at 1.01, the answer is wonderfully concrete.

PyMC PR #5516, update reported warnings after sampling, was opened on 23 February 2022 and merged on 4 March 2022.

Its logic was simple:

  • warn if R-hat > 1.01;
  • warn if ESS per chain < 100;
  • tell users they should usually run at least four chains.
Before and after view of the PyMC sampling warning code, replacing three tiers with one 1.01 check
This was not a slow drift. One pull request removed the old warning tiers and replaced them with a single 1.01 rule.Swipe the chart to see all of it

PyMC answer: the 1.01 warning threshold was merged on 4 March 2022 and shipped in stable PyMC 4.0.0 on 3 June 2022.

The open-source receipts

None of this is reconstructed from memory. The decision is on the record, in public, with timestamps.

GitHub · PyMC PR #5516 · 23 Feb 2022
“Only report a problem with rhat if it is higher than 1.01.”

That sentence is in the pull request body itself. It is rare to get such a clean line between methodological advice and a package warning.

Open the PyMC pull request →
GitHub review · 24 Feb 2022
“I am biased towards strong wording given how I have seen disastrous diagnostics be ignored very often.”

Reviewer Oriol Abril pushed back on wording that could make a bad R-hat sound harmless. The debate was not only about the number, but about how strongly software should say it.

Open the review comment →
ArviZ issue #621 · opened 20 Mar 2019

Opened one day after the Vehtari preprint, asking for the new R-hat, ESS, quantile-MCSE and rank plots. In the follow-up discussion Aki Vehtari summarised the intended bundle: R-hat, bulk-ESS, tail-ESS, HMC-specific diagnostics and rank plots.

Open the ArviZ issue →Open PR #623 →

What people were learning in the wild

The threshold story did not spread only through papers and pull requests. It spread through books, tutorials, YouTube, Reddit, mailing lists and package warnings.

Timeline of books and teaching material covering convergence diagnostics
Pedagogy usually lags the research a bit, then catches up in layers.Swipe the chart to see all of it

Ben Lambert is a nice marker of the transition

Ben Lambert is a useful example because his teaching spans the old and new eras.

  • In a 2015 Stan users discussion, Lambert described good convergence as R-hat < 1.1.
  • His 2018 book, A Student’s Guide to Bayesian Statistics, arrived right before the 2019 diagnostic shift.
  • Later, Lambert co-authored work on R-star, showing that convergence diagnostics kept evolving even after 1.01 became the new headline number.
Four bees set off from four different heights, wander, and converge on a single shared target region
The argument for four chains rather than one: a single chain has nothing to disagree with.Swipe the chart to see all of it

Reddit and PyMC Discourse show the cultural lag

By 2021 the community was visibly between eras. A highly upvoted r/statistics answer put both numbers in the same sentence:

Reddit · r/statistics · 25 Aug 2021
“I personally worry about values near 1.1 but if most of them are near 1.01 I’m happy.”

That is almost the whole transition in one comment: 1.1 is still the culturally familiar number, while 1.01 has become the reassuring target.

Read the thread →

PyMC Discourse makes the same shift even more explicit. In 2020 a user was still seeing PyMC’s old 1.05 / 1.4 warnings, while a responder told them an R-hat around 1.04 was still high.

PyMC Discourse · Jul 2020
“still on the high side, you want <1.01 ideally”

The community recommendation had already moved, roughly eighteen months before PyMC’s own warning code did.

Open the 2020 thread →
PyMC Discourse · Dec 2023
“How should I deal with values like 1.03?”

Once 1.01 became the printed warning, users started asking what reality changes between the second and third decimal place.

Open the 1.03 thread →

That is what a real standards transition looks like: papers move first, practitioners absorb the new advice, then package warnings catch up.

The standard still is not universal in 2026

That is the history settled, which leaves the more useful question. If 1.01 really had become a universal Bayesian convergence standard, major software would at least broadly agree on it. It does not.

EcosystemWhat the documentation actually says
PyMCAutomatic warning above 1.01, plus ESS-per-chain and chain-count checks.
Stan1.01 for full trust, but 1.1 can be acceptable earlier in the workflow.
RStanCurrent docs still say to use the sample only if R-hat is below 1.05.
bayesplotUses good, ok and too high bands, and calls them somewhat arbitrary.
Google MeridianModel-level pass threshold below 1.2, with manual inspection otherwise.
TensorFlow ProbabilityDescribes this as an approximate, problem-dependent convergence threshold.
Chart of R-hat thresholds used by PyMC, Stan, RStan, bayesplot, Google Meridian and TensorFlow Probability in 2026
Thresholds as documented in August 2026. If a number were truly law, package defaults would not still span 1.01 to 1.2.Swipe the chart to see all of it

So no, 1.01 did not become a universal standard in the literal sense. It became the best-supported modern conservative default in one important part of the ecosystem.

So what do you do when R-hat is 1.02 or 1.03?

Which brings us to the question every practitioner actually has. Sampling has finished, one parameter reads 1.03, and the warning has fired. Not all 1.03s are equally alarming.

Four situations in which an R-hat of 1.03 can appear, from a key decision parameter to finite-run noise
The same printed value can matter more or less depending on what parameter it belongs to and why it is high.Swipe the chart to see all of it

Case 1: it is your key decision parameter

If the elevated R-hat belongs to a treatment effect, elasticity, ROI parameter, forecast quantity or any other estimate that directly drives the decision, investigate properly.

Case 2: it is a weakly identified nuisance parameter

That does not mean ignore it. But it may mean the business or scientific quantity you report is more stable than the nuisance coordinate itself.

Case 3: the model is non-identifiable in that parameterisation

Mixture models with label switching are the classic case. A label-dependent parameter can mix badly even when a label-invariant quantity is behaving well.

Case 4: longer runs make it disappear

Sometimes a slightly high R-hat is just finite-run Monte Carlo noise. If more sampling steadily pulls it down and the rest of the diagnostics are healthy, that is useful evidence.

There is a good worked example of this in the wild:

A useful edge case · PyMC-BART · Nov 2023

One PyMC-BART user still got the global warning even with roughly 90% of R-hat values at or below 1.01. Osvaldo Martin pointed to reports of good BART predictions even where some convergence diagnostics stay awkward, and suggested inspecting the convergence plot rather than treating one bad coordinate as a model-wide verdict.

Read the discussion →

The right move is not blind acceptance or blind rejection. The right move is: investigate the quantity that matters.

One number is never enough

Treat 1.01 as a useful trigger, not a magical verdict.

Dashboard of convergence diagnostics including R-hat, bulk ESS, tail ESS, MCSE, divergences and rank plots
A good workflow looks across the whole dashboard.Swipe the chart to see all of it

Those six are the minimum for a model you intend to act on, and a posterior predictive check belongs alongside them to say whether the model fits the data at all.

That is the bigger shift in modern Bayesian workflow. The move from 1.1 to 1.01 matters, but the real lesson is that a single scalar diagnostic should never have been treated as the whole story anyway.

If you want to see that dashboard driving a real repair loop rather than a checklist, our companion piece on predicting the better prior before you refit walks through a hierarchical marketing mix model that fails every one of these checks, and what it takes to fix it.

We asked six AI systems the same question

As a side experiment, we asked six frontier models when 1.01 became the standard, while asking them not to invent exact pull request numbers or software versions if they did not know.

The answers were interesting because most models remembered the broad folklore but not the exact software history.

Scorecard comparing six AI models on their answers about the R-hat threshold history
The models broadly understood the statistical shift, but none of them reconstructed the full PyMC implementation history from memory.Swipe the chart to see all of it

Evidence-audited ranking

ModelMain strengthMain issue
Opus 5 HighBest separation of recommendation, software warning and mathematical requirement.Still missed PyMC PR #5516.
Fable 5Strong on March 2019 and careful with uncertainty.Could not pin down adoption dates.
Cursor GrokGood origin versus adoption framing.A few adoption statements were broader than the record.
GPT-5.6 SolVery disciplined about not fabricating missing details.Left the implementation story unresolved.
ComposerGood broad narrative.Some technical attributions were wrong.
Gemini 3.7 FlashSolid on the broad 2018 to 2021 transition.Several unsupported exact claims.

Which is a good argument for being precise about what this article does and does not claim.

What we are not claiming

To keep the message honest:

  • We are not saying 1.01 is too strict.
  • We are not saying 1.03 is automatically acceptable.
  • We are not saying nuisance parameters never matter.
  • We are not saying users should overrule package warnings casually.
  • We are not saying R-hat near 1 proves the posterior is fully explored.

What we are saying is simpler:

1.01 is an excellent alarm setting. It is not a law of Bayesian inference.

The full answer, in one paragraph

If you mean the published modern recommendation, the clean answer is 19 March 2019. If you mean the moment PyMC started warning at 1.01, the answer is 4 March 2022, when PR #5516 merged, shipping in PyMC 4.0.0 in June 2022. If you mean a universal Bayesian standard, that moment never happened.

And the closing point matters most: what counts as acceptable convergence depends on the parameter, the downstream quantity, the amount of Monte Carlo error you can tolerate, and the analyst’s judgement. As always, there is no escaping context.

References
Gelman, A. & Rubin, D. B. (1992). Inference from Iterative Simulation Using Multiple Sequences. doi.org/10.1214/ss/1177011136
Brooks, S. P. & Gelman, A. (1998). General Methods for Monitoring Convergence of Iterative Simulations. doi.org/10.1080/10618600.1998.10474787
Gelman, A. et al. (2013). Bayesian Data Analysis, 3rd ed. stat.columbia.edu/~gelman/book
Vats, D. & Knudson, C. (2018/2021). Revisiting the Gelman-Rubin Diagnostic. arxiv.org/abs/1812.09384
Vehtari, A., Gelman, A., Simpson, D., Carpenter, B. & Bürkner, P-C. (2019/2021). Rank-normalization, folding, and localization: An improved R-hat for assessing convergence of MCMC. arxiv.org/abs/1903.08008 and doi.org/10.1214/20-BA1221
Vehtari et al. online appendix. avehtari.github.io/rhat_ess
Simpson, D. (19 Mar 2019). Maybe it’s time to let the old ways die; or We broke R-hat so now we have to fix it. statmodeling.stat.columbia.edu
PyMC 3.11.5 convergence warnings. pymc3/backends/report.py
PyMC PR #5516 reviewer discussion on warning wording. discussion_r813435737
Stan convergence diagnostics. mc-stan.org/learn-stan/diagnostics-warnings
RStan R-hat reference. mc-stan.org/rstan/reference/Rhat
Google Meridian model health checks. developers.google.com/meridian
TensorFlow Probability potential_scale_reduction. tensorflow.org/probability
Ben Lambert, Stan users discussion (2015). groups.google.com/g/stan-users
Lambert, B. (2018). A Student’s Guide to Bayesian Statistics. uk.sagepub.com
PyMC Discourse, hierarchical logistic regression thread (2020). discourse.pymc.io/t/…/5504
PyMC Discourse, tune and R-hat thread (2023). discourse.pymc.io/t/…/13448
PyMC-BART convergence discussion (2023). discourse.pymc.io/t/…/13257
Reddit r/statistics convergence discussion (2021). reddit.com/r/statistics

SIMBA builds on PyMC-Marketing, so every model ships with the full diagnostic dashboard described here rather than a single pass or fail number. If your model is sitting at 1.03 and you want a second pair of eyes, book a call.

Published on August 27, 2026 by Niall Oulton

All posts