New-User (Incident-User) Design
A cohort design that restricts to patients initiating the exposure of interest after a drug-free washout and starts follow-up at initiation (time zero), so that follow-up, covariate measurement, and outcome ascertainment all begin at the same point in the treatment course and prevalent-user biases are avoided.
In plain language
The new-user design builds a study group out of only the patients who are starting a drug for the first time, then starts the clock for everyone on the day of that first fill. To qualify, a patient must have a clean lookback period (a stretch of time, often a year, with no fill of that drug) so you know they are truly new to it, not someone who has been on it for years. Starting everyone at the same point keeps the comparison fair, because patients already on a drug are a survivor group that tends to look healthier than the people a doctor is actually deciding to treat. It does not fix every problem on its own: it can't tell you why a doctor chose this drug, so you usually still need a comparison drug.
The new-user (incident-user) design restricts the analytic cohort to patients who start the exposure of interest during the study period, after a defined lookback (washout) window in which they had no dispensing of that drug or drug class. Follow-up, baseline covariate measurement, and the outcome clock all begin at time zero = the first qualifying fill. This single restriction makes an observational cohort behave, at the moment of the treatment decision, like the enrollment of a randomized trial: everyone is at the same point in their treatment trajectory, no one has accrued on-treatment history, and there is no follow-up time before the exposure decision.
Core conceptual distinction — new-user vs prevalent-user
A prevalent-user (ever-exposed) cohort enrolls patients who are already taking the drug at the start of observation. This induces three biases that the new-user restriction removes. (1) Depletion of susceptibles / survivor bias: prevalent users are survivors who already tolerated the drug and did not have an early event, so they look systematically healthier than the patients a clinician is actually deciding to treat. (2) Adjustment for post-initiation covariates: variables measured at the start of observation in a prevalent cohort (lab values, weight, blood pressure) are themselves consequences of prior treatment — conditioning on them adjusts away part of the drug effect or opens collider paths. (3) Left-censoring / immortal time: early events that occurred before the observation window are invisible, and time before initiation is misclassified. The new-user design fixes all three by construction because every patient enters at initiation with only pre-treatment history. The design does not by itself remove confounding by indication or healthy-user bias — those require an active comparator and/or covariate adjustment; the new-user restriction is necessary but not sufficient.
Estimand
Aligning time zero at initiation makes the natural estimand an intention-to-treat-like contrast under an initiation strategy (effect of starting the drug), or an as-treated / per-protocol contrast if you additionally censor at discontinuation/switching and weight for the resulting informative censoring. Pre-specify which: an ITT-style initiation contrast and an as-treated contrast answer different questions and rarely coincide when adherence differs.
Pros, cons, and trade-offs
- vs prevalent-user / ever-exposed designs: the new-user design eliminates depletion of susceptibles, survivor bias, immortal time, and adjustment for post-initiation mediators. Cost: smaller cohorts, loss of patients who initiated before the data window, and a population of initiators that may differ from the prevalent users who dominate day-to-day practice. Prefer new-user for nearly all comparative safety/effectiveness questions; fall back to a prevalent new-user design (Suissa's time-conditional propensity-score extension) only when true initiation is too rare to study. - vs new-user + active comparator (ACNU): a plain new-user design with a non-user reference still suffers confounding by indication and healthy-user/healthy-adherer bias, because treated patients differ from untreated patients for reasons tied to the outcome. Adding an active comparator (initiators of a different drug for the same indication) attacks those biases and improves covariate overlap. Prefer ACNU whenever a clinically interchangeable comparator exists; reserve the non-user new-user contrast for questions that are genuinely "drug vs no drug" (e.g., vaccine vs unvaccinated, where no active comparator exists). - vs prescription-time-distribution / waiting-time approaches to incident use: those infer incidence from refill patterns without a fixed washout; they are cheaper but less defensible for causal contrasts. Prefer an explicit washout for regulatory-grade work.
When to use
Comparative effectiveness or safety of a drug initiation in claims, EHR, registry, or linked data; any setting where prevalent users would carry survivor bias or post-baseline covariates; as the structural backbone of a target-trial emulation (the new-user restriction is how you assign time zero). The washout length is the key tuning knob: long enough that re-initiators are not misclassified as new users (180–365 days is typical; ≥365 days for chronic therapies with intermittent use), but not so long that it shrinks the cohort below usable size.
When NOT to use — and when it is actively misleading
- The washout cannot be observed. If continuous enrollment does not span the full lookback, "no prior fill" is missingness, not a true washout, and you silently enroll prevalent users as new users. In claims this is the dominant failure mode (see below). Diagnose by tabulating enrollment coverage across the lookback before applying the restriction. - The drug is used intermittently or in courses (antibiotics, antifungals, opioids, oral steroids). A 180-day washout will classify a patient on their fifth course as a "new user." Either lengthen the washout to cover the typical re-treatment interval or define episodes explicitly; otherwise the incident-user assumption is false. - You force a new-user restriction onto a question that is intrinsically about prevalent or chronic use (e.g., the effect of long-term statin exposure on a slow outcome). Restricting to initiators discards exactly the long-exposure person-time you need and can bias toward the null; a prevalent new-user or duration-response design is more appropriate. - Initiation is so rare that the cohort is underpowered — reaching for a prevalent-user design re-introduces survivor bias, so the honest answer is often a prevalent new-user (time-conditional PS) design rather than abandoning incidence.
Data-source operational depth
- Claims (FFS or commercial): Exposure = pharmacy claim (NDC + `fill_date` + `days_supply`). Index date = first qualifying fill after the washout; require continuous medical + pharmacy enrollment across the entire lookback so the absence of prior dispensing is observed rather than missing. Failure modes: (a) Medicare Advantage person-time lacks fee-for-service claims — MA-only enrollees can appear drug-free simply because their fills are invisible; restrict to enrollees with Parts A/B/D (or commercial medical+pharmacy) across the washout and exclude MA-only spans. (b) Differential competing risks by exposure in elderly claims — drugs preferentially used in frailer patients carry more death (a competing risk) that censors the outcome differentially; for absolute-risk questions use a cumulative-incidence framework, not naive Kaplan–Meier. (c) Sample fills, 90-day mail-order, and stockpiling distort `days_supply` and therefore on-treatment windows. (d) Immortal time in procedure/initiation studies — if you anchor follow-up at diagnosis but require a fill to be "exposed," the gap between diagnosis and first fill is immortal; anchor time zero at the fill itself. - EHR: Initiation is the medication order or administration, not a dispensing — a patient may be ordered a drug and never fill it. Prefer linkage to pharmacy claims to confirm the patient actually started. Problem lists, labs, and notes sharpen the indication and baseline severity (an advantage over claims), but visit-driven capture means a patient who leaves the system is differentially lost; define observation windows explicitly and treat loss to follow-up as potentially informative. - Registry: Strong for indication, disease severity, and adjudicated outcomes; typically weak for complete pharmacy exposure and for confirming the absence of prior use. Link to claims for the full fill history (to validate the washout) and to a death index to firm up censoring. - Linked claims–EHR–vital records: The ideal substrate — EHR severity + claims completeness + reliable mortality — but linkage introduces selection (only the linkable subset) and date-discrepancy issues between order, fill, and service dates that must be reconciled before time-zero assignment.
Worked claims example
Question: incidence of acute myocardial infarction after initiating a new oral antihyperglycemic among adults with type 2 diabetes in a commercial + Medicare fee-for-service database. (1) Eligibility: age ≥18; ≥2 diabetes diagnoses (`E11.x`) in the lookback; 365 days of continuous medical + pharmacy (or A/B/D) enrollment before the first study fill. (2) Washout: no fill of the study drug (or its class, by NDC list) in the 365-day lookback — this is what makes the patient an incident user. (3) Time zero: the date of that first qualifying fill (`index_date`); covariates are measured only in `[index_date − 365, index_date]`, never after. (4) Follow-up: from `index_date` to first validated AMI, censoring at disenrollment, death, end of data, and — for an as-treated analysis — discontinuation (last `days_supply` end + a pre-specified 30-day grace period) or switch. (5) First-event coding: keep the first AMI per person; require a continuous-enrollment gap rule so events during unobserved (e.g., MA) spans are not counted. (6) Sensitivity: re-run with 180-day and 730-day washouts, vary the grace period, and add a negative-control outcome to probe residual confounding. Pairing this design with an active comparator (initiators of a different antihyperglycemic) is the standard next step to control confounding by indication.
Worked example
Scenario
One commercially insured adult with type 2 diabetes appears in a pharmacy claims table. We want to decide whether they count as a new user of a study drug and, if so, set their day zero and start their outcome clock. We use a 365-day washout: the patient must have unbroken coverage for that full year and no earlier fill of the study drug.
Dataset
The raw rows an analyst would see in a claims pharmacy table plus an enrollment span.
| person_id | fill_date | drug | days_supply |
|---|---|---|---|
| 2001 | 2024-01-15 | study_drug | 90 |
| 2001 | 2024-04-14 | study_drug | 90 |
Steps
The earliest study_drug fill is 2024-01-15, so that is the candidate day zero (index date).
The washout is the 365 days before index: 2023-01-15 through 2024-01-14. There is no study_drug fill in that window, so the patient is a new user.
Check coverage: enrollment runs 2023-01-01 to 2024-12-31, which fully spans the washout start (2023-01-15) through index, so the clean lookback was actually observed, not just missing.
Start the outcome clock at index (2024-01-15). The first 90-day fill covers 2024-01-15 through 2024-04-13, and the second fill picks up the next day, so coverage is continuous.
The patient has a first heart attack (AMI) on 2024-06-10. Follow-up time is the days from index to that event.
Result
Patient 2001 qualifies as a new user: 365-day washout (2023-01-15 to 2024-01-14) is clean and fully covered by enrollment, index date = 2024-01-15, and follow-up to the AMI on 2024-06-10 = 147 days.
Timeline Spec
- Title
New-user timeline for one incident initiator: 365-day washout, time zero at first fill, follow-up to AMI
- Window
- Start
2023-01-15
- End
2024-06-10
- Label
Washout (365 days) plus follow-up for one initiator
- Events
- Label
Fill A (index)
- Start
2024-01-15
- Length Days
90
- Quantity
90 days_supply
- Label
Fill B
- Start
2024-04-14
- Length Days
90
- Quantity
90 days_supply
- Spans
- Kind
washout
- Start
2023-01-15
- End
2024-01-14
- Label
365-day washout: no study-drug fill, enrollment observed
- Kind
exposed
- Start
2024-01-15
- End
2024-04-13
- Label
90 covered days (Fill A)
- Kind
exposed
- Start
2024-04-14
- End
2024-06-10
- Label
on-treatment continues (Fill B)
- Kind
followup
- Start
2024-01-15
- End
2024-06-10
- Label
147 follow-up days to AMI
- Result
- Label
New user: 365-day clean washout, index 2024-01-15, 147 follow-up days to AMI
- Value
147
- Caption
One initiator's timeline: a fully observed 365-day washout confirms new-user status, time zero is set at the first fill on 2024-01-15, and the outcome clock runs 147 days to the AMI on 2024-06-10. Because baseline is measured before the index fill and follow-up starts at the fill, there is no time counted before the treatment decision.
- Alt Text
Timeline showing a 365-day washout from 2023-01-15 to 2024-01-14 with no study-drug fill, an index fill on 2024-01-15, a second fill on 2024-04-14 keeping coverage continuous, and a follow-up span of 147 days ending at an AMI event on 2024-06-10.
Runnable example
python implementation
New-user cohort construction from claims-style inputs (cohort build, not estimation). Required inputs (already cleaned and de-duplicated): rx : pharmacy fills -> person_id, fill_date (datetime), is_study_drug (bool), days_supply (int) enroll : enrollment...
import pandas as pd
WASHOUT_DAYS = 365 # drug-free + continuous-enrollment lookback that defines an "incident user"
def build_new_user_cohort(rx: pd.DataFrame, enroll: pd.DataFrame) -> pd.DataFrame:
rx = rx.sort_values(["person_id", "fill_date"])
# Candidate time zero = first fill of the study drug for each person.
study = rx[rx["is_study_drug"]]
idx = (study.groupby("person_id", as_index=False)
.first()[["person_id", "fill_date"]]
.rename(columns={"fill_date": "index_date"}))
# New-user restriction: drop anyone with a study-drug fill in the washout window BEFORE the index date.
prior = study.merge(idx, on="person_id")
had_prior = prior[(prior["fill_date"] < prior["index_date"]) &
(prior["fill_date"] >= prior["index_date"] - pd.Timedelta(days=WASHOUT_DAYS))]
idx = idx[~idx["person_id"].isin(had_prior["person_id"])].copy()
# Continuous, FFS-observable enrollment spanning the full washout through index (no MA-only gaps),
# so that "no prior fill" is genuinely observed rather than missing.
e = enroll.merge(idx, on="person_id")
covers = ((e["enroll_start"] <= e["index_date"] - pd.Timedelta(days=WASHOUT_DAYS)) &
(e["enroll_end"] >= e["index_date"]) &
(~e["ma_only"]))
eligible = e.loc[covers, "person_id"].unique()
cohort = idx[idx["person_id"].isin(eligible)].copy()
cohort["baseline_start"] = cohort["index_date"] - pd.Timedelta(days=WASHOUT_DAYS)
return cohort[["person_id", "index_date", "baseline_start"]].reset_index(drop=True)r implementation
New-user cohort construction with data.table. Inputs mirror the Python version: rx : person_id, fill_date (Date), is_study_drug (logical), days_supply (integer) enroll : person_id, enroll_start, enroll_end (Date), ma_only (logical) Returns one row per...
library(data.table)
WASHOUT_DAYS <- 365L
build_new_user_cohort <- function(rx, enroll) {
setDT(rx); setDT(enroll)
setorder(rx, person_id, fill_date)
# Candidate time zero = first study-drug fill per person.
study <- rx[is_study_drug == TRUE]
idx <- study[, .(index_date = fill_date[1L]), by = person_id]
# New-user: drop anyone with a study-drug fill in the washout window before index.
study <- merge(study, idx, by = "person_id")
prior_ids <- unique(study[fill_date < index_date &
fill_date >= index_date - WASHOUT_DAYS, person_id])
idx <- idx[!person_id %chin% prior_ids]
# Continuous, FFS-observable enrollment across the full washout through index (no MA-only spans).
e <- merge(enroll, idx, by = "person_id")
ok <- e[enroll_start <= index_date - WASHOUT_DAYS &
enroll_end >= index_date & ma_only == FALSE, unique(person_id)]
cohort <- idx[person_id %chin% ok]
cohort[, baseline_start := index_date - WASHOUT_DAYS]
cohort[, .(person_id, index_date, baseline_start)]
}