← Methods repository
CONCEPTADVANCEDPYTHON · R · SAS5 citations

Self-Controlled Risk Interval (SCRI) Design

A within-person design that compares the rate of an acute event in a pre-defined risk interval shortly after a transient exposure with the rate in a pre-defined control interval in the same person, so that all time-fixed individual characteristics cancel; the focused special case of the self-controlled case series used heavily in vaccine safety.

Study Designself-controlled-risk-intervalscriself-controlled-case-seriesvaccine-safetywithin-personrelative-incidenceconditional-poissonrisk-interval
On this page
Methods reference only. Use primary source citations and local policy before applying this in a study protocol, regulatory submission, payer dossier, or clinical decision.
In plain language

The Self-Controlled Risk Interval (SCRI) design asks whether a one-time event like a vaccine raises the short-term chance of a side effect by comparing what happens to the same person in a narrow window right after the exposure versus a later window in the same person. Because both windows belong to the same individual, everything fixed about that person — their genes, their underlying health, how often they see a doctor — is automatically held constant and cannot distort the answer. The design counts only people who actually had the side effect, and it delivers a single number: how many times more often the event occurred in the post-vaccination risk window than in the later comparison window.

When to use it
When long-range time trends are strong and hard to model and the risk window is short; use the full SCCS when efficiency matters and the time structure can be modelled explicitly.
When the exposure is a fixed-time event with a biologically defined risk window; prefer case-crossover when the exposure itself is the transient trigger and the outcome is abrupt.
For acute events after transient exposures dominated by time-fixed confounding; use a cohort design when an absolute or long-term risk is the question.
Watch out for
Uses less of the observation time, so it is less statistically efficient (lower power) than the full SCCS.
Requires a roughly constant background event rate across the risk-plus-control span; a sharp within-window trend biases the contrast.
Estimates only a short-term relative incidence in cases - no absolute risk, no long-term effect, no between-person inference.

Core idea

The self-controlled risk interval (SCRI) design studies whether a transient exposure (most often a vaccine dose) raises the short-term rate of an acute event by comparing, within each affected individual, the event count in a pre-specified risk interval following exposure against the count in a pre-specified control interval in the same person.

Because every comparison is made within a single individual, all characteristics that do not change over the observation period — genetics, sex, baseline frailty, chronic comorbidity, socioeconomic status, healthcare- seeking propensity — are exactly conditioned out: they are constant and cannot confound a within-person contrast. Only cases (people who experienced the event) contribute information; unexposed-or-no-event time and between-person comparisons are discarded.

The effect measure is a relative incidence (incidence rate ratio) comparing the event rate per unit time in the risk interval to that in the control interval, estimated by conditional Poisson regression (equivalently, fixed-effects/conditional likelihood that strata on the individual) with an offset for the length of each interval. SCRI is the deliberately focused cousin of the full self-controlled case series (SCCS): rather than modelling the entire observation period, it pre-specifies a narrow risk window and a narrow comparison window, trading some statistical efficiency for transparency and robustness to long-range time trends.

Relationship to the SCCS

SCRI is a variant of the self-controlled case series (`self-controlled-case-series`): the SCCS uses the full observation time as the comparison and models age/seasonal time with explicit terms; SCRI restricts the comparison to a short, pre-defined control interval near the exposure.

The narrow control interval makes SCRI far less sensitive to long-term secular and age trends (a major SCCS assumption) at the cost of using less of the data, so SCRI is preferred when the event rate has strong age/season structure that is hard to model but is roughly flat over the short risk-plus-control span. Both share the same estimator (conditional Poisson) and the same three core assumptions below.

The three assumptions that make SCRI valid

(1) The event must not affect the probability of subsequent exposure. If having the event changes whether or when a person is (re)vaccinated, the within-person comparison is biased; this is why SCRI/SCCS are appropriate for transient exposures like vaccination that are scheduled independently of the acute event, and inappropriate when the event contraindicates further exposure.

(2) The event must not (substantially) censor or curtail observation, i.e., it should be non-fatal or rare enough that survivor bias from event-related death is negligible; when the event can be fatal, modified SCCS estimators that account for event-dependent observation are required.

(3) No time-varying confounding across the risk and control intervals other than the exposure — the underlying event rate must be constant (or modelled) across the short window, so a sharp peri-event spike unrelated to the exposure (e.g., a concurrent seasonal epidemic) would violate the design unless the control interval is chosen to share that background.

Pros, cons, and trade-offs

- vs cohort / between-person designs: SCRI eliminates all time-fixed confounding by construction, needs no unexposed comparator, and is immune to the confounding-by-indication that plagues between-person vaccine-safety studies.

Cost: it estimates only the relative short-term effect (not an absolute risk or a long-term effect), uses cases only, and is exposed to bias from time-varying confounders within the window. Prefer SCRI for acute events after transient exposures where time-fixed confounding is the dominant threat; prefer a cohort design when an absolute risk, a long-term effect, or an unexposed comparison is the question. - vs the full SCCS (`self-controlled-case-series`): SCCS is more efficient (uses all observation time) but requires correctly modelling age/season trends across the whole period and the no-event-dependent-observation assumption over a longer span.

SCRI's short control interval buys robustness to long-range trends and simpler pre-specification. Prefer SCRI when long-term time trends are strong and hard to model and the risk window is short; prefer SCCS when efficiency matters and the time structure can be modelled. - vs the case-crossover design (`case-crossover`): Both are within-person, but case-crossover compares exposure status in case vs control windows referenced to the event (case-defined sampling), whereas SCRI compares event counts in risk vs control windows referenced to the exposure (exposure-defined sampling).

Case-crossover suits transient exposures and abrupt outcomes (the classic trigger study); SCRI suits a fixed-time exposure (a vaccine dose) with a clear post-exposure risk window. They can be biased by exposure-time trends in opposite ways.

When NOT to use — and when it is actively misleading or dangerous

  • The event changes subsequent exposure. If experiencing the outcome makes further vaccination more or less likely (e.g., a reaction that contraindicates the next dose), the core assumption fails and the relative incidence is biased; using SCRI here is a structural error no amount of window tuning fixes.
  • The event is commonly fatal. Event-dependent censoring (death) breaks the standard estimator; a naive SCRI on a high-fatality outcome overstates or understates the effect. Use event-dependent SCCS extensions or a different design.
  • Time-varying confounding within the window. A seasonal epidemic, a co-administered intervention, or an age effect that differs sharply between the risk and control intervals contaminates the contrast; SCRI cannot adjust for what it does not model, and a poorly placed control interval bakes the bias in.
  • Reading a relative incidence as an absolute or long-term risk. SCRI delivers a short-window rate ratio only; narrating it as the probability a vaccinee will be harmed, or as a chronic effect, misrepresents the estimand.
  • A pre-exposure risk period contaminated by the indication. If people are exposed because of early symptoms of the event (e.g., vaccinated during a prodrome), event counts cluster just before exposure; ignoring a pre-exposure window biases the risk-interval estimate. Model or exclude the pre-exposure period.

Data-source operational depth

- Claims: Exposure (vaccine administration) is captured by CPT/CVX/NDC codes with a service date that anchors the risk and control intervals; the acute outcome is an inpatient or ED claim with a specific diagnosis and admission date.

Require continuous enrollment spanning the entire observation window so neither interval is truncated by disenrollment, and restrict to fee-for-service-observable time so Medicare Advantage gaps do not silently shorten an interval. Same-day duplicate/reversed claims and claims lag near the data cut must be cleaned before counting events.

  • EHR: Vaccine administration may be recorded in an immunization table or as an order; outcomes are encounter-driven, so an event treated elsewhere is missed and can differentially shorten an interval. Require demonstrable in-system activity across the observation window and confirm the immunization record is complete (often supplemented by a state immunization information system in linked data).
  • Registry / linked (e.g., Vaccine Safety Datalink, Sentinel): The strongest substrate: an immunization registry supplies exact dose dates and a linked claims/EHR feed supplies adjudicated, well-dated acute events. Linkage selects the linkable subset and dose-date vs claim-date discrepancies must be reconciled before assigning intervals; these distributed networks are where SCRI is most heavily deployed for near-real-time signal monitoring.

Decision diagram

flowchart LR
  Dose([Vaccine dose<br/>time zero]) --> Pre[Pre-exposure window<br/>exclude or model]
  Dose --> Risk[Risk interval<br/>e.g., days 0-7]
  Dose --> Control[Control interval<br/>e.g., days 14-42]
  Risk --> Count1[Event count in risk interval]
  Control --> Count2[Event count in control interval]
  Count1 --> RI[Conditional Poisson<br/>relative incidence = rate_risk / rate_control]
  Count2 --> RI
  RI --> Within[Within-person: all time-fixed<br/>confounders cancel]
SCRI anchors a short risk interval and a short control interval on the exposure date and compares within-person event rates by conditional Poisson regression, so all time-fixed individual characteristics cancel.
flowchart TD
  Q{Transient exposure + acute outcome?} -->|No| Other[Use a cohort or other design]
  Q -->|Yes| A1{Does the event change<br/>subsequent exposure?}
  A1 -->|Yes| Stop1[SCRI invalid<br/>assumption violated]
  A1 -->|No| A2{Is the event commonly fatal?}
  A2 -->|Yes| Stop2[Event-dependent censoring<br/>use modified SCCS]
  A2 -->|No| A3{Background rate flat across<br/>risk + control span?}
  A3 -->|No, strong trend| SCCS[Prefer full SCCS with<br/>time modelling]
  A3 -->|Yes| SCRI[SCRI appropriate<br/>conditional Poisson relative incidence]
Decision logic for SCRI eligibility. The design requires a transient exposure not triggered by the event, a non-fatal/uncensoring outcome, and a roughly constant background rate across the short window; otherwise switch to a modified SCCS or a cohort design.

Worked example

Scenario

Researchers want to know whether the influenza vaccine raises the short-term risk of febrile seizures in young children. They pull claims data for 8 children who each had at least one febrile seizure during the study period. For each child, they define two windows anchored on the date the vaccine was given: a risk interval of 8 days (days 1 through 8 after the dose) and a control interval of 29 days (days 15 through 43 after the dose). They count how many seizures each child had in each window, then compare the rates.

Dataset

One row per child per interval. Each child appears twice: once for the risk interval and once for the control interval. events = seizures counted in that window; ptime = how many days that window lasts.

person_idintervaleventsptime_days
C001risk18
C001control029
C002risk18
C002control029
C003risk08
C003control129
C004risk18
C004control029
C005risk18
C005control029
C006risk18
C006control129
C007risk18
C007control029
C008risk08
C008control129
FIG. 1 — DESIGN TIMELINE
Horizontal timeline starting at vaccination on 2024-01-15. A green bar spans the 8-day risk interval from 2024-01-16 to 2024-01-23 with a seizure marker on 2024-01-20. A grey bar marks the gap days 2024-01-24 to 2024-01-29. A blue bar spans the 29-day control interval from 2024-01-30 to 2024-02-27 with no events. The relative incidence is shown as risk rate divided by control rate.
Child C001 received the influenza vaccine on 2024-01-15. One febrile seizure occurred on Day 5 (2024-01-20), inside the 8-day risk interval. No seizure occurred during the 29-day control interval. The gap between intervals (days 9-14) is excluded from analysis.

Steps

1Sum the events in each interval across all 8 children: 6 seizures occurred during the 8-day risk windows; 3 seizures occurred during the 29-day control windows.
2Compute the total person-days of observation in each interval: 8 children x 8 days = 64 child-days at risk; 8 children x 29 days = 232 child-days in the control.
3Calculate the event rate in the risk interval: 6 events / 64 child-days = 0.0938 seizures per child-day.
4Calculate the event rate in the control interval: 3 events / 232 child-days = 0.0129 seizures per child-day.
5Divide the risk rate by the control rate: 0.0938 / 0.0129 = 7.25. This is the relative incidence.
6Because both windows belong to the same children, everything fixed about each child (their genetics, their general health, how often their parents bring them to the doctor) has already been held constant by design.

Result

Relative incidence = 7.25, meaning febrile seizures occurred about 7 times more often in the 8 days right after the vaccine dose than in the later 29-day control window, in the same children. (Risk rate: 6 events / 64 child-days = 0.0938 per child-day; Control rate: 3 events / 232 child-days = 0.0129 per child-day; ratio = 7.25.)

Trade-offs

Pros of this
A short, pre-specified control interval makes SCRI far less sensitive to long-term age/seasonal time trends and simpler to pre-specify; same conditional-Poisson estimator.
Pros of this
Exposure-anchored windows fit a scheduled point exposure (a vaccine dose) with a clear post-exposure risk period; counts events rather than sampling control exposure times.
Pros of this
Eliminates all time-fixed confounding by within-person comparison and needs no unexposed comparator, erasing confounding by indication.

Runnable example

SCRI relative incidence by conditional Poisson regression. Input is one row per (case, interval): person_id, period ('risk' or 'control'), events (count in that interval for that person), and ptime (interval length in days).

requires: pandas · numpy · statsmodels
import numpy as np
import pandas as pd
import statsmodels.formula.api as smf
import statsmodels.api as sm

# Long format: two rows per case (risk + control). 'events' is the count; 'ptime' is interval length (days).
# Example: risk = days 0-7 (8 days), control = days 14-42 (29 days) after the dose.
df = pd.DataFrame({
    "person_id": np.repeat(np.arange(1, 9), 2),
    "period":    ["risk", "control"] * 8,
    "events":    [1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1],
    "ptime":     [8, 29] * 8,
})
df["risk"]    = (df["period"] == "risk").astype(int)
df["log_pt"]  = np.log(df["ptime"])

# Conditional Poisson via person fixed effects + length offset. C(person_id) strata the individual,
# so all time-fixed characteristics cancel; exp(beta_risk) is the relative incidence.
fit = smf.glm("events ~ risk + C(person_id)", data=df,
              family=sm.families.Poisson(), offset=df["log_pt"]).fit()
ri  = np.exp(fit.params["risk"])
ci  = np.exp(fit.conf_int().loc["risk"])
print(f"Relative incidence (risk vs control) = {ri:.2f} "
      f"(95% CI {ci[0]:.2f}-{ci[1]:.2f})")

Citations

FOUNDATIONAL / METHODS
  1. [1]Li R, Stewart B, Weintraub E. Evaluating efficiency and statistical power of self-controlled case series and self-controlled risk interval designs in vaccine safety. Journal of Biopharmaceutical Statistics. 2016;26(4):686-693.
  2. [2]Li R, Kulldorff M, Russek-Cohen E, Kawai AT, Hua W. Quantifying the impact of time-varying baseline risk adjustment in the self-controlled risk interval design. Pharmacoepidemiology and Drug Safety. 2015;24(12):1304-1312.
  3. [3]Whitaker HJ, Farrington CP, Spiessens B, Musonda P. Tutorial in biostatistics: the self-controlled case series method. Statistics in Medicine. 2006;25(10):1768-1797.
APPLIED EXAMPLES
  1. [4]Yih WK, Maro JC, Nguyen M, et al. Assessment of quadrivalent human papillomavirus vaccine safety using the self-controlled tree-temporal scan statistic signal-detection method in the Sentinel system. American Journal of Epidemiology. 2018;187(6):1269-1276.
REPORTING & GUIDANCE
  1. [5]Tse A, Tseng HF, Greene SK, Vellozzi C, Lee GM. Signal identification and evaluation for risk of febrile seizures in children following trivalent inactivated influenza vaccine in the Vaccine Safety Datalink Project, 2010-2011. Vaccine. 2012;30(11):2024-2031.