Evidence synthesis — RoB 2 risk of bias and GRADE summary of findings
Risk-of-bias appraisal (RoB 2) for twelve randomised trials, drawn as a traffic-light grid and a summary bar, and the GRADE summary-of-findings table built from the same review. Typed FlowScript for clinical trials. Keywords: CONSORT, randomised, randomized, trial, RCT, flow diagram, PRISMA, cohort.
Make it your own.
// Risk-of-bias appraisal (RoB 2) for twelve randomised trials, drawn as a traffic-light grid and a summary bar, and the GRADE summary-of-findings table built from the same review.
//
// Every string below is EXAMPLE text from a fictional review: replace it.
//
// One bias_assessment per trial per RoB 2 domain, each with the reason
// that supports it, plus the assessors' overall judgement per trial. The
// grid audits every recorded overall against RoB 2's own rule (low only if
// every domain is low; high if any domain is high) and footnotes any that
// its domains contradict, so an overall cannot quietly drift from the
// judgements beneath it. The same judgements feed the summary bar.
//
// The summary-of-findings rows point at an outcome, the pooled estimate
// for it and a grade_outcome that rates GRADE's five downgrading domains.
// The certainty is computed from those ratings by GRADE's stepwise rule,
// and the anticipated absolute effects are computed from the comparator
// risk and the relative effect: nothing in the absolute columns is typed.
// The comparator risks are the pooled control-arm risks of the included
// trials (hospital admission: 384 of 1203 usual-care participants, which
// is 319 per 1000).
study okafor_2012 { title: "Okafor 2012" design: "Randomised, open-label, two-arm" }
study lindqvist_2013 { title: "Lindqvist 2013" design: "Randomised, open-label, two-arm" }
study hartmann_2014 { title: "Hartmann 2014" design: "Randomised, open-label, two-arm" }
study moreau_2015 { title: "Moreau 2015" design: "Randomised, assessor-blinded, two-arm" }
study tanaka_2016 { title: "Tanaka 2016" design: "Randomised, open-label, two-arm" }
study silva_2017 { title: "Silva 2017" design: "Randomised, open-label, two-arm" }
study novak_2018 { title: "Novak 2018" design: "Randomised, assessor-blinded, two-arm" }
study abdi_2019 { title: "Abdi 2019" design: "Randomised, open-label, two-arm" }
study kowalczyk_2020 { title: "Kowalczyk 2020" design: "Randomised, open-label, two-arm" }
study haddad_2021 { title: "Haddad 2021" design: "Randomised, assessor-blinded, two-arm" }
study brennan_2022 { title: "Brennan 2022" design: "Randomised, assessor-blinded, two-arm" }
study ito_2023 { title: "Ito 2023" design: "Randomised, open-label, two-arm" }
bias_domain d1_randomisation { tool: rob2 name: "Bias arising from the randomisation process" label: "D1 Randomisation" order: 1 }
bias_domain d2_deviations { tool: rob2 name: "Bias due to deviations from intended interventions" label: "D2 Deviations" order: 2 }
bias_domain d3_missing { tool: rob2 name: "Bias due to missing outcome data" label: "D3 Missing data" order: 3 }
bias_domain d4_measurement { tool: rob2 name: "Bias in measurement of the outcome" label: "D4 Measurement" order: 4 }
bias_domain d5_selection { tool: rob2 name: "Bias in selection of the reported result" label: "D5 Reported result" order: 5 }
// ── Okafor 2012 ──
bias_assessment okafor_d1 { study: okafor_2012 domain: d1_randomisation tool: rob2 judgement: some_concerns support: "Sealed envelopes; opacity and sequential numbering not described." }
bias_assessment okafor_d2 { study: okafor_2012 domain: d2_deviations tool: rob2 judgement: some_concerns support: "Open-label; per-protocol analysis excluded 9 non-attenders." }
bias_assessment okafor_d3 { study: okafor_2012 domain: d3_missing tool: rob2 judgement: low support: "Admissions from the regional record for 118 of 120." }
bias_assessment okafor_d4 { study: okafor_2012 domain: d4_measurement tool: rob2 judgement: low support: "Admission is an objective outcome taken from hospital records." }
bias_assessment okafor_d5 { study: okafor_2012 domain: d5_selection tool: rob2 judgement: some_concerns support: "No protocol or analysis plan available." }
bias_assessment okafor_overall { study: okafor_2012 tool: rob2 overall: some_concerns rationale: "Some concerns in three domains; none at high risk." }
// ── Lindqvist 2013 ──
bias_assessment lindqvist_d1 { study: lindqvist_2013 domain: d1_randomisation tool: rob2 judgement: low support: "Central web randomisation, concealed until assignment." }
bias_assessment lindqvist_d2 { study: lindqvist_2013 domain: d2_deviations tool: rob2 judgement: some_concerns support: "Open-label; 14% of controls joined community exercise classes." }
bias_assessment lindqvist_d3 { study: lindqvist_2013 domain: d3_missing tool: rob2 judgement: low support: "Registry linkage; outcome known for all 310." }
bias_assessment lindqvist_d4 { study: lindqvist_2013 domain: d4_measurement tool: rob2 judgement: low support: "Objective outcome from the national patient register." }
bias_assessment lindqvist_d5 { study: lindqvist_2013 domain: d5_selection tool: rob2 judgement: low support: "Analysis matches the registered plan." }
bias_assessment lindqvist_overall { study: lindqvist_2013 tool: rob2 overall: some_concerns rationale: "Some concerns from open-label contamination only." }
// ── Hartmann 2014 ──
bias_assessment hartmann_d1 { study: hartmann_2014 domain: d1_randomisation tool: rob2 judgement: some_concerns support: "Method of sequence generation not reported." }
bias_assessment hartmann_d2 { study: hartmann_2014 domain: d2_deviations tool: rob2 judgement: some_concerns support: "Open-label; adherence to home sessions self-reported." }
bias_assessment hartmann_d3 { study: hartmann_2014 domain: d3_missing tool: rob2 judgement: low support: "Two participants lost, balanced across arms." }
bias_assessment hartmann_d4 { study: hartmann_2014 domain: d4_measurement tool: rob2 judgement: low support: "Objective outcome from hospital records." }
bias_assessment hartmann_d5 { study: hartmann_2014 domain: d5_selection tool: rob2 judgement: some_concerns support: "Registered after recruitment had begun." }
bias_assessment hartmann_overall { study: hartmann_2014 tool: rob2 overall: some_concerns rationale: "Some concerns in three domains; none at high risk." }
// ── Moreau 2015 ──
bias_assessment moreau_d1 { study: moreau_2015 domain: d1_randomisation tool: rob2 judgement: low support: "Computer-generated, stratified by centre; telephone allocation." }
bias_assessment moreau_d2 { study: moreau_2015 domain: d2_deviations tool: rob2 judgement: low support: "Intention-to-treat analysis of all randomised." }
bias_assessment moreau_d3 { study: moreau_2015 domain: d3_missing tool: rob2 judgement: low support: "Outcome available for 97%." }
bias_assessment moreau_d4 { study: moreau_2015 domain: d4_measurement tool: rob2 judgement: low support: "Admissions adjudicated by a blinded committee." }
bias_assessment moreau_d5 { study: moreau_2015 domain: d5_selection tool: rob2 judgement: low support: "Pre-registered statistical analysis plan followed." }
bias_assessment moreau_overall { study: moreau_2015 tool: rob2 overall: low rationale: "Low risk in all five domains." }
// ── Tanaka 2016 ──
bias_assessment tanaka_d1 { study: tanaka_2016 domain: d1_randomisation tool: rob2 judgement: low support: "Minimisation by an independent unit." }
bias_assessment tanaka_d2 { study: tanaka_2016 domain: d2_deviations tool: rob2 judgement: some_concerns support: "Open-label; no analysis of the effect of adherence." }
bias_assessment tanaka_d3 { study: tanaka_2016 domain: d3_missing tool: rob2 judgement: low support: "Outcome available for 96%." }
bias_assessment tanaka_d4 { study: tanaka_2016 domain: d4_measurement tool: rob2 judgement: low support: "Objective outcome from insurance claims." }
bias_assessment tanaka_d5 { study: tanaka_2016 domain: d5_selection tool: rob2 judgement: low support: "Registered protocol; outcome definition unchanged." }
bias_assessment tanaka_overall { study: tanaka_2016 tool: rob2 overall: some_concerns rationale: "Some concerns from open-label delivery only." }
// ── Silva 2017 ──
bias_assessment silva_d1 { study: silva_2017 domain: d1_randomisation tool: rob2 judgement: some_concerns support: "Baseline imbalance in ejection fraction; method unclear." }
bias_assessment silva_d2 { study: silva_2017 domain: d2_deviations tool: rob2 judgement: some_concerns support: "Open-label; 6 crossed over to the programme." }
bias_assessment silva_d3 { study: silva_2017 domain: d3_missing tool: rob2 judgement: high support: "Outcome missing for 22%, more often in the usual-care arm." }
bias_assessment silva_d4 { study: silva_2017 domain: d4_measurement tool: rob2 judgement: low support: "Objective outcome from hospital records." }
bias_assessment silva_d5 { study: silva_2017 domain: d5_selection tool: rob2 judgement: some_concerns support: "Two admission definitions reported; choice not pre-specified." }
bias_assessment silva_overall { study: silva_2017 tool: rob2 overall: high rationale: "High risk from differential missing outcome data." }
// ── Novak 2018 ──
bias_assessment novak_d1 { study: novak_2018 domain: d1_randomisation tool: rob2 judgement: low support: "Central randomisation in permuted blocks." }
bias_assessment novak_d2 { study: novak_2018 domain: d2_deviations tool: rob2 judgement: low support: "Intention-to-treat; deviations balanced." }
bias_assessment novak_d3 { study: novak_2018 domain: d3_missing tool: rob2 judgement: some_concerns support: "Outcome missing for 11%; reasons not reported by arm." }
bias_assessment novak_d4 { study: novak_2018 domain: d4_measurement tool: rob2 judgement: low support: "Blinded outcome assessors." }
bias_assessment novak_d5 { study: novak_2018 domain: d5_selection tool: rob2 judgement: low support: "Pre-registered plan followed." }
bias_assessment novak_overall { study: novak_2018 tool: rob2 overall: some_concerns rationale: "Some concerns from unexplained missing outcome data." }
// ── Abdi 2019 ──
bias_assessment abdi_d1 { study: abdi_2019 domain: d1_randomisation tool: rob2 judgement: low support: "Sequence by an independent statistician; concealed." }
bias_assessment abdi_d2 { study: abdi_2019 domain: d2_deviations tool: rob2 judgement: some_concerns support: "Open-label; co-interventions not recorded." }
bias_assessment abdi_d3 { study: abdi_2019 domain: d3_missing tool: rob2 judgement: low support: "Outcome available for 98%." }
bias_assessment abdi_d4 { study: abdi_2019 domain: d4_measurement tool: rob2 judgement: low support: "Objective outcome from hospital records." }
bias_assessment abdi_d5 { study: abdi_2019 domain: d5_selection tool: rob2 judgement: low support: "Registered outcome and analysis reported as planned." }
bias_assessment abdi_overall { study: abdi_2019 tool: rob2 overall: some_concerns rationale: "Some concerns from unrecorded co-interventions." }
// ── Kowalczyk 2020 ──
bias_assessment kowalczyk_d1 { study: kowalczyk_2020 domain: d1_randomisation tool: rob2 judgement: low support: "Web-based randomisation." }
bias_assessment kowalczyk_d2 { study: kowalczyk_2020 domain: d2_deviations tool: rob2 judgement: some_concerns support: "Open-label; home sessions partly unsupervised." }
bias_assessment kowalczyk_d3 { study: kowalczyk_2020 domain: d3_missing tool: rob2 judgement: low support: "One participant lost to follow-up." }
bias_assessment kowalczyk_d4 { study: kowalczyk_2020 domain: d4_measurement tool: rob2 judgement: some_concerns support: "Admissions partly self-reported at follow-up calls." }
bias_assessment kowalczyk_d5 { study: kowalczyk_2020 domain: d5_selection tool: rob2 judgement: low support: "Protocol published before enrolment." }
bias_assessment kowalczyk_overall { study: kowalczyk_2020 tool: rob2 overall: some_concerns rationale: "Some concerns from open-label delivery and partly self-reported admissions." }
// ── Haddad 2021 ──
bias_assessment haddad_d1 { study: haddad_2021 domain: d1_randomisation tool: rob2 judgement: low support: "Central randomisation stratified by site and diagnosis." }
bias_assessment haddad_d2 { study: haddad_2021 domain: d2_deviations tool: rob2 judgement: low support: "Intention-to-treat analysis of all 540." }
bias_assessment haddad_d3 { study: haddad_2021 domain: d3_missing tool: rob2 judgement: low support: "Registry linkage; complete outcome data." }
bias_assessment haddad_d4 { study: haddad_2021 domain: d4_measurement tool: rob2 judgement: low support: "Objective outcome, blinded adjudication." }
bias_assessment haddad_d5 { study: haddad_2021 domain: d5_selection tool: rob2 judgement: low support: "Statistical analysis plan published before lock." }
bias_assessment haddad_overall { study: haddad_2021 tool: rob2 overall: low rationale: "Low risk in all five domains." }
// ── Brennan 2022 ──
bias_assessment brennan_d1 { study: brennan_2022 domain: d1_randomisation tool: rob2 judgement: low support: "Concealed central allocation." }
bias_assessment brennan_d2 { study: brennan_2022 domain: d2_deviations tool: rob2 judgement: low support: "Intention-to-treat; adherence monitored by wearable." }
bias_assessment brennan_d3 { study: brennan_2022 domain: d3_missing tool: rob2 judgement: low support: "Outcome available for 97%." }
bias_assessment brennan_d4 { study: brennan_2022 domain: d4_measurement tool: rob2 judgement: low support: "Blinded outcome assessors." }
bias_assessment brennan_d5 { study: brennan_2022 domain: d5_selection tool: rob2 judgement: low support: "Pre-registered plan followed." }
bias_assessment brennan_overall { study: brennan_2022 tool: rob2 overall: low rationale: "Low risk in all five domains." }
// ── Ito 2023 ──
bias_assessment ito_d1 { study: ito_2023 domain: d1_randomisation tool: rob2 judgement: low support: "Computer-generated sequence, sealed opaque envelopes held off site." }
bias_assessment ito_d2 { study: ito_2023 domain: d2_deviations tool: rob2 judgement: some_concerns support: "Open-label; per-protocol results emphasised in the abstract." }
bias_assessment ito_d3 { study: ito_2023 domain: d3_missing tool: rob2 judgement: some_concerns support: "Outcome missing for 9%; sensitivity analysis not reported." }
bias_assessment ito_d4 { study: ito_2023 domain: d4_measurement tool: rob2 judgement: low support: "Objective outcome from hospital records." }
bias_assessment ito_d5 { study: ito_2023 domain: d5_selection tool: rob2 judgement: low support: "Registered outcome reported as planned." }
bias_assessment ito_overall { study: ito_2023 tool: rob2 overall: some_concerns rationale: "Some concerns from open-label delivery and missing outcome data." }
// ── Summary of findings ──
outcome admission {
metric: "All-cause hospital admission"
role: "primary"
timepoint: "12 months"
}
outcome mortality {
metric: "All-cause mortality"
role: "secondary"
timepoint: "12 months"
}
outcome return_to_work {
metric: "Return to work"
role: "secondary"
timepoint: "6 months"
}
estimate pooled_admission {
label: "Risk ratio, random effects (HKSJ)"
measure: rr
scale: log
point: 0.77
lo: 0.64
hi: 0.93
n: 2406
}
estimate pooled_mortality {
label: "Risk ratio, random effects (HKSJ)"
measure: rr
scale: log
point: 0.92
lo: 0.74
hi: 1.15
n: 2018
}
estimate pooled_return_to_work {
label: "Risk ratio, random effects (HKSJ)"
measure: rr
scale: log
point: 1.18
lo: 1.03
hi: 1.35
n: 845
}
grade_outcome grade_admission {
outcome: admission
estimate: pooled_admission
starting_certainty: high
risk_of_bias: serious
inconsistency: not_serious
indirectness: not_serious
imprecision: not_serious
publication_bias: undetected
studies: 12
participants: 2406
design: "randomised trials"
importance: critical
downgrades: ["Risk of bias: 9 of 12 trials at some concerns or high risk overall, mostly from open-label delivery and missing outcome data."]
}
grade_outcome grade_mortality {
outcome: mortality
estimate: pooled_mortality
starting_certainty: high
risk_of_bias: not_serious
inconsistency: not_serious
indirectness: not_serious
imprecision: serious
publication_bias: undetected
studies: 10
participants: 2018
design: "randomised trials"
importance: critical
downgrades: ["Imprecision: the interval includes both a 26% relative reduction and a 15% relative increase."]
}
grade_outcome grade_return_to_work {
outcome: return_to_work
estimate: pooled_return_to_work
starting_certainty: high
risk_of_bias: serious
inconsistency: not_serious
indirectness: not_serious
imprecision: serious
publication_bias: undetected
studies: 5
participants: 845
design: "randomised trials"
importance: important
downgrades: ["Risk of bias: return to work self-reported in open-label trials.", "Imprecision: the lower limit, 16 more per 1000, would be a trivial benefit."]
}
sof_row admission_row {
outcome: admission
estimate: pooled_admission
grade: grade_admission
risk_control: 319 per 1000
comparator_risk_basis: "Pooled usual-care risk across the 12 trials (384 of 1203)"
participants: 2406
studies: 12
importance: critical
order: 1
}
sof_row mortality_row {
outcome: mortality
estimate: pooled_mortality
grade: grade_mortality
risk_control: 64 per 1000
comparator_risk_basis: "Pooled usual-care risk across the 10 trials reporting deaths"
participants: 2018
studies: 10
importance: critical
order: 2
}
sof_row return_to_work_row {
outcome: return_to_work
estimate: pooled_return_to_work
grade: grade_return_to_work
risk_control: 540 per 1000
comparator_risk_basis: "Pooled usual-care proportion across the 5 trials reporting it"
participants: 845
studies: 5
importance: important
order: 3
}
view risk_of_bias: rob_traffic_light(rob2)
view risk_of_bias_summary: rob_summary_bar(rob2)
view summary_of_findings: grade_sof