SEER-Medicare Linked Data
A linkage of NCI Surveillance, Epidemiology, and End Results (SEER) cancer registry data - incident tumors with stage, morphology, and first-course treatment - to Medicare FFS claims for beneficiaries in SEER catchment areas, the standard US source for population-based cancer outcomes research in the elderly.
On this page
SEER-Medicare links high-quality cancer registry records (tumor site, histology, stage at diagnosis, first-course treatment from chart abstraction) to Medicare fee-for-service claims (utilization, costs, comorbidities, survival follow-up). It is unmatched for studying cancer care patterns, costs, and outcomes in Americans 65+ diagnosed 1973-present within about 30-47% of the US population across SEER regions.
SEER-Medicare
links the NCI SEER cancer registries — population-based tumor registries capturing all incident cancers in defined geographic areas with standardized stage (SEER historic, TNM-derived), morphology, and first-course treatment abstracted from medical records — to Medicare FFS claims (Parts A/B, optionally Part D since 2006) for beneficiaries residing in SEER catchment areas. The linkage is performed by NCI; researchers receive de-identified linked files.
Why it matters for RWE
Registry data supplies what claims cannot: validated cancer diagnosis (histology confirmed), stage at diagnosis, and chart-abstracted first-course treatment. Claims supply what registries cannot: longitudinal utilization, recurrence-era services, comorbidity burden, Medicare payments, and death dates. The combination supports treatment-pattern, cost, comparative-effectiveness, and survivorship research in a population-based elderly cohort — the backbone of US cancer health-services RWE.
Operational characteristics
- Population: patients 65+ with FFS coverage (registry captures all ages but claims exist only for Medicare enrollees); SEER areas cover roughly 30-47% of the US population depending on era.
- Registry variables: month/year of diagnosis (not day), SEER stage, grade, morphology codes, first-course surgery/radiation/chemotherapy flags.
- Claims variables: ICD-9/10 diagnoses, CPT/HCPCS procedures, revenue codes, Part D drug events, payment amounts, date of death.
- FFS requirement: MA enrollees lack claim detail; analyses must restrict to FFS or handle MA months explicitly.
Common pitfalls
- Day-of-diagnosis missing: use month-level windows; avoid misclassifying pre-diagnosis services.
- Lookback limited to claims history: Medicare eligibility begins ~65; comorbidity lookback before 65 is impossible for most.
- Recurrence invisible: no registry flag for recurrence; algorithms using claims after a disease-free window are approximations needing validation.
- Generalizability: SEER areas are not nationally representative; MA growth over time shrinks the analyzable FFS denominator.
Pros, cons, and trade-offs
- vs pure claims (MarketScan/Medicare): cancer validation, staging, and cause-specific context vs broader populations without clinical depth.
- vs Flatiron-style clinico-genomic EHR: population-based incidence capture vs deep genomic/clinical detail in treated cohorts.
- Trade-off: elderly-only claims coverage vs pediatric/adult registry breadth.
When NOT to use
Under-65 oncology RWE (no claims); questions requiring recurrence adjudication beyond validated algorithms; biomarker-driven treatment effects before genomics-linked expansions.
Decision diagram
flowchart LR R[SEER registries\ntumor - stage - first course] --> LK[NCI linkage] M[Medicare FFS claims A/B/D] --> LK LK --> SMD[De-identified SEER-Medicare files] SMD --> P[Treatment patterns - costs - outcomes RWE]
Worked example
Scenario
Compare 5-year total Medicare costs after diagnosis between stage III colon cancer patients receiving adjuvant chemotherapy versus not.
Dataset
Cost comparison adjusted for demographics and comorbidity.
| group | n | median_5y_cost_usd | adj_diff_pct |
|---|---|---|---|
| adjuvant_chemo - 3810 - 98400 - ref | |||
| no_adjuvant - 2140 - 71200 - +18 |
Steps
Result
Adjuvant recipients incurred 18% higher adjusted 5-year costs, driven by first-year treatment-period spending; sensitivity to MA-month exclusion was minimal.
Trade-offs
Runnable example
Build an adjuvant-chemo indicator and cumulative cost frame from SEER-Medicare style extracts.
\
import pandas as pd
def adjuvant_flag(carrier, pde, resection_date, window=120):
# Part B J-codes + Part D chemo within window days post-resection
b = carrier[(carrier.jcode.isin(CHEMO_JCODES)) &
(carrier.svc_date >= resection_date) &
(carrier.svc_date <= resection_date + pd.Timedelta(days=window))]
d = pde[(pde.ther_class=="antineoplastic") &
(pde.fill_date >= resection_date) &
(pde.fill_date <= resection_date + pd.Timedelta(days=window))]
return int(len(b) > 0 or len(d) > 0)
def cumulative_costs(inpatient, carrier, pde, dx_date, months=60):
end = dx_date + pd.DateOffset(months=months)
tot = {f: f[(f.date >= dx_date) & (f.date < end)].payment.sum()
for f, name in [(inpatient,"ip"),(carrier,"op"),(pde,"pd")]}
return sum(tot.values())
R version with data.table aggregation of claims costs and regimen flagging.
\
library(data.table)
CHEMO_J <- c("J9206","J9263","J8520","J8521")
adjuvant_flag <- function(carrier, pde, resection_dt, window = 120L) {
b <- carrier[JCODE %in% CHEMO_J &
svc_date >= resection_dt &
svc_date <= resection_dt + window, .N]
d <- pde[ther_class == "antineoplastic" &
fill_date >= resection_dt & fill_date <= resection_dt + window, .N]
as.integer(b + d > 0)
}
cumulative_costs <- function(claims_list, dx_dt, months = 60L) {
end <- as.Date(dx_dt) %m+% months(months)
sapply(claims_list, function(f)
f[date >= dx_dt & date < end, sum(payment)], USE.NAMES = FALSE) |> sum()
}
SAS version: adjuvant flag and 60-month cost rollup.
\
/* Adjuvant chemotherapy flag: any Part B chemo J-code or Part D antineoplastic */
proc sql;
create table adj_b as
select distinct patient_id, 1 as adj_flag
from carrier
where jcode in ('J9206','J9263','J8520','J8521')
and svc_date between resection_date and resection_date + 120;
create table costs60 as
select patient_id,
sum(case when date >= dx_date and date < intnx('month',dx_date,60)
then payment else 0 end) as cost_5yr
from all_claims
group by patient_id;
quit;
Citations
- [1]Warren JL, et al. Overview of the SEER-Medicare Data: Content, Research Applications, and Generalizability to the United States Elderly Population. Medical Care. 2002.
- [2]Enewold L, et al. Updated Overview of the SEER-Medicare Data: Enhanced Content and Applications. JNCI Monographs. 2020.
- [3]Snow TS, et al. Comparison of Population Characteristics in Real-World Clinical Oncology Databases in the US. medRxiv. 2023.