Indirect Standardization, SMR, and SIR
A summary measure that compares the events observed in a study cohort with the events expected if stratum-specific (usually age-, sex-, and calendar-period-specific) reference rates had applied to the cohort's own person-time, expressed as a standardized mortality ratio (SMR) or standardized incidence ratio (SIR).
In plain language
Indirect standardization answers one question: did this group of patients have more (or fewer) deaths or new diagnoses than you would expect for people with the same age and sex mix? You take published rates from a reference population — say, national death statistics — apply those rates to your study group's own mix of patients and follow-up time, and add up the events you would have predicted. Dividing the events you actually counted by that predicted number gives the Standardized Mortality Ratio (SMR) or Standardized Incidence Ratio (SIR): a number greater than 1 means excess events, less than 1 means a deficit. One honest caveat: because each group's result is weighted by its own patient mix, you cannot directly compare two SMRs from two different groups — the method is built for comparing one group against a population benchmark, not against each other.
Indirect standardization
answers a single, narrow question: did this cohort experience more (or fewer) events than we would expect if it had the same stratum-specific event rates as a reference population? It does so by applying external reference rates (age-, sex-, calendar-period-, and possibly race-specific mortality or incidence rates from a registry, census-linked vital-statistics file, or the general population) to the cohort's own observed person-time within each stratum, summing those products to get the expected count E, and dividing the observed count O by E. The result is the standardized mortality ratio (SMR = O/E) for death outcomes or the standardized incidence ratio (SIR = O/E) for incident-disease outcomes. An SMR of 1.45 means the cohort had 45% more events than its age/sex/period composition would predict from reference rates.
Core conceptual distinction
Indirect standardization is the mirror image of direct standardization, and the two answer different questions. Direct standardization applies the cohort's stratum-specific rates to a fixed standard population to produce a single age-adjusted rate that is comparable across any number of groups standardized to the same standard. Indirect standardization applies the reference's stratum-specific rates to the cohort's person-time and needs only the total observed count plus stratum-specific person-time from the cohort — not stratum-specific cohort rates. This makes it the method of choice when cohort strata are sparse (rare exposures, small subgroups), because it borrows the stable reference rates rather than estimating unstable cohort-specific rates. The price is the non-comparability caveat: two SMRs computed against the same reference are each interpretable as O/E versus that reference, but they are NOT directly comparable to each other unless the two cohorts have identical stratum (age/sex) distributions — because each is weighted by its own person-time distribution. The estimand is a ratio of the cohort's event rate to a counterfactual rate the cohort would have had under reference rates, conditional on the standardization strata; it is descriptive of excess/deficit versus an external benchmark, not a confounding-adjusted causal contrast between two treatment arms.
Pros, cons, and trade-offs
- vs direct standardization (age-adjusted rates): Indirect standardization is more stable and usable when the cohort is small or strata are sparse (it needs no cohort-specific stratum rates), and it is the natural form when comparing a single cohort to an external general-population benchmark. Cost: SMRs are not mutually comparable across cohorts with different age/sex structures, whereas directly standardized rates are. Prefer indirect for single-cohort-vs-population comparisons and sparse data; prefer direct when you must rank or compare several exposed groups. - vs a confounding-adjusted internal comparator (e.g., active-comparator new-user cohort with PS weighting): The SMR/SIR is far simpler and requires only external rates, with no need for an internal unexposed arm. Cost: it controls only for the standardization variables (age, sex, period) and inherits all residual differences between the cohort and the reference population (healthy-worker effect, selection, ascertainment, secular drift). It cannot answer "drug A vs drug B." Prefer SMR/SIR for benchmarking event burden against population norms; prefer an adjusted internal comparison for comparative effectiveness or safety where confounding by indication is the threat. - vs a crude rate ratio: Indirect standardization removes confounding by the standardization variables (typically the strongest confounders, age and sex). Cost: residual confounding by everything not in the strata, and the comparability limitation above. Prefer SMR/SIR over a crude O/E whenever the cohort and reference differ in age/sex/period mix.
When to use
Benchmarking a defined cohort's mortality or incidence against general-population or registry rates (e.g., excess cancer incidence in an occupational or immunosuppressed cohort; excess mortality in a disease registry); signal detection for elevated event burden when no suitable internal comparator exists; small cohorts or rare-stratum settings where direct standardization is too unstable; regulatory/safety contexts where an external population rate is the accepted reference (e.g., observed-vs-expected analyses in registries).
When NOT to use — and when it is actively misleading or dangerous
- As a comparative treatment effect. An SMR/SIR is not a confounding-adjusted contrast between exposures. Using it to claim drug A is "safer than" drug B because A's SMR is lower than B's SMR is a classic error: the two SMRs are weighted by different person-time distributions and are not comparable. If you need a treatment comparison, build an internal active-comparator cohort. - When the reference rates come from a different calendar period or population than the cohort's person-time. Secular decline in cardiovascular mortality, or rising cancer-screening-driven incidence, will inflate or deflate the SMR/SIR purely as an artifact. Match reference rates to the cohort's calendar years and demographic definitions. - When the cohort is selected on health (healthy-worker / healthy-volunteer effect). Employed or enrolled cohorts are systematically healthier than the general population, biasing SMRs below 1 for reasons that have nothing to do with the exposure. Indirect standardization does nothing to fix this. - When stratum-specific reference rates are unavailable for the cohort's full strata (e.g., very old ages, rare race/ethnicity cells), forcing rate borrowing or collapsing that introduces residual confounding by the collapsed variable. - Ranking several exposed subgroups by their SMRs. This is the Breslow–Day non-comparability trap: only direct standardization (or a formal SMR ratio with caution) supports cross-group comparison.
Data-source operational depth
- Claims (FFS vs Medicare Advantage): Person-time must be built from continuous-enrollment spans, and the denominator must exactly match the source of the numerator. The dominant failure mode is Medicare Advantage-only person-time: MA encounters are incompletely reported in FFS claims files, so events (the SMR numerator) are undercounted while person-time (the denominator) may still accrue, deflating the SMR. Restrict to enrollees with full Parts A/B (and D for drug exposures) and exclude MA-only person-time, or use a data source with complete MA capture. Diagnosis-based outcome ascertainment also differs from the registry-based ascertainment underlying most reference rates, creating numerator/denominator definitional mismatch. - EHR: Visit-driven capture means person-time is hard to define (when does follow-up end for a patient who simply stops coming?), and events occurring outside the system (death at home, care at another health system) are missed, biasing SMRs downward. Link to a death index (e.g., NDI) before computing mortality SMRs; otherwise the observed count is incomplete relative to the population-based reference. - Registry (cancer, disease): The natural home for SIRs — incident events are adjudicated and the reference incidence rates (e.g., SEER) are population-based and stratum-specific. Watch registry completeness and the lag between diagnosis and registration, and ensure the SIR's reference rates cover the same geography and years as the registry's catchment. - Linked claims–EHR–registry–vital-records: The ideal substrate: registry-adjudicated events and reference rates, claims/EHR person-time, and vital-records death. Linkage selection (only the linkable subset) and date-discrepancy issues (diagnosis date vs registration date vs claim date) must be reconciled before assigning events to person-time strata. - Competing risks (especially in elderly claims cohorts): Applying all-cause-mortality reference rates to a cohort with a differential competing-risk profile (e.g., high cardiovascular mortality removing people before the cancer of interest) distorts the expected count. For cause-specific SMRs, ensure both the observed events and the reference rates are cause-specific, and recognize that differential competing risks across compared cohorts further break SMR comparability.
Worked example (claims-style SIR)
Question: is incident colorectal cancer (CRC) elevated among adults who initiated a specific immunosuppressant, versus the U.S. general population? (1) Cohort: first fill of the drug = index date; require 365 days of continuous Parts A/B/D FFS enrollment before index (no MA-only spans) so person-time and events are observable; exclude anyone with a prior CRC diagnosis. (2) Person-time: from index to the first of incident CRC (≥1 inpatient or ≥2 outpatient CRC diagnoses ≥30 days apart, the validated claims definition), disenrollment, death, or end of data — accrued within age (5-year bands) × sex × calendar-year strata. (3) Expected count: for each stratum, multiply the cohort's accrued person-years by the matching SEER age/sex/period CRC incidence rate, then sum across strata. Suppose the cohort accrues 18,432 person-years; the stratum-by-stratum sum of (person-years × SEER rate) gives E = 32.5 expected CRC cases, while O = 47 cases are observed. (4) SIR = 47 / 32.5 = 1.45. (5) Exact Poisson 95% CI (Ulm/Byar): treating O as Poisson with mean E, the lower limit is 0.5·χ²(0.025, 2·47)/32.5 = 1.06 and the upper is 0.5·χ²(0.975, 2·48)/32.5 = 1.92, so SIR 1.45 (95% CI 1.06–1.92) — a statistically elevated incidence. (6) Sensitivity: vary the CRC algorithm (1 vs 2 claims), align SEER years exactly to the cohort's accrual years to rule out secular drift, and report the healthy-initiator caveat (initiators may differ from the general population on screening and comorbidity) since indirect standardization adjusts only for age, sex, and period.
Interpreting the output
Consider the worked example: observed deaths O = 120, expected deaths E = 100.0, yielding SMR = 120 / 100.0 = 1.20.
Formal interpretation: An SMR of 1.20 means the cohort experienced 20% more deaths than would be predicted if its members had died at the same age- and sex-specific rates as the reference population. Expected deaths are computed by applying reference rates to the cohort's own stratum-specific person-time — this is indirect standardization, meaning each stratum is weighted by the cohort's own exposure structure, not by a common external standard. Because different cohorts contribute different age-sex-time mixes, their SMRs are not mutually comparable: an SMR of 1.20 in one cohort and 1.30 in another does not mean the second cohort has higher mortality, because the two denominators weight the age strata differently. SMRs are internally valid for comparing a given cohort to the reference, but cross-cohort comparisons of SMRs require that both cohorts have similar stratum-specific person-time distributions — an assumption that should be checked, not assumed.
Practical interpretation: An SMR of 1.20 with a 95% CI of, for example, 1.06–1.92 (Exact Poisson) indicates statistically elevated mortality relative to the general population benchmark. Before attributing this excess to the condition under study, consider three alternative explanations: the healthy-initiator or healthy-worker effect (cohort members may be systematically sicker or healthier than the general population at baseline, independent of the exposure); secular trends if SEER or vital-statistics reference years are misaligned with the cohort's accrual years; and measurement differences if death ascertainment differs between the cohort and the reference source. The SMR answers "how much more?" — it does not answer "why?" or "is this causal?".
Worked example
Scenario
Researchers want to know whether adults with a rare inflammatory condition die at a higher rate than the general U.S. population. They assembled 3,000 patients from an insurance claims database and followed each person from their first diagnosis until they died, left the insurance plan, or the study ended. Follow-up time was divided into four strata by age group and sex. The researchers then obtained the matching national mortality rates from vital-statistics tables and asked: how many deaths would we expect if these 3,000 patients had died at the same rates as the U.S. population? They counted 120 deaths in the cohort. The calculation below shows how to arrive at the expected count and the final SMR.
Dataset
Study cohort person-time by stratum alongside the matching national reference mortality rates. Each row is one age-and-sex stratum; the analyst would build this by merging the cohort's person-time table with the downloaded vital-statistics rate file.
| stratum_age | stratum_sex | cohort_person_years | reference_rate_per_person_year | expected_events |
|---|---|---|---|---|
| 40–54 | Female | 1000 | 0.04 | 40.0 |
| 40–54 | Male | 800 | 0.025 | 20.0 |
| 55–69 | Female | 600 | 0.05 | 30.0 |
| 55–69 | Male | 400 | 0.025 | 10.0 |
Steps
For each stratum, multiply the cohort's person-years by the reference rate: stratum '40–54 Female' contributes 1,000 × 0.040 = 40.0 expected deaths.
Repeat for every stratum: '40–54 Male' gives 800 × 0.025 = 20.0; '55–69 Female' gives 600 × 0.050 = 30.0; '55–69 Male' gives 400 × 0.025 = 10.0.
Sum all four expected-event values: E = 40.0 + 20.0 + 30.0 + 10.0 = 100.0 expected deaths.
Count the observed deaths in the cohort: O = 120.
Divide observed by expected: SMR = O / E = 120 / 100.0 = 1.20.
Result
SMR = 1.20. The cohort experienced 20% more deaths than would be predicted if they had died at the same age- and sex-specific rates as the general U.S. population. Because the result exceeds 1.0, this signals excess mortality relative to the population benchmark — though indirect standardization alone cannot explain why (the difference could reflect the disease itself, unmeasured lifestyle factors, or differences in care).
Runnable example
python implementation
Indirect standardization (SMR/SIR) from claims/registry-style inputs. Required tables (already cleaned): ptime : cohort person-time by stratum -> stratum_age (5-yr band), stratum_sex, stratum_year, person_years events: cohort observed events by stratum ->...
import pandas as pd
from scipy.stats import chi2
STRATA = ["stratum_age", "stratum_sex", "stratum_year"]
def smr_sir(ptime: pd.DataFrame, events: pd.DataFrame, ref: pd.DataFrame, alpha: float = 0.05) -> dict:
# Expected events per stratum = cohort person-time * matching reference rate.
expected = (ptime.merge(ref, on=STRATA, how="left")
.assign(expected=lambda d: d["person_years"] * d["ref_rate"]))
if expected["ref_rate"].isna().any():
raise ValueError("Reference rate missing for some cohort strata; "
"do not collapse silently - resolve the gap explicitly.")
E = expected["expected"].sum()
O = int(events["observed"].sum())
ratio = O / E
# Exact (Byar/Ulm) Poisson confidence interval for the observed count, scaled by E.
lo = chi2.ppf(alpha / 2, 2 * O) / 2 / E if O > 0 else 0.0
hi = chi2.ppf(1 - alpha / 2, 2 * (O + 1)) / 2 / E
return {"observed": O, "expected": round(E, 2),
"smr_sir": round(ratio, 3), "ci_low": round(lo, 3), "ci_high": round(hi, 3)}r implementation
Indirect standardization (SMR/SIR) in R. Two paths are shown: (1) epitools::ageadjust.indirect, the standard canned routine, and (2) an explicit exact-Poisson CI matching the worked example. Inputs: count : observed events per stratum (cohort) pop : cohort...
library(epitools)
# Path 1: canned indirect standardization. `count`/`pop` are the COHORT vectors;
# `stdcount`/`stdpop` are the REFERENCE vectors used to derive expected events.
res <- ageadjust.indirect(count = cohort_events, pop = cohort_pyears,
stdcount = ref_events, stdpop = ref_pyears)
print(res$sir) # observed, expected, SMR/SIR (= "sir" element), and CI
# Path 2: explicit exact-Poisson CI (Byar/Ulm), independent of the package.
O <- sum(cohort_events)
E <- sum(cohort_pyears * ref_rate) # ref_rate = reference rate per stratum
smr <- O / E
ci_low <- if (O > 0) qchisq(0.025, 2 * O) / 2 / E else 0
ci_high <- qchisq(0.975, 2 * (O + 1)) / 2 / E
cat(sprintf("O=%d E=%.2f SMR/SIR=%.3f 95%% CI %.3f-%.3f\n", O, E, smr, ci_low, ci_high))