← Back to Learning Hub

Risk of Bias: RoB2, ROBINS-I, AMSTAR-2

GRADE certaintyRisk of biasAdvanced21 min

By: Anacodic Team

TL;DRRisk of bias is the chance a study's design or conduct pushed its result away from the truth systematically (not by random noise). Three standard tools cover the three situations: RoB2 for randomized trials (5 domains), ROBINS-I for non-randomized studies of interventions (7 domains), and AMSTAR-2 for judging a systematic review itself (16 items). They all share one pattern: a reviewer answers signaling questions (yes / probably yes / probably no / no) → a fixed algorithm maps those answers to a domain judgment → the domains combine into an overall judgment (RoB2 uses worst-domain logic). Because the algorithm is a fixed lookup, the signaling → judgment step should be code, not vibes — the human answers the questions, the code applies the rule identically every time. These risk-of-bias calls feed the "risk of bias" domain of GRADE: Rating Certainty of Evidence.


1. Simple explanation

Random error is the coin coming up heads a few extra times by luck — more data averages it out. Bias is different: it's the coin being physically weighted. No amount of extra flipping fixes a loaded coin. In studies, bias is any systematic feature of how the study was run that tilts the answer in one direction — and a bigger study just gives you a more precise wrong number.

Risk of bias assessment is the structured inspection that asks: for each way a study could be tilted, how worried should we be? You don't re-run the study; you interrogate how it was built.

There are three inspectors for three jobs:

  • RoB2 — for a single randomized trial (the gold standard, but still breakable).
  • ROBINS-I — for a non-randomized study of an intervention (no randomization, so confounding is the big fear).
  • AMSTAR-2 — for a whole systematic review (did the reviewers do their job properly?).

Which tool you use is decided by the study design. If you're fuzzy on RCT vs cohort vs case-control vs systematic review, read Study Designs & the Evidence Hierarchy first.

Analogy — the restaurant health inspection. An inspector doesn't taste every dish (that's the result). They check the process: is the fridge cold enough? are hands washed? is raw meat separated from salad? Each check is a signaling question with a yes/no-ish answer. A fixed rulebook turns those answers into a rating for each area (kitchen, storage, service), and the worst serious violation caps the whole restaurant's grade — one failed critical check and you're "High risk," no matter how clean the floors are. Risk-of-bias tools work exactly like this: standardized questions, a rulebook that maps answers to a domain rating, and an overall grade that (for RoB2) follows worst-domain logic.

The point of the rulebook is consistency: two inspectors who see the same kitchen should give the same grade. That only happens if the answers → grade step is a fixed rule, not a gut feeling.


2. Diagram

   RISK OF BIAS = "did HOW the study was run push the result away from the truth?"

   PICK THE TOOL BY WHAT YOU'RE JUDGING
   ------------------------------------
      Randomized trial ................ RoB2       (5 domains)
      Non-randomized intervention ..... ROBINS-I   (7 domains)
      A whole systematic review ....... AMSTAR-2   (16 items, some CRITICAL)

   THE UNIVERSAL PATTERN (all three tools)
   ---------------------------------------
      SIGNALING QUESTIONS        DETERMINISTIC          DOMAIN            OVERALL
      (per domain)               ALGORITHM              JUDGMENT          JUDGMENT
      Y / PY / PN / N     --->   fixed lookup    --->   Low / Some  --->  combine
      (probably yes/no)          (the rulebook)         / High            domains

   RoB2 (randomized trials) — 5 domains, judged Low / Some concerns / High
   ----------------------------------------------------------------------
      D1 randomization process
      D2 deviations from intended interventions
      D3 missing outcome data
      D4 measurement of the outcome
      D5 selection of the reported result
              |
              v   OVERALL = WORST-DOMAIN logic
      any domain High ............................ OVERALL High
      else any domain Some concerns .............. OVERALL Some concerns
      else all Low ............................... OVERALL Low

   ROBINS-I (non-randomized) — 7 domains, judged Low / Moderate / Serious / Critical
   --------------------------------------------------------------------------------
      confounding | selection | classification | deviations |
      missing data | measurement | selection of reported result
      OVERALL = worst domain (Critical in any -> Critical overall)

   AMSTAR-2 (systematic reviews) — 16 items, some CRITICAL
   -------------------------------------------------------
      overall confidence: High / Moderate / Low / Critically low
      driven by how many CRITICAL items fail (1 critical flaw -> Low; >1 -> Critically low)

3. How it works

3.1 What risk of bias is (and is not)

Risk of bias is systematic error from study design/conduct. It is not:

  • Imprecision (that's random error — wide CIs, few events; handled separately in GRADE).
  • Indirectness (the study is well-run but answers a slightly different question).
  • Reporting quality (a study can be poorly written but well-conducted, or vice versa).

A useful phrase: risk of bias is about internal validity — "within this study, is the comparison fair?" Confounding, broken blinding, selective dropout, and cherry-picked outcomes all break internal validity.

3.2 Three tools, three jobs

ToolJudgesDomains / itemsJudgment labels
RoB2one randomized trial (per outcome)5 domainsLow / Some concerns / High
ROBINS-Ione non-randomized study of an intervention7 domainsLow / Moderate / Serious / Critical
AMSTAR-2one systematic review (the review itself)16 items (some critical)High / Moderate / Low / Critically low

Pick by the object under inspection: a trial, a non-randomized study, or a review. Using RoB2 on an observational study (or AMSTAR-2 on a single trial) is a category error.

3.3 RoB2 — the five domains

For each outcome of a randomized trial:

DomainBias it targetsExample signaling concern
D1 Randomization processselection/allocation biaswas the sequence random and concealed? baseline imbalance?
D2 Deviations from intended interventionsperformance biasdid people know their arm? big crossovers/non-adherence?
D3 Missing outcome dataattrition biaswas outcome data available for most? is dropout related to outcome?
D4 Measurement of the outcomedetection biaswere assessors blinded? is the measure influenced by group knowledge?
D5 Selection of the reported resultreporting biaswas this outcome/analysis pre-specified, or chosen after seeing data?

3.4 ROBINS-I — the seven domains (non-randomized)

Because there's no randomization, ROBINS-I front-loads confounding, and its worst label is Critical (basically "too flawed to trust"):

   Pre-intervention   D1 confounding                 (the big one w/o randomization)
                      D2 selection of participants
   At-intervention    D3 classification of interventions
   Post-intervention  D4 deviations from intended interventions
                      D5 missing data
                      D6 measurement of outcomes
                      D7 selection of the reported result
   Labels: Low / Moderate / Serious / Critical   (overall = worst domain)

3.5 AMSTAR-2 — judging the review itself

AMSTAR-2 doesn't grade a primary study; it grades whether a systematic review was done well: did they register a protocol, do a comprehensive search, justify exclusions, assess risk of bias of included studies, handle heterogeneity, consider publication bias, etc. Some of its 16 items are flagged critical. Overall confidence drops fast when critical items fail:

Critical flawsNon-critical weaknessesOverall confidence
00–1High
0multipleModerate
1anyLow
>1anyCritically low

3.6 The universal pattern: signaling → algorithm → domain → overall

Every one of these tools works the same way:

   1. SIGNALING QUESTIONS   reviewer answers Y / PY / PN / N (probably-yes / probably-no)
   2. ALGORITHM             a FIXED lookup maps the answer pattern to a domain label
   3. DOMAIN JUDGMENT       Low / Some concerns / High  (or the tool's labels)
   4. OVERALL               combine domains — RoB2 & ROBINS-I use WORST-DOMAIN logic

Worst-domain logic is the crucial combine rule for RoB2 and ROBINS-I: the overall judgment is as bad as the worst single domain. One "High" domain makes the whole study "High risk," because a single fatal flaw can invalidate the result regardless of how clean everything else is. (It's the loaded-coin logic: one loaded coin ruins the game.)

3.7 Why the algorithm must be code, not vibes

The signaling questions need a human: "was allocation concealed?" requires reading the methods. But step 2 — mapping the answer pattern to a domain label — is a fixed decision table published by the tool's authors. Applying a lookup table by hand, dozens of times, across dozens of studies, is exactly where humans drift and disagree. A general engineering principle applies cleanly here: let the expert (or an LLM) answer the signaling questions, and let deterministic code run the published algorithm to produce the domain and overall judgments. Same answers must always yield the same judgment — and only code guarantees that. Judgment in (the answers), rules in code (the mapping).


4. The rules / worked example

4.1 RoB2 domain and overall rules, compactly

   Per domain, from the signaling answers, the published algorithm yields:
      Low            no concerns triggered
      Some concerns  a question flags a possible (not clearly serious) problem
      High           a question flags a clearly serious problem

   OVERALL (RoB2) — worst-domain logic:
      if any domain == High           -> Overall = High
      elif any domain == Some concerns-> Overall = Some concerns
      else                            -> Overall = Low

4.2 Worked example — a single RCT, one outcome

An open-label trial of physiotherapy vs usual care; outcome = self-reported pain.

   D1 Randomization
      Q: random sequence?           -> Yes
      Q: allocation concealed?      -> Yes
      Q: baseline groups similar?   -> Yes
      => domain D1 = LOW

   D2 Deviations from intended interventions
      Q: participants aware of arm? -> Yes (open-label)
      Q: deviations balanced/none affecting outcome? -> Probably yes
      => domain D2 = SOME CONCERNS

   D3 Missing outcome data
      Q: data for (nearly) all?     -> Yes (4% dropout, balanced)
      => domain D3 = LOW

   D4 Measurement of the outcome
      Q: outcome assessor blinded?  -> No (self-reported pain, patient unblinded)
      Q: could knowledge of arm influence a SUBJECTIVE outcome? -> Yes
      => domain D4 = HIGH        (a subjective outcome measured by an unblinded patient)

   D5 Selection of the reported result
      Q: analysis pre-specified in a protocol? -> Yes
      => domain D5 = LOW

   COMBINE (worst-domain logic)
      D1 Low, D2 Some concerns, D3 Low, D4 HIGH, D5 Low
      any High? YES (D4)  ->  OVERALL = HIGH

   FINAL: OVERALL RISK OF BIAS = HIGH  (driven by D4)

Say it out loud: "Randomization was fine, but the outcome is subjective pain reported by patients who knew their treatment — that's serious detection bias, so overall this trial is High risk for this outcome." Note the worst domain wins: four clean domains can't rescue one High.

4.3 The same study, different outcome

If the outcome were mortality (objective, from records) instead of self-reported pain, D4 would likely be Low (death is hard to mis-measure regardless of blinding). Then the worst domain would be D2's "Some concerns," and overall = Some concerns. Same trial, different risk of bias per outcome — which is why RoB2 is applied per outcome.


5. Real code

A deterministic RoB2 evaluator. The human answers the signaling questions per domain; simplified published-style rules turn those answers into domain labels; and overall_rob2() applies worst-domain logic. The rules here are illustrative of the tool's structure, not a substitute for the official algorithm — but the shape (answers → fixed rule → domain → worst-domain overall) is exactly right.

"""Deterministic RoB2 (randomized-trial) risk-of-bias evaluator.

The reviewer supplies the SIGNALING ANSWERS (Y / PY / PN / N). The functions apply
FIXED rules to get each domain judgment, then combine with WORST-DOMAIN logic.
Same answers -> same judgment, every time. (Rules are a teaching simplification of
the official RoB2 algorithm; the structure is the real thing.)
"""
from enum import IntEnum

class Judg(IntEnum):          # ordered so max() = "worst"
    LOW = 0
    SOME = 1
    HIGH = 2

LABEL = {Judg.LOW: "Low", Judg.SOME: "Some concerns", Judg.HIGH: "High"}

# signaling answers: 'Y' yes, 'PY' probably yes, 'PN' probably no, 'N' no
YESISH = {"Y", "PY"}
NOISH = {"N", "PN"}


def d1_randomization(a: dict) -> Judg:
    """D1: random sequence + concealed allocation + no baseline imbalance."""
    if a["random_sequence"] in NOISH or a["allocation_concealed"] in NOISH:
        return Judg.HIGH
    if a["baseline_balanced"] in NOISH:
        return Judg.SOME
    return Judg.LOW


def d2_deviations(a: dict) -> Judg:
    """D2: awareness of assignment + whether deviations affected the outcome."""
    if a["deviations_affected_outcome"] in YESISH:
        return Judg.HIGH
    if a["participants_aware"] in YESISH:
        return Judg.SOME          # aware but no outcome-affecting deviation
    return Judg.LOW


def d3_missing_data(a: dict) -> Judg:
    """D3: was outcome data available for (nearly) all, and is missingness benign?"""
    if a["data_for_nearly_all"] in YESISH:
        return Judg.LOW
    if a["missingness_related_to_outcome"] in YESISH:
        return Judg.HIGH          # differential dropout tied to the outcome
    return Judg.SOME


def d4_measurement(a: dict) -> Judg:
    """D4: subjective outcome + unblinded assessor is the classic HIGH."""
    if a["assessor_blinded"] in YESISH:
        return Judg.LOW
    if a["outcome_subjective"] in YESISH:
        return Judg.HIGH          # unblinded assessor + subjective outcome
    return Judg.SOME              # unblinded but objective outcome


def d5_reported_result(a: dict) -> Judg:
    """D5: was this result pre-specified, or picked after seeing the data?"""
    if a["prespecified"] in YESISH:
        return Judg.LOW
    return Judg.HIGH if a["selected_from_many"] in YESISH else Judg.SOME


def overall_rob2(domains: dict) -> Judg:
    """WORST-DOMAIN logic: overall is as bad as the worst single domain."""
    return Judg(max(domains.values()))     # HIGH(2) beats SOME(1) beats LOW(0)


def assess_rob2(answers: dict) -> dict:
    d = {
        "D1_randomization": d1_randomization(answers),
        "D2_deviations":    d2_deviations(answers),
        "D3_missing_data":  d3_missing_data(answers),
        "D4_measurement":   d4_measurement(answers),
        "D5_reported":      d5_reported_result(answers),
    }
    overall = overall_rob2(d)
    return {
        "domains": {k: LABEL[v] for k, v in d.items()},
        "overall": LABEL[overall],
        "driven_by": [k for k, v in d.items() if v == overall and overall == Judg.HIGH],
    }


if __name__ == "__main__":
    # Open-label physio trial, SELF-REPORTED PAIN outcome
    pain = assess_rob2({
        "random_sequence": "Y", "allocation_concealed": "Y", "baseline_balanced": "Y",
        "participants_aware": "Y", "deviations_affected_outcome": "PN",
        "data_for_nearly_all": "Y", "missingness_related_to_outcome": "N",
        "assessor_blinded": "N", "outcome_subjective": "Y",       # <- the killer
        "prespecified": "Y", "selected_from_many": "N",
    })
    print("PAIN   :", pain["overall"], "driven by", pain["driven_by"])  # High / D4

    # SAME trial, MORTALITY outcome (objective) -> D4 no longer High
    death = assess_rob2({
        "random_sequence": "Y", "allocation_concealed": "Y", "baseline_balanced": "Y",
        "participants_aware": "Y", "deviations_affected_outcome": "PN",
        "data_for_nearly_all": "Y", "missingness_related_to_outcome": "N",
        "assessor_blinded": "N", "outcome_subjective": "N",       # objective outcome
        "prespecified": "Y", "selected_from_many": "N",
    })
    print("DEATH  :", death["overall"])                            # Some concerns (D2)

The load-bearing details: Judg is an ordered IntEnum so the entire worst-domain combine rule collapses to max(domains.values()); and the only difference between the "High" and "Some concerns" runs is one signaling answer (outcome_subjective), showing how the fixed algorithm — not the reviewer's mood — produces the verdict. Change an answer, the rule re-derives the judgment identically.


6. Real-world example

Scenario: a systematic review pools six trials, and the risk-of-bias table changes what gets pooled.

A review of a diabetes drug pools six RCTs for the outcome "severe hypoglycemia." Each trial is run through RoB2 per this outcome:

TrialD1 rand.D2 deviationsD3 missingD4 measureD5 reportedOverall
ALowLowLowLowLowLow
BLowSomeLowLowLowSome concerns
CLowLowHigh (30% dropout, differential)LowLowHigh
DLowLowLowLowLowLow
EHigh (no allocation concealment)LowLowLowLowHigh
FLowSomeLowLowHigh (outcome switched post-hoc)High
   Reading the table (worst-domain logic per row):
     - A, D: clean across all 5 domains        -> Low.
     - B    : unblinded but no outcome-affecting deviation -> Some concerns.
     - C    : heavy differential dropout        -> D3 High  -> Overall High.
     - E    : allocation not concealed          -> D1 High  -> Overall High.
     - F    : reported outcome chosen after data -> D5 High -> Overall High.

   Half the trials are High risk, each for a DIFFERENT reason. One High domain sinks
   the whole trial regardless of its clean domains.

Downstream impact: the review reports the pooled effect but flags that 3 of 6 trials are High risk. In GRADE: Rating Certainty of Evidence, that dominant risk-of-bias problem triggers a −1 (or −2) downgrade on the "risk of bias" domain, pulling certainty from HIGH toward LOW. A common sensitivity analysis then re-pools using only the low-risk trials (A, B, D); if the effect holds, confidence rises, and if it vanishes, the pooled estimate was being propped up by biased studies. The risk-of-bias table is not paperwork — it directly drives which studies you trust and how loudly the guideline can speak.


7. Interview questions companies actually ask

Q1 [easy] (health-tech, HTA, pharma) "What's the difference between risk of bias and imprecision?"
  A Risk of bias is SYSTEMATIC error from how the study was run (a loaded coin) — more data
    doesn't fix it. Imprecision is RANDOM error (wide CIs, few events) that shrinks with more
    data. GRADE handles them as separate downgrade domains.

Q2 [easy] (evidence teams) "Which tool for which study?"
  A RoB2 for randomized trials, ROBINS-I for non-randomized studies of interventions, AMSTAR-2
    for judging a systematic review itself. Match the tool to the object you're inspecting.

Q3 [medium] (Cochrane-style orgs) "Name RoB2's five domains."
  A Randomization process; deviations from intended interventions; missing outcome data;
    measurement of the outcome; selection of the reported result. Each judged Low / Some concerns
    / High from signaling questions.

Q4 [medium] (guideline developers) "How does RoB2 combine domains into an overall judgment?"
  A Worst-domain logic. Any domain High -> overall High; else any Some concerns -> overall Some
    concerns; else Low. One serious flaw sinks the whole assessment, because it can invalidate
    the result regardless of the other domains.

Q5 [medium] (EBM roles) "Why does ROBINS-I have a 'Critical' level and lead with confounding?"
  A Because it judges NON-randomized studies, where confounding isn't balanced by randomization —
    so confounding is the first, biggest domain, and 'Critical' means the study is too
    problematic to provide useful evidence at all (worse than 'Serious').

Q6 [medium] (HTA, payers) "What does AMSTAR-2 actually grade, and what drives its overall rating?"
  A The systematic review itself — did the reviewers register a protocol, search comprehensively,
    assess included studies' risk of bias, handle heterogeneity and publication bias, etc. Some of
    the 16 items are CRITICAL; one critical flaw -> Low confidence, more than one -> Critically low.

Q7 [hard] (methodologists) "Same trial can be Low risk for one outcome and High for another.
   How?"
  A Because RoB2 is applied PER OUTCOME. An unblinded trial is High for a subjective outcome
    (self-reported pain — detection bias) but Low for an objective one (mortality from records).
    D4 measurement flips, and worst-domain logic changes the overall.

Q8 [hard] (platform / tooling roles) "You're automating RoB2. What must a human do vs code?"
  A The human answers the SIGNALING QUESTIONS (needs reading the methods). Code runs the published
    ALGORITHM that maps answers -> domain, and applies worst-domain logic for overall. The mapping
    is a fixed lookup table, so it must be deterministic code — hand-applying it across dozens of
    studies is where reviewers drift and disagree.

Q9 [hard] (evidence synthesis) "How does risk of bias feed GRADE and the pooled estimate?"
  A A high proportion of high-risk studies triggers a GRADE 'risk of bias' downgrade (-1 or -2),
    lowering certainty. Practically, you also run a sensitivity analysis pooling only low-risk
    studies — if the effect holds, confidence rises; if it disappears, the estimate was propped
    up by biased trials.

Q10 [medium] (any EBM interview) "What is 'selection of the reported result' bias?"
  A Choosing which outcome/analysis/timepoint to report AFTER seeing the data (e.g., switching the
    primary outcome, reporting only the flattering subgroup). It's guarded by checking the result
    against a pre-registered protocol/analysis plan; unregistered, post-hoc reporting -> High.

8. When to use / tradeoffs

   USE a risk-of-bias tool when:
     ✓ you're synthesizing evidence and must judge each study's internal validity
     ✓ you need a transparent, per-domain, reproducible assessment (not 'looks fine to me')
     ✓ you'll feed the result into GRADE's risk-of-bias downgrade or a sensitivity analysis

   PICK THE RIGHT TOOL:
     • RoB2      -> randomized trials (per outcome)
     • ROBINS-I  -> non-randomized studies of interventions (confounding front and center)
     • AMSTAR-2  -> the systematic review itself

   STRENGTHS:
     • standardized signaling questions -> less reviewer drift
     • worst-domain logic makes fatal flaws impossible to hide behind clean domains
     • the answers->judgment step is a fixed rule -> codifiable and auditable

   HONEST LIMITS:
     ✗ the SIGNALING ANSWERS are still judgment calls -> two reviewers can disagree on inputs
       (best practice: two independent assessors + a documented reconciliation)
     ✗ risk of bias != study QUALITY or reporting quality -> a well-written study can be biased
     ✗ it's per-OUTCOME (RoB2) -> one 'overall' label for a whole trial is usually wrong
     ✗ worst-domain logic can feel harsh (one High sinks everything) — but that's the point
     ✗ AMSTAR-2 grades the review's METHODS, not whether its conclusion is correct

   RULE OF THUMB: use two independent assessors for the SIGNALING questions, reconcile
   disagreements explicitly, then let CODE apply the algorithm and worst-domain logic so the
   final judgment is reproducible.

  • Risk of bias = systematic (not random) error from how a study was designed or run — a loaded coin more data can't fix.
  • Three tools, three jobs: RoB2 (randomized trials, 5 domains), ROBINS-I (non-randomized, 7 domains, adds Critical), AMSTAR-2 (systematic reviews, 16 items, some critical).
  • The universal pattern: signaling questions → fixed algorithm → domain judgment → overall (RoB2 & ROBINS-I use worst-domain logic).
  • RoB2 domains: randomization, deviations, missing data, measurement, selection of reported result — judged Low / Some concerns / High, per outcome.
  • One High domain sinks the whole assessment; a well-written study can still be biased.
  • Humans answer the signaling questions; the algorithm should be deterministic code so the same answers always give the same judgment.
  • Risk of bias feeds the GRADE: Rating Certainty of Evidence risk-of-bias downgrade and drives sensitivity analyses.

Related: GRADE: Rating Certainty of Evidence · 2×2 Tables & Effect Measures (OR, RR, RD, NNT, HR) · Summary of Findings & Evidence-to-Decision

Resources

Runnable notebook

Run it end to end — the mock model needs no API key; add your own key for the real Claude section.

Open In Colab