Relative and Net Survival
A method for estimating cancer-attributable survival from registry data where cause of death is unreliable or missing: relative survival divides the observed all-cause survival of a cancer cohort by the expected survival of a matched general-population group from population life tables; the result estimates net survival -- the probability of surviving the cancer in a hypothetical world where no other cause of death can occur.
On this page
Relative survival answers the question "how much does a cancer diagnosis reduce a patient's chances of being alive at five years?" without needing to know the exact cause of death -- a piece of information that is often wrong or missing on death certificates. The method compares how many cancer patients actually survived against how many would have been expected to survive based on their age and sex from general-population life tables; the ratio of those two numbers gives net survival, the survival attributable to the cancer alone. A net survival of 0.50 means cancer patients survived at half the rate of comparable people in the general population, with the gap blamed on the cancer and its treatment rather than background diseases like heart attacks or strokes.
The cancer-registry problem that motivates relative survival
In most cancer registries, the death certificate records a cause of death -- but those entries are notoriously unreliable. A patient with stage-IV colon cancer who dies of myocardial infarction may be coded as a cancer death; a patient dying of uncontrolled metastatic disease may be certified as dying of sepsis. Misclassification is differential by cancer site, age, race/ethnicity, and data period.
In Medicare claims and other administrative sources the problem is worse still: the only cause-of-death signal is the ICD code on the discharge claim or the enrollment death-file entry, not a reviewed death certificate. The practical consequence is that cause-specific survival analysis requires knowing why a patient died, and that knowledge is often unavailable, partial, or systematically wrong in population-based registry data.
Relative survival bypasses the problem entirely: it never asks why a patient died, only whether the rate at which they died exceeded what was expected from the general population of the same age, sex, and calendar year.
The estimand: net survival
Net survival is the survival probability in a conceptual world where the cancer is the only possible cause of death -- all background mortality has been removed by assumption. It is not the observed all-cause survival (which includes deaths from heart disease, stroke, and accidents unrelated to the cancer), and it is not cause-specific survival (which requires reliable cause-of-death coding).
Net survival is the quantity that SEER data products, CONCORD, and EUROCARE comparisons report, and it is the international standard for population-based cancer surveillance. The Pohar Perme estimator (2012) is the nonparametric estimator of net survival that is unbiased under the independence assumption: a patient's expected general-population survival is independent of their actual cancer prognosis given age, sex, and calendar year. This is the current recommendation of the International Agency for Research on Cancer.
The relative survival ratio: observed divided by expected
Relative survival is computed as:
relative_survival = observed_survival / expected_survival
where observed_survival is the all-cause Kaplan-Meier survival probability from the cancer cohort, and expected_survival is the survival probability that the cohort would have experienced if they had the same all-cause mortality as the general population matched on age, sex, and calendar year -- obtained from population life tables. A relative survival of 0.50 at five years means the cancer cohort survived at 50% of the rate that a comparable general-population group would have survived.
Note: the 0.50 is a ratio, not a percentage-point deficit — the absolute deficit in this example is 40 percentage points (observed 0.40 minus expected 0.80 = −0.40). Relative survival above 1.0 is possible (a healthy-worker effect or a population selected for low baseline mortality) but requires careful interpretation.
Statistical cure in the net survival framework is indicated when the excess hazard returns to zero and the relative survival curve plateaus — it stops declining and stabilises at a fixed value that equals the proportion of the cohort effectively cured. This plateau is generally below 1.0 unless all patients are eventually cured; relative survival does not in general approach 1.0 as follow-up lengthens.
Pohar Perme versus Ederer I, Ederer II, and Hakulinen: why the estimator matters
Older methods -- Ederer I (1961), Ederer II (1961), and Hakulinen (1982) -- estimated relative survival using different constructions of expected survival in the denominator. All three are biased when the age distribution within the cohort is informative -- which it almost always is in cancer data, because older patients both have worse cancer prognosis and worse expected general-population survival.
The bias is upward: older patients accumulate deaths quickly and exit the risk set early, so later survival estimates come from the younger (better-prognosis) survivors; the expected-survival denominator is incorrectly handled, and net survival is over-estimated.
Pohar Perme (2012) corrected this by inverse probability weighting: at each event time, each patient is up-weighted by the inverse of their expected general-population survival, amplifying the contribution of older patients whose expected mortality is high and whose net survival would otherwise be under-counted.
In practice the Pohar Perme estimate is lower than Ederer II for older, higher-mortality cancer cohorts -- which is the correct direction; the earlier estimators were optimistically biased. Use Pohar Perme for all new analyses; revisit Ederer II only when replicating historical literature.
Life-table choice: national, regional, SES-specific, and the US claims-data caveat
The expected-survival denominator comes from a population life table stratified by age, sex, and calendar year. In most countries the national life table is the default comparator, and it is required for international comparisons. However:
- Regional or socioeconomic-stratum-specific tables give more accurate comparators when the cancer cohort is not representative of the national population. A cohort of rural patients matched to an urban-dominant national life table will under-estimate expected mortality (rural mortality is higher than urban-dominated national rates), making expected survival too high and thereby deflating relative survival — the cancer appears more lethal than it is for that rural population.
- In the United States, commercially insured populations have substantially lower all-cause mortality than the national population at the same age and sex -- because people who are healthy enough to be employed and insured are selected from a lower-mortality subgroup. Using the national life table in a commercial-claims analysis will over-state expected mortality rates, which lowers the expected survival in the denominator and thereby inflates relative survival — making the cancer appear less lethal than it actually is for that insured population. When possible, use an insured-population life table as the primary or at least as a sensitivity analysis. This is one of the most consequential yet under-discussed limitations of applying relative-survival methods to US administrative data.
- Medicare populations are closer to the national elderly life table, but the dual-eligible (Medicaid and Medicare) subgroup has higher background mortality than national tables predict. Pre-specify the life table in the protocol, document its source, and always carry a sensitivity analysis with an alternative table.
Age-standardization for comparisons across registries and time periods
Comparing relative survival across cancer registries, time periods, or countries requires age-standardization, because different populations diagnose cancer patients at different age distributions. The International Cancer Survival Standard (ICSS) provides three weight sets for different cancer sites. The age-standardized relative survival is a weighted average of age-stratum-specific relative survival estimates using the ICSS weights (Corazziari et al. 2004) -- one line of arithmetic applied after stratum-specific estimation.
Excess hazard regression
When covariates must be modeled, the relative-survival framework uses excess hazard regression. The total observed hazard in the cancer cohort is decomposed as:
total_hazard = excess_hazard + expected_hazard
where expected_hazard is read from the life table at each patient's age/sex/year, and excess_hazard is the cancer-attributable component to be modeled. The excess hazard is modeled as a function of covariates (cancer stage, grade, treatment, socioeconomic status) using Poisson regression with an offset for the expected hazard (Dickman et al. 2004).
Regression coefficients are excess hazard ratios: the multiplicative change in cancer-attributable mortality associated with a one-unit change in the covariate. Excess hazard regression is the relative-survival analogue of Cox regression for cause-specific survival.
Route to relative survival cure models
When the excess hazard returns to zero at finite follow-up -- the cohort's survival converges to the matched general-population life table -- there is statistical evidence of cure. Relative survival cure models partition the cohort into a cured fraction (those whose excess hazard has reached zero) and an uncured fraction still experiencing excess mortality.
The cured fraction's survival thereafter follows the general-population life table. This is one of the primary input pathways for mixture-cure models in cancer registry settings; see the cure-models-mixture-cure entry for the full cure-model framework. Relative survival provides the necessary input when cause-of-death data are unavailable.
Pros, cons, and trade-offs
Relative / net survival versus cause-specific survival (when cause-of-death data exist):
- Pros: Requires no cause-of-death coding at all; immune to misclassification of cause; directly comparable across registries with varying certification quality; the established standard for population-based cancer surveillance; estimable from any population with a matching life table.
- Cons: Requires a matching population life table that accurately represents the background mortality of the study cohort; depends on the independence assumption (discussed above); cannot separate deaths caused by the cancer from deaths caused by cancer treatment toxicity (both are "excess" mortality); relative survival can exceed 1.0 in selected populations, which is numerically unintuitive; the Pohar Perme estimator has slightly higher variance than the simpler Ederer II at small sample sizes.
- When to prefer: Population-based registry studies, SEER, EUROCARE, national cancer-plan evaluations, and any setting where cause-of-death coding is unreliable, missing, or differentially misclassified across comparison groups.
National versus population-specific life tables:
- Pros of national tables: Universally available; standard for international comparisons; simple to implement.
- Cons: Can over- or under-state expected mortality in non-representative cohorts (insured, rural, SES extreme). For US commercial-claims analyses, the national table overstates expected mortality rates, which deflates the expected survival denominator and thereby inflates the relative survival estimate, making the cancer appear less lethal than it is in that insured population.
- When to prefer: National tables for SEER and registry work; population-specific or insured-cohort life tables for claims-based analyses when available, or at minimum as a sensitivity analysis.
When NOT to use
- Non-fatal outcomes: Relative survival is a survival-only framework. For outcomes such as disease progression, response rate, readmission, or healthcare utilization there is no general-population expected comparator and the method does not apply; use standard time-to-event or frequency methods instead.
- When reliable cause-of-death data are available and a cause-specific estimand is the target: If death certificates are adjudicated, if cancer-specific survival is the primary endpoint defined in the study protocol, or if the scientific question explicitly concerns cause-specific mortality (e.g., cardiovascular deaths in a cancer survivor cohort), prefer competing-risks methods with a validated mortality source hierarchy. Net survival and cause-specific survival answer subtly different questions and can diverge materially when non-cancer mortality is high (elderly patients, indolent cancers, heavily comorbid cohorts).
- When the independence assumption is materially violated: If the cancer shares strong risk factors with non-cancer mortality (e.g., smoking-related lung cancer where the cohort would have had higher-than-national cardiovascular mortality even without the cancer), the excess hazard is overestimated and net survival is underestimated. Flag this as a structural limitation and carry cause-specific survival as a sensitivity analysis.
- Do not apply to US commercial-claims data without a population-appropriate life table: Using the US national life table for a commercially insured cohort will produce upwardly biased expected survival and downwardly biased relative survival, systematically overstating the cancer's lethal burden in that selected population.
Interpreting the output
From the worked example: a colon cancer cohort of 5 patients followed 5 years. Observed all-cause survival at 5 years = 0.40 (2 of 5 patients alive at 5 years). Mean expected 5-year survival from matched life tables (age/sex/calendar year) = 0.80. Net (relative) survival = 0.40 / 0.80 = 0.50.
(1) Formal interpretation. The relative survival of 0.50 is an estimate of net survival computed here as a simple Ederer-style observed/mean-expected ratio — the worked example uses this transparent arithmetic to illustrate the concept. The Pohar Perme estimator applies inverse-probability weighting at each event time (upweighting older patients whose background mortality is higher) and gives a different, unbiased estimate; it should be used in any real analysis.
Under the independence assumption that each patient's expected general-population survival is independent of their actual cancer prognosis conditional on age, sex, and calendar year, the Pohar Perme estimator is consistent for net survival. Relative survival is a ratio of two survival probabilities, not itself a bounded probability; it can exceed 1.0 in populations with below-national-average background mortality. A value of 0.50 means the cancer cohort's observed all-cause survival is 50% of what the same-age, same-sex general population would have experienced -- with the remaining deficit attributed to the excess mortality from colon cancer and its treatment.
(2) Practical interpretation. The relative survival of 0.50 is a ratio: the cohort survived at half the rate of the matched general population (0.40 vs. 0.80). The absolute deficit is 0.80 − 0.40 = 0.40 — approximately 40 fewer would be alive per 100 newly diagnosed patients at 5 years compared with similarly aged people in the general population who did not receive a cancer diagnosis. The 0.50 itself is not a 50-percentage-point deficit; confusing the ratio with the absolute gap is a common communication error. This is the quantity reported in international cancer-survival comparisons (CONCORD, EUROCARE) and in SEER publications; it is interpretable across time periods and registries regardless of differences in cause-of-death certification quality.
For clinical communication, emphasize that it represents the survival experience attributable to the cancer diagnosis itself, net of the background mortality that those patients would have experienced regardless of the cancer.
Decision diagram
flowchart TD
REG[Cancer registry: all-cause death date<br/>No reliable cause-of-death coding] -->|Observed survival| KM[Kaplan-Meier<br/>all-cause survival curve]
LT[Population life table<br/>matched on age / sex / calendar year] -->|Expected survival| EXP[Expected survival<br/>for matched general population]
KM --> RATIO[Relative survival<br/>= observed / expected]
EXP --> RATIO
RATIO -->|Equals| NET[Net survival estimate<br/>Cancer-attributable survival probability<br/>Pohar Perme weighting]
NET --> Q{Analysis goal?}
Q -->|Descriptive: survival curve| PP[Report net survival with 95% CI<br/>relsurv rs.surv Pohar Perme]
Q -->|Covariate adjustment| EH[Excess hazard regression<br/>Poisson model, Dickman et al. 2004]
Q -->|Long-term: cure fraction| CM[Relative survival cure model<br/>see cure-models-mixture-cure]
style REG fill:#F6F6F5,stroke:#d97706
style NET fill:#EDEDEB,stroke:#059669flowchart TD
Q1{Is cause-of-death<br/>reliably coded?} -- yes --> CMP[Competing-risks framework<br/>cause-specific / Fine-Gray<br/>with mortality source hierarchy]
Q1 -- no or unreliable --> Q2{Is the estimand<br/>cancer-attributable survival?}
Q2 -- yes --> Q3{Is a matched<br/>population life table<br/>available?}
Q2 -- no --> OTHER[Non-fatal endpoint<br/>or all-cause analysis<br/>standard survival methods]
Q3 -- yes --> PP2[Pohar Perme net survival<br/>relsurv rs.surv]
Q3 -- no --> WARN[Cannot estimate relative survival<br/>use cause-specific or all-cause]
PP2 --> COVA{Covariate adjustment<br/>needed?}
COVA -- yes --> EXH[Excess hazard regression<br/>Dickman Poisson model]
COVA -- no --> AGE[Age-standardize with ICSS weights<br/>for cross-registry comparison]Worked example
Scenario
A state cancer registry tracks 5 patients newly diagnosed with colon cancer in 2018, all followed for exactly 5 years. For each patient, the registry also records their expected 5-year survival probability, looked up from the US national life table matched on their age at diagnosis, sex, and calendar year. We want to estimate the 5-year net survival for this cancer -- the survival attributable to the colon cancer itself, independent of background mortality. Two patients are still alive at 5 years; three died during follow-up. Because death certificates in this registry are not reliably coded for cancer vs non-cancer cause, we use relative survival rather than cause-specific survival.
Dataset
One row per patient: follow-up outcome at 5 years and life-table expected 5-year survival. Expected survival is the probability the general population (matched on age/sex/year) would survive 5 years, read from the US national life table.
| person_id | vital_status_5yr | days_followed | expected_5yr_survival |
|---|---|---|---|
| 1001 | alive | 1825 | 0.85 |
| 1002 | dead | 730 | 0.78 |
| 1003 | alive | 1825 | 0.82 |
| 1004 | dead | 365 | 0.76 |
| 1005 | dead | 1095 | 0.79 |
Steps
Result
Observed 5-year survival = 2 / 5 = 0.40. Mean expected 5-year survival from life tables = 4.00 / 5 = 0.80. Relative (net) 5-year survival = 0.40 / 0.80 = 0.50. Net survival of 0.50 means this cancer cohort survived at 50% the rate of the age/sex-matched general population; the 50% deficit is attributed to the colon cancer and its treatment, net of background mortality.
Trade-offs
Runnable example
Conceptual relative survival calculation in Python using lifelines for the Kaplan-Meier observed survival and a manual life-table division to produce relative survival. IMPORTANT: lifelines does not implement the Pohar Perme net survival estimator. For a production analysis use R (relsurv or popEpi) or SAS.
import pandas as pd
from lifelines import KaplanMeierFitter
# ── Worked-example cohort (5 colon cancer patients) ──
data = pd.DataFrame({
"person_id": [1001, 1002, 1003, 1004, 1005],
"fu_days": [1825, 730, 1825, 365, 1095],
"event": [ 0, 1, 0, 1, 1], # 0=alive, 1=dead (all-cause)
"expected_5yr": [0.85, 0.78, 0.82, 0.76, 0.79], # from national life table
})
HORIZON_DAYS = 1825 # 5 years
# ── 1. Observed all-cause survival at 5 years (Kaplan-Meier) ──
kmf = KaplanMeierFitter()
kmf.fit(data["fu_days"], event_observed=data["event"])
observed_surv = float(kmf.predict(HORIZON_DAYS))
print(f"Observed 5-year survival (KM): {observed_surv:.4f}")
# ── 2. Mean expected 5-year survival from the life table ──
expected_surv = data["expected_5yr"].mean()
print(f"Mean expected 5-year survival (LT): {expected_surv:.4f}")
# ── 3. Relative (net) survival = observed / expected ──
# NOTE: This simple ratio is the intuitive definition. The Pohar Perme estimator applies
# inverse-probability weights at each event time to remove the age-structure bias; the
# ratio below agrees with the worked example (0.40 / 0.80 = 0.50) but does not implement
# the full weighting. Use relsurv in R for production Pohar Perme estimation.
relative_surv = observed_surv / expected_surv
print(f"Relative (net) 5-year survival: {relative_surv:.4f}")
print()
print("Verify: 2 alive / 5 total = 0.40 observed; "
"sum expected = 4.00, mean = 0.80; ratio = 0.40 / 0.80 = 0.50")
# ── 4. Excess hazard (approximate, for illustration) ──
# For a single time horizon, excess cumulative hazard = -ln(rel_surv).
import math
excess_cum_haz = -math.log(relative_surv) if relative_surv > 0 else float("inf")
print(f"Approximate 5-year cumulative excess hazard: {excess_cum_haz:.4f}")
print("For full excess hazard regression, use relsurv::excess() or popEpi::relpoisreg in R.")Pohar Perme net survival estimator and excess hazard regression using relsurv, which is the standard R package for relative survival analysis and implements the IARC-recommended method. The popEpi package provides an alternative with more flexible modeling tools.
library(relsurv)
library(survival)
# ── Minimal worked-example dataset (5 patients, matches the Python/beginner example) ──
d <- data.frame(
fu_time = c(1825, 730, 1825, 365, 1095), # days of follow-up
event = c( 0, 1, 0, 1, 1), # all-cause death (0=alive, 1=dead)
age_dx = c( 62, 71, 58, 75, 68), # age at diagnosis (illustrative)
sex = c( 2, 1, 2, 1, 1), # 1=male, 2=female (ratetable convention)
diag_year = c(2000, 2000, 2000, 2000, 2000) # calendar year of diagnosis
# NOTE: slopop covers US 1940-2004; use diag_year within that range.
# For 2018 or later diagnoses, use a current life table (e.g., from the Human
# Mortality Database or survexp.us from the survival package, extended to recent years).
)
# Build the ratetable entry date (first day of year of diagnosis)
d$entry_date <- as.Date(paste0(d$diag_year, "-01-01"))
## 1. Pohar Perme nonparametric net survival curve.
# ratetable() links each patient to the US national life table (slopop).
# fu_time must be in days; ratetable uses age-in-years, sex, and a calendar Date.
rs <- rs.surv(
Surv(fu_time, event) ~ 1,
rmap = list(age = age_dx * 365.25, # relsurv expects age in days
sex = sex,
year = entry_date),
data = d,
ratetable = slopop, # US national life table (1940-2004 coverage)
method = "pohar-perme" # IARC-recommended; unbiased for net survival
)
print(summary(rs, times = 1825)) # 5-year net survival estimate + 95% CI
## 2. Net survival by a covariate (e.g., stage group) using rs.surv with a strata term.
# Extend d with a stage variable for illustration:
# rs_stage <- rs.surv(Surv(fu_time, event) ~ stage_group, rmap = list(...), ...)
# Age-standardize across ICSS weight strata after computing stratum-specific estimates.
## 3. Excess hazard regression: Poisson model for covariate adjustment.
# Creates split person-time records (one row per interval) with the expected hazard as offset.
# The excess() function returns an excess hazard ratio for each covariate.
# Illustrative with stage_group (factor); replace with real covariates.
d$stage_group <- factor(c("III", "II", "III", "IV", "II")) # illustrative only
ex_model <- excess(
Surv(fu_time, event) ~ stage_group,
rmap = list(age = age_dx * 365.25, sex = sex, year = entry_date),
data = d,
ratetable = slopop,
method = "glm" # Poisson excess hazard (Dickman et al. 2004)
)
summary(ex_model) # excess hazard ratios (EHR) per covariate levelRelative survival framework in SAS using a DATA step to implement the simple ratio approach (for illustration and audit) and PROC GENMOD for excess hazard regression after constructing person-time splits with the expected hazard from a life table. Note: SAS does not have a built-in PROC for the Pohar Perme estimator.
/* ── Step 1: Build analytic dataset with expected survival from life table ── */
/* For each patient, look up the annual expected survival probability from the life table
matched on age group, sex, and calendar year. Multiply across years to get 5-year
expected survival (product of annual survival probabilities). This is the simplified
single-stratum lookup; the Pohar Perme algorithm requires time-varying lookups at each
event time, which a full macro (e.g., %RELSURV) handles automatically. */
proc sql;
create table work.analytic as
select c.person_id, c.fu_days, c.event,
/* Five-year expected survival: product of 5 annual survival probs from life table */
l.surv_prob_5yr as expected_5yr /* pre-computed in life_table for simplicity */
from work.cancer_cohort c
left join work.life_table l
on c.age_group = l.age_group
and c.sex = l.sex
and c.diag_year = l.year;
quit;
/* ── Step 2: Compute observed and relative survival at 5-year horizon ── */
/* This computes a CRUDE PROPORTION (n alive and uncensored at 5 years / n total), */
/* NOT Kaplan-Meier survival. Patients censored before 5 years are in the denominator but */
/* not the numerator, incorrectly treating them as "not alive at 5 years." This approach */
/* is suitable only as a descriptive audit step when no censoring occurs before 5 years. */
/* For analyses with censoring before 5 years, use PROC LIFETEST to obtain the KM estimate. */
/* For the Pohar Perme weighted estimator, use R relsurv or the %RELSURV macro. */
proc sql;
create table work.surv_summary as
select
sum(case when fu_days >= 1825 and event = 0 then 1 else 0 end)
as n_alive_5yr,
count(*) as n_total,
calculated n_alive_5yr / calculated n_total as obs_surv_5yr, /* crude proportion */
mean(expected_5yr) as exp_surv_5yr,
(calculated obs_surv_5yr) / (calculated exp_surv_5yr)
as rel_surv_5yr
from work.analytic;
quit;
proc print data=work.surv_summary noobs;
format obs_surv_5yr exp_surv_5yr rel_surv_5yr 6.4;
title 'Relative (net) survival at 5 years: observed/expected ratio';
run;
/* ── Step 3: Excess hazard regression (Poisson model, Dickman et al. 2004 structure) ──
After splitting person-time into annual intervals and computing the expected hazard
per interval from the life table, fit PROC GENMOD with a Poisson distribution and a
log link, with the log(expected hazard * interval_length) as the offset.
The STAGE parameter estimate is the log excess hazard ratio (EHR) for the covariate. */
/* Assumes work.split = person-time split table from %RELSURV or custom split step:
person_id interval events expected_haz interval_days <covariates> */
proc genmod data=work.split;
class stage (ref='I') sex (ref='F');
model events = stage sex age_dx / dist=poisson link=log
offset=log_expected_exposure;
/* offset = log(expected_haz * interval_days / 365.25) per row */
estimate 'EHR stage III vs I' stage 0 1 0 0 / exp; /* excess hazard ratio */
run;Citations
- [1]Perme MP, Stare J, Esteve J. On estimation in relative survival. Biometrics. 2012;68(1):113-120.
- [2]Dickman PW, Adami HO. Interpreting trends in cancer patient survival. Journal of Internal Medicine. 2006;260(2):103-117.