SUCRA in Network Meta-Analysis
Surface under the cumulative ranking curve (SUCRA) is a network meta-analysis ranking metric that transforms each treatment's cumulative rank probabilities into a 0 to 1 (or 0% to 100%) summary of how often it is expected to rank among the best treatments for one outcome.
In plain language
SUCRA is a shortcut for summarizing treatment ranks in a network meta-analysis. It turns the probabilities that each treatment is first, second, third, and so on into one score from 0 to 1, where higher usually means the treatment tends to rank better for that one outcome. It is helpful for scanning large networks, but it should never be read without the actual treatment effects, uncertainty intervals, and certainty of evidence.
What it is
SUCRA is a treatment-ranking summary used after a network meta-analysis has estimated the joint distribution of relative treatment effects. For each treatment and outcome, the NMA produces rank probabilities: the probability the treatment is best, second best, third best, and so on among K competing interventions. SUCRA integrates the cumulative ranking curve into one number. With rank 1 defined as best, SUCRA equals the average cumulative probability of being among the top k ranks for k = 1 through K - 1. It is also a simple transformation of the expected rank:
SUCRA_i = (K - E(rank_i)) / (K - 1)
A value near 1.0 (or 100%) means the treatment is usually near the top of the rank distribution for that outcome; a value near 0 means it is usually near the bottom. SUCRA is not an effect size, not a probability of clinical superiority, and not a substitute for the league table of relative effects with credible or confidence intervals.
Where it sits in the NMA workflow
SUCRA is downstream of the network model. The hard gates come first: the network must be connected, node definitions must be clinically coherent, transitivity must be defended, inconsistency must be assessed where closed loops exist, heterogeneity must be reported, and the relative effects must be estimated on a common scale. Only then should ranking be computed. If the NMA is Bayesian, rank probabilities are usually computed from posterior draws of each treatment's basic parameter. If the NMA is frequentist, SUCRA can be approximated through resampling or replaced by P-scores, the frequentist analogue that is often numerically similar.
Orientation matters
The analyst must define whether larger or smaller values are better before ranking. For response, remission, survival, and quality-of-life outcomes, higher is usually better. For mortality, discontinuation, serious adverse events, cost, or hospitalizations, lower is usually better. A reversed orientation can invert the entire hierarchy while leaving the code apparently successful. In multi-outcome HEOR work, each outcome needs its own orientation; do not average efficacy and harm SUCRA values unless a prespecified multi-criteria decision framework defines the weights.
Pros, cons, and trade-offs
- vs probability of being best: probability-best is fragile because it ignores the rest of the rank distribution and can reward a treatment with sparse evidence. SUCRA uses all ranks, so it is more stable than probability-best alone. It still compresses uncertainty into one number. - vs rankogram: rankograms show the full distribution and reveal ties or instability. SUCRA is easier to place in a table. Use SUCRA for compact comparison and rankograms when the shape of uncertainty matters. - vs league table: the league table contains the decision-relevant relative effects and intervals. SUCRA is only a display aid. A high SUCRA with pairwise effects that are small, imprecise, or low certainty should not drive treatment choice. - SUCRA vs P-score: SUCRA is commonly derived from Bayesian posterior ranks or resampling; P-scores use frequentist point estimates and standard errors and often approximate SUCRA. Neither metric adds much if the relative-effect intervals already show no meaningful separation.
When to use
Use SUCRA as a secondary display after a credible NMA to help readers scan a large treatment network for one prespecified outcome. It is useful in HTA appendices, comparative-effectiveness reviews, and economic model inputs when the report also presents pairwise relative effects, rankograms or uncertainty in ranks, certainty of evidence, and a clear orientation statement. SUCRA is most defensible when the network is well connected, transitivity is plausible, inconsistency is low or explained, and treatment differences are large enough that ranks are not dominated by noise.
When NOT to use - and when it is actively misleading
Do not present SUCRA as the primary evidence of superiority. Do not report a single "best" treatment from SUCRA when credible intervals overlap, certainty of evidence is low, the network is sparse, the top treatments differ only trivially, or transitivity is doubtful. Do not compare SUCRA values across unrelated outcomes as if a 0.85 for efficacy and a 0.85 for safety carry the same clinical meaning. Do not compute SUCRA before checking that beneficial direction is coded correctly. Do not use SUCRA to patch over a disconnected network, an inconsistent closed loop, or an RWE node with unresolved confounding; ranking a biased network only makes the bias easier to over-interpret.
Data-source operational depth
- Aggregate RCT network: the usual substrate. SUCRA inherits all NMA assumptions: transitivity, consistency, heterogeneity, multi-arm covariance, and outcome timing. Report SUCRA only after the direct and indirect evidence, intervals, heterogeneity, and certainty are visible. - IPD-NMA: rank probabilities can be computed after modeling patient-level effect modifiers. Report whether SUCRA is marginal for the target population or conditional on covariate values; those are different rankings. - Claims-derived RWE node: an active-comparator new-user contrast from claims can enter the network only if time zero, follow-up, endpoint algorithm, and estimand match the trial nodes. Residual confounding in that node propagates into the entire rank distribution. - EHR-derived node: severity measures and labs may improve transportability, but encounter-driven capture and out-of-system outcomes can distort both efficacy and safety ranks. Use linkage or sensitivity analysis before treating the rank as comparable to RCT nodes. - Registry or linked data node: adjudicated outcomes and severity can strengthen a node, but selected enrollment and linkage eligibility must be described. SUCRA should be recomputed in sensitivity analyses excluding or down-weighting nonrandomized nodes.
Worked example
Four treatments are ranked for a binary response outcome, where higher response is better. Posterior rank probabilities from the NMA are: A = [0.50, 0.30, 0.15, 0.05], B = [0.30, 0.35, 0.25, 0.10], C = [0.15, 0.25, 0.35, 0.25], and D = [0.05, 0.10, 0.25, 0.60] for ranks 1 through 4. Treatment A has cumulative probabilities of being in the top 1, top 2, and top 3 ranks of 0.50, 0.80, and 0.95. Its SUCRA is (0.50 + 0.80 + 0.95) / 3 = 0.75. Equivalently, its expected rank is 1.75, so (4 - 1.75) / 3 = 0.75. The full table gives A = 0.75, B = 0.617, C = 0.433, and D = 0.200. This ranks A highest, but the decision still turns on the relative effect estimates and intervals: if A and B have overlapping odds-ratio credible intervals and low certainty evidence, the correct conclusion is "A ranked higher in this model, but A and B are not clearly separable."
Worked example
Scenario
A Bayesian network meta-analysis compares four drugs on treatment response, where higher response is better. The model produces posterior probabilities that each drug is ranked first, second, third, or fourth. The team wants a compact ranking table, but must still report the underlying odds ratios and credible intervals.
Dataset
Rank probability matrix from a four-treatment NMA, with rank 1 defined as best.
| treatment | prob_rank_1 | prob_rank_2 | prob_rank_3 | prob_rank_4 | expected_rank | SUCRA |
|---|---|---|---|---|---|---|
| Drug A | 0.5 | 0.3 | 0.15 | 0.05 | 1.75 | 0.75 |
| Drug B | 0.3 | 0.35 | 0.25 | 0.1 | 2.15 | 0.617 |
| Drug C | 0.15 | 0.25 | 0.35 | 0.25 | 2.7 | 0.433 |
| Drug D | 0.05 | 0.1 | 0.25 | 0.6 | 3.4 | 0.2 |
Steps
Confirm orientation before ranking: for response, rank 1 means the highest response probability, so higher values are better.
For each treatment, compute cumulative probabilities through rank K - 1. Drug A has top-1 = 0.50, top-2 = 0.50 + 0.30 = 0.80, and top-3 = 0.95.
Divide the sum of cumulative probabilities by K - 1. Drug A SUCRA = (0.50 + 0.80 + 0.95) / 3 = 0.750.
Cross-check with the expected-rank formula: Drug A expected rank = 10.50 + 20.30 + 30.15 + 40.05 = 1.75, so SUCRA = (4 - 1.75) / 3 = 0.750.
Report SUCRA with the league table and uncertainty. If Drug A and Drug B have overlapping pairwise credible intervals, describe the rank as suggestive rather than definitive.
Result
The SUCRA ranking is Drug A 0.750, Drug B 0.617, Drug C 0.433, and Drug D 0.200. This is a compact ranking of posterior rank distributions for one outcome, not evidence that Drug A has a clinically important or statistically certain advantage over Drug B.
Runnable example
python implementation
Compute SUCRA from a rank probability matrix. Rows are treatments, columns are ranks 1..K, and rank 1 is assumed best after orienting the NMA effects in the beneficial direction.
import numpy as np
import pandas as pd
rank_probs = pd.DataFrame(
{
"rank_1": [0.50, 0.30, 0.15, 0.05],
"rank_2": [0.30, 0.35, 0.25, 0.10],
"rank_3": [0.15, 0.25, 0.35, 0.25],
"rank_4": [0.05, 0.10, 0.25, 0.60],
},
index=["Drug A", "Drug B", "Drug C", "Drug D"],
)
def sucra_from_rank_probs(prob_df):
probs = prob_df.to_numpy(dtype=float)
if not np.allclose(probs.sum(axis=1), 1.0):
raise ValueError("Each treatment's rank probabilities must sum to 1.")
k = probs.shape[1]
ranks = np.arange(1, k + 1)
expected_rank = probs @ ranks
cumulative = np.cumsum(probs, axis=1)[:, :-1]
sucra = cumulative.sum(axis=1) / (k - 1)
check = (k - expected_rank) / (k - 1)
if not np.allclose(sucra, check):
raise AssertionError("SUCRA formula cross-check failed.")
return pd.DataFrame(
{"expected_rank": expected_rank, "SUCRA": sucra},
index=prob_df.index,
).sort_values("SUCRA", ascending=False)
print(sucra_from_rank_probs(rank_probs).round(3))r implementation
Base R SUCRA calculation from a rank probability matrix. This is the same calculation used to audit package output from Bayesian NMA rank draws or frequentist resampling.
rank_probs <- matrix(
c(0.50, 0.30, 0.15, 0.05,
0.30, 0.35, 0.25, 0.10,
0.15, 0.25, 0.35, 0.25,
0.05, 0.10, 0.25, 0.60),
nrow = 4, byrow = TRUE
)
rownames(rank_probs) <- c("Drug A", "Drug B", "Drug C", "Drug D")
colnames(rank_probs) <- paste0("rank_", 1:4)
sucra_from_rank_probs <- function(prob_mat) {
stopifnot(all(abs(rowSums(prob_mat) - 1) < 1e-8))
k <- ncol(prob_mat)
expected_rank <- as.vector(prob_mat %*% seq_len(k))
cumulative <- t(apply(prob_mat, 1, cumsum))[, 1:(k - 1), drop = FALSE]
sucra <- rowSums(cumulative) / (k - 1)
check <- (k - expected_rank) / (k - 1)
stopifnot(all(abs(sucra - check) < 1e-8))
out <- data.frame(treatment = rownames(prob_mat),
expected_rank = expected_rank,
SUCRA = sucra)
out[order(-out$SUCRA), ]
}
print(round(sucra_from_rank_probs(rank_probs), 3))