Prevalent User Bias
The bias that arises when a drug cohort includes patients already on treatment at the start of follow-up (prevalent users) rather than restricting to incident initiators at a common time zero, conflating early discontinuers and events with later survivors and inducing depletion of susceptibles, immortal time, and adjustment for post-initiation covariates.
In plain language
Prevalent user bias happens when a drug study includes patients who were already taking the medication before the study clock started, rather than starting everyone's clock at their very first fill. Those long-term users survived the earliest, riskiest months on the drug — the patients who had early side effects or stopped early are already gone, leaving a group that looks healthier than a true beginner. As a result, the study underestimates early harms and can make a drug look safer than it really is for someone just starting it. The fix is the new-user design: only enroll patients at their very first fill, so every person's early risk period is actually watched.
Prevalent user bias
(also called survivor bias or depletion-of-susceptibles bias) is the systematic error that occurs when an observational drug study counts person-time and outcomes from patients who were already taking the drug when follow-up began, instead of restricting to incident (new) users whose follow-up starts at first exposure. A prevalent cohort is a left-truncated, conditionally selected sample: to appear in it, a patient had to survive on treatment, free of the outcome and free of intolerable side effects, long enough to still be filling the drug at study entry. The early high-risk window — the first weeks and months when adverse events, discontinuations, and the strongest treatment effects concentrate — is invisible. What remains is an enriched pool of tolerators who look healthier than a representative initiator, biasing harms toward the null and exaggerating apparent benefit.
Core conceptual distinction
. Three distinct mechanisms ride together under one label, and separating them is what makes the bias tractable. (1) Depletion of susceptibles: patients destined to be harmed (or to respond poorly) have already left the population by study entry, so the surviving prevalent users are a selected, lower-risk subset — the hazard you observe is not the hazard a new initiator faces. (2) Immortal time / time-zero misalignment: if follow-up starts at a landmark other than initiation (a diagnosis date, an enrollment date, the calendar start of the database), the span between true initiation and study entry is guaranteed event-free by construction, manufacturing apparent protection. (3) Adjustment for post-initiation covariates: baseline covariates measured at study entry for a prevalent user are actually consequences of prior treatment (a normalized LDL, a controlled blood pressure, a stable HbA1c), so conditioning on them adjusts away part of the very effect under study or opens collider paths. The corresponding estimand distinction: prevalent-user analyses target a vague "effect of being on the drug" averaged over an unknowable mix of durations; the new-user design targets the well-defined effect of initiating treatment versus a comparator strategy from a common time zero — the quantity a clinician and a regulator can act on.
Pros, cons, and trade-offs
- vs the new-user (incident-user) design — the canonical fix. New-user restriction sets time zero at first fill after a clean washout, eliminating depletion of susceptibles, immortal time, and post-initiation adjustment in one move. Cost: smaller cohorts and a population of initiators, who may differ from the prevalent users who dominate real-world prescribing; rare or expensive drugs may yield too few incident users. Prefer new-user for essentially every causal question about a treatment's effect, especially safety and early effects. - vs the prevalent new-user (time-conditional PS) design (Suissa 2017) — a middle path when pure incident users are too few. It matches prevalent users to new users on duration of current use via time-conditional propensity scores, recovering sample size while restoring a defensible time zero for each matched set. Cost: more complex, assumes the duration-conditional exchangeability holds, and still cannot resurrect the unobserved early discontinuers. Prefer it over a naive prevalent cohort whenever incident-only analysis is underpowered. - vs simply keeping the prevalent/ever-exposed cohort — larger N and superficial "real-world representativeness." But for any initiation question this is the bias you came to remove; it is rarely defensible and routinely overturned when an incident-user re-analysis is run. Acceptable only for descriptive prevalence-of-use questions, never for comparative causal estimates.
When to use
. This is a bias to recognize and prevent, not a method to apply. Invoke this concept whenever you build or review a cohort of chronic-drug users in claims, EHR, or registry data: statins, antihypertensives, oral antidiabetics, DMARDs, biologics, antidepressants, inhaled COPD/asthma therapies. Use it as the diagnostic lens during protocol design (is time zero initiation?), during data management (does the washout truly capture no prior use?), and during peer review of any study that reports "current users," "ever exposed," or a flat exposure flag without a stated index date.
When NOT to use — and when it is actively misleading or dangerous
- Do not accept a prevalent-user cohort for any initiation or safety question. Reporting an attenuated or null harm from a prevalent cohort is the dangerous failure mode: depletion of susceptibles hides exactly the early excess risk that pharmacovigilance exists to detect (the rofecoxib and HRT histories are object lessons). A "reassuring" prevalent-user safety result can be affirmatively harmful. - Do not "fix" a prevalent cohort by adjusting for baseline covariates measured at study entry. Those covariates are post-initiation; adjustment makes the estimate worse, not better, by controlling away the treatment effect or inducing collider bias. - Do not impose new-user restriction blindly when the drug is genuinely never-stopped and the question is about long-term maintenance — but even then, anchor time zero at initiation and follow forward; the prevalent shortcut is still wrong. - Do not assume "no fill in the lookback" means new use when the lookback is unobserved (Medicare Advantage-only person-time, a new health-plan enrollee, a registry whose drug-start field is blank). Misclassified prevalent users masquerading as incident users reintroduce the bias silently.
Data-source operational depth
- Claims (FFS or commercial): The defining operation is the washout. Require continuous medical AND pharmacy enrollment across the full lookback (commonly 365 days, sometimes 180) so that "no prior fill" reflects true absence, not unobserved care. The dominant failure mode is Medicare Advantage: MA encounter data are incomplete and FFS pharmacy claims are absent, so a long-time user who switched into your view looks incident — restrict to enrollees with Parts A/B/D (or a commercial medical+pharmacy benefit) and exclude MA-only person-time. Stockpiling, 90-day mail-order, and free samples distort `days_supply` and can hide a prior fill that ran into the lookback. Differential competing risks bite in elderly claims: prevalent users who survived to study entry have differentially lower competing mortality than a representative initiator, further selecting the cohort. - EHR: Initiation is the order or administration, not the dispense — but a medication-list entry marked "active" often has no reliable start date and may be a carry-over reconciled in from an outside system, the textbook prevalent user wearing a new-user costume. Require a first order after a clean gap and, where possible, link to dispensing to confirm the patient actually started. Visit-driven capture also means a patient who leaves the system is differentially lost, compounding survivor selection. - Registry: Enrollment date frequently does not equal treatment start; a disease registry may enroll prevalent cases years into therapy. Require an explicit drug-start-date field and treat enrollment-as-time-zero as an immortal-time trap. Link to claims for the full fill history and to a death index to characterize the competing risk. - Linked claims–EHR–vital records: Best substrate for distinguishing prevalent from incident use (EHR start + claims fill history + mortality), but order/fill/service date discrepancies must be reconciled before assigning time zero, and only the linkable subset is observed (a selection layer on top of the survivor selection).
Worked claims example (depletion of susceptibles in action)
Question: 90-day risk of acute kidney injury (AKI) after starting an ACE inhibitor among adults with hypertension in a commercial + Medicare FFS database. A naive "current user" analyst pulls everyone with an ACEi fill overlapping 2024-01-01 (`fill_date` ≤ index ≤ `fill_date + days_supply`) and follows them 90 days. Suppose the true biology is an early hazard: AKI risk is RR ≈ 2.5 in the first 90 days of initiation, then null. Among 1,000 true initiators (first fill in 2024 after a 365-day fill-free, continuously A/B/D-enrolled lookback), 60 develop AKI in 90 days (6.0%). But the prevalent pool that overlaps 2024-01-01 is dominated by patients who started in 2021–2023 and kept filling — they have already passed through and survived the early-hazard window (the susceptibles were depleted: those who got AKI stopped the drug, switched, or died). Among 4,000 such prevalent users, only 40 AKI events occur in the next 90 days (1.0%). A pooled "current user" rate of (60+40)/(1,000+4,000) = 2.0% buries the 6.0% initiation risk, and an unwary safety read concludes ACEi is well tolerated. The correct construction: index = first ACEi `fill_date` in the study window with no ACEi fill in the prior 365 days and continuous medical+pharmacy FFS enrollment spanning that entire lookback (excluding MA-only person-time so the absence of prior fills is observed, not missing); follow forward 90 days from that fill; censor at disenrollment, death, end of data, and — for an as-treated variant — last `days_supply` end plus a grace period. The diagnostic that exposes the bias is to count, within the naive cohort, how many "current users" had a fill in the prior 365 days (the would-be-excluded prevalent users) and compare their 90-day event rate to that of the true initiators; a large gap is the depletion-of-susceptibles signature.
Interpreting the output
In the ACEi-and-AKI study, the raw dataset mixes 1,000 new initiators (60 events, 90-day risk = 6.0%) with 4,000 prevalent users (40 events, risk = 1.0%). The pooled naive event rate across all 5,000 patients is 100/5,000 = 2.0%.
(1) Formal interpretation. The pooled rate of 2.0% misrepresents the risk that matters for a prescribing decision — the risk a new patient faces when starting ACEi therapy. Prevalent users have already survived the early high-risk window; their 1.0% event rate reflects depletion of susceptibles (patients who developed early AKI, intolerance, or discontinuation are absent from the prevalent pool), not a lower underlying pharmacological hazard. Mixing these populations suppresses the true 6.0% early-initiation risk by a factor of three. A new-user design restricted to first prescriptions recovers the 6.0% figure and provides the clinically relevant risk profile for drug-utilization policy and labeling.
(2) Practical interpretation. A drug-safety signal operating in the first 90 days of therapy will be diluted — potentially below statistical detection thresholds — in any analysis that pools new and prevalent users. The contrast of 6.0% versus 2.0% illustrates a threefold dilution: a dataset appearing to show only modest early risk is actually masking a sixfold higher rate in the population most exposed to that risk. Restricting to new users is not a design preference; it is a precondition for estimating initiation hazards and for detecting time-limited early adverse effects.
Worked example
Scenario
A researcher wants to know whether a blood-pressure drug raises the risk of an acute kidney injury (AKI) in the first 90 days of use. The study window opens on 2024-01-01. Two patients both have a fill of the drug on record. Patient A is a new user — her very first fill was on 2024-01-15, well after the study window opened, and she had no fills in the prior 365 days. Patient B is a prevalent user — he has been filling the drug since mid-2022 and simply happened to have a fill overlapping 2024-01-01. The table below shows their pharmacy records. We then trace what each patient's timeline looks like and why including Patient B alongside Patient A produces a biased estimate of AKI risk.
Dataset
Pharmacy fill records for two patients — the columns an analyst sees in a real claims pharmacy table.
| person_id | fill_date | drug | days_supply |
|---|---|---|---|
| A-101 | 2024-01-15 | lisinopril | 30 |
| A-101 | 2024-02-13 | lisinopril | 30 |
| A-101 | 2024-03-14 | lisinopril | 30 |
| B-202 | 2022-07-01 | lisinopril | 90 |
| B-202 | 2022-09-28 | lisinopril | 90 |
| B-202 | 2022-12-26 | lisinopril | 90 |
| B-202 | 2023-03-25 | lisinopril | 90 |
| B-202 | 2023-06-22 | lisinopril | 90 |
| B-202 | 2023-09-19 | lisinopril | 90 |
| B-202 | 2023-12-01 | lisinopril | 90 |
Steps
Patient A-101: her first-ever lisinopril fill is 2024-01-15 — this becomes her index date (day zero). She has three 30-day fills in a row with no gaps, giving her 90 covered days from 2024-01-15 through 2024-04-13. Her full early-risk window is directly observed.
Patient B-202: his first fill was 2022-07-01 — nearly 18 months before the study opens. By the time the clock starts on 2024-01-01, he has already filled lisinopril 7 times and survived every one of those refills without stopping.
A naive analyst assigns Patient B a study entry date of 2024-01-01 (when the database window opens) rather than his true first-fill date of 2022-07-01. His early high-risk period — July 2022 through December 2023 — is completely invisible to the study.
Because Patient B is still filling the drug on 2024-01-01, he is by definition a survivor: any patient like him who had a serious early reaction, stopped lisinopril, or experienced AKI in 2022–2023 would not appear in the 'current user' pool at all — those susceptible patients were already gone.
If the true AKI risk is highest in the first 90 days of starting lisinopril (say, 6 events per 100 new starters), Patient A-101's data captures that risk. Patient B-202's post-survival follow-up shows a much lower event rate — perhaps 1 per 100 — because the most susceptible patients in his cohort already had their events and are not in the study.
A study that pools Patient A-type new users with Patient B-type prevalent users will produce a blended AKI rate far below 6%, making lisinopril look safer at initiation than it truly is. The correct approach is to include only new users like Patient A, whose index date sits at their first-ever fill after a fill-free lookback window.
Result
- Label
Prevalent users are survivors — their early high-risk period is unobserved, so including them biases the AKI rate toward zero (safe-looking) and away from the true initiation risk of ~6%.
- Value
biased_toward_null
Timeline Spec
- Title
New user vs. prevalent user — what the study clock sees for each patient
- Window
- Start
2024-01-01
- End
2024-04-13
- Label
Study observation window (90-day follow-up)
- Patients
- Id
A-101
- Label
Patient A — NEW user (correct)
- Events
- Label
Fill 1 — index date
- Start
2024-01-15
- Length Days
30
- Quantity
30 days_supply
- Label
Fill 2
- Start
2024-02-13
- Length Days
30
- Quantity
30 days_supply
- Label
Fill 3
- Start
2024-03-14
- Length Days
30
- Quantity
30 days_supply
- Spans
- Kind
exposed
- Start
2024-01-15
- End
2024-04-13
- Label
90 days fully observed — early risk SEEN
- Id
B-202
- Label
Patient B — PREVALENT user (biased)
- Events
- Label
Fill 1 (true start)
- Start
2022-07-01
- Length Days
90
- Quantity
90 days_supply
- Label
Fill 2
- Start
2022-09-28
- Length Days
90
- Quantity
90 days_supply
- Label
Fill 3
- Start
2022-12-26
- Length Days
90
- Quantity
90 days_supply
- Label
Fill 4
- Start
2023-03-25
- Length Days
90
- Quantity
90 days_supply
- Label
Fill 5
- Start
2023-06-22
- Length Days
90
- Quantity
90 days_supply
- Label
Fill 6
- Start
2023-09-19
- Length Days
90
- Quantity
90 days_supply
- Label
Fill 7 (overlaps study open)
- Start
2023-12-01
- Length Days
90
- Quantity
90 days_supply
- Spans
- Kind
unexposed
- Start
2022-07-01
- End
2023-12-31
- Label
~18 months of prior use — UNOBSERVED (early risk period invisible; susceptible patients already gone)
- Kind
exposed
- Start
2024-01-01
- End
2024-04-13
- Label
Observed follow-up starts here — but this patient is already a survivor
- Result
- Label
Prevalent users are survivors: their early high-risk months are unobserved, so mixing them with new users makes the drug appear safer than it is at initiation.
- Value
biased_toward_null
- Caption
Patient A's first fill is her index date (2024-01-15) — the study watches her full 90-day early-risk window. Patient B's first fill was 2022-07-01; by study open (2024-01-01) he has 18 months of unobserved prior use. Any patient like him who reacted badly to lisinopril in 2022–2023 already stopped and is invisible — only the survivors remain. Pooling both patients underestimates early AKI risk.
- Alt Text
Two-patient timeline diagram. Top row shows Patient A (new user) with three 30-day fills starting 2024-01-15 and a fully observed 90-day exposure span shaded green. Bottom row shows Patient B (prevalent user) with seven 90-day fills dating back to 2022-07-01; the 18 months before the study window are shaded red and labeled 'UNOBSERVED — early risk invisible,' while only the narrow post-2024-01-01 tail is shaded as observed. A callout notes that susceptible patients who reacted in 2022–2023 are absent from the study entirely.
Runnable example
python implementation
Detect prevalent-user contamination and build a clean incident-user cohort from claims-style inputs. Required inputs (already cleaned and de-duplicated): rx : pharmacy fills -> person_id, fill_date (datetime64), ndc, days_supply enroll : enrollment spans ->...
import pandas as pd
import numpy as np
WASHOUT_DAYS = 365 # fill-free + continuously enrolled lookback that defines an incident user
FOLLOWUP_DAYS = 90 # early-hazard window in which depletion of susceptibles is most visible
def study_fills(rx: pd.DataFrame, study_ndcs: set[str]) -> pd.DataFrame:
f = rx[rx["ndc"].isin(study_ndcs)].sort_values(["person_id", "fill_date"])
return f
def covered_full_washout(enroll: pd.DataFrame, idx: pd.DataFrame) -> set:
"""person_ids with continuous, FFS-observable enrollment spanning [index-WASHOUT, index]."""
e = enroll.merge(idx[["person_id", "index_date"]], on="person_id")
e["covers"] = ((e["enroll_start"] <= e["index_date"] - pd.Timedelta(days=WASHOUT_DAYS)) &
(e["enroll_end"] >= e["index_date"]) &
(~e["ma_only"]))
return set(e.loc[e["covers"], "person_id"])
def build_incident_cohort_with_diagnostic(rx, enroll, outcomes, study_ndcs, study_start, study_end):
f = study_fills(rx, study_ndcs)
# First study-drug fill inside the study window = candidate time zero.
in_window = f[(f["fill_date"] >= study_start) & (f["fill_date"] <= study_end)]
idx = (in_window.groupby("person_id")["fill_date"].min()
.reset_index().rename(columns={"fill_date": "index_date"}))
# Prevalent flag: any study-drug fill in the WASHOUT_DAYS before the candidate index (the bias signature).
prior = f.merge(idx, on="person_id")
prevalent_ids = set(prior.loc[(prior["fill_date"] < prior["index_date"]) &
(prior["fill_date"] >= prior["index_date"] - pd.Timedelta(days=WASHOUT_DAYS)),
"person_id"])
idx["would_be_prevalent"] = idx["person_id"].isin(prevalent_ids)
# Observable washout (continuous medical+pharmacy FFS enrollment, no MA-only gaps).
observable = covered_full_washout(enroll, idx)
idx = idx[idx["person_id"].isin(observable)].copy()
# Early event within FOLLOWUP_DAYS of each person's time zero.
ev = outcomes.merge(idx[["person_id", "index_date"]], on="person_id")
ev["early"] = ((ev["event_date"] >= ev["index_date"]) &
(ev["event_date"] <= ev["index_date"] + pd.Timedelta(days=FOLLOWUP_DAYS)))
early_ids = set(ev.loc[ev["early"], "person_id"])
idx["early_event"] = idx["person_id"].isin(early_ids)
# Depletion-of-susceptibles diagnostic: incident initiators vs would-be prevalent "current users".
diag = (idx.groupby("would_be_prevalent")["early_event"]
.agg(n="size", events="sum"))
diag["rate"] = diag["events"] / diag["n"]
incident = idx.loc[~idx["would_be_prevalent"], ["person_id", "index_date"]].copy()
incident["baseline_start"] = incident["index_date"] - pd.Timedelta(days=WASHOUT_DAYS)
return incident, diagr implementation
Detect prevalent-user contamination and build a clean incident-user cohort with data.table. Inputs mirror the Python version: rx : person_id, fill_date (Date), ndc, days_supply enroll : person_id, enroll_start (Date), enroll_end (Date), ma_only (logical)...
library(data.table)
WASHOUT_DAYS <- 365L
FOLLOWUP_DAYS <- 90L
build_incident_cohort_with_diagnostic <- function(rx, enroll, outcomes, study_ndcs,
study_start, study_end) {
setDT(rx); setDT(enroll); setDT(outcomes)
f <- rx[ndc %chin% study_ndcs][order(person_id, fill_date)]
# First study-drug fill inside the study window = candidate time zero.
idx <- f[fill_date >= study_start & fill_date <= study_end,
.(index_date = min(fill_date)), by = person_id]
# Prevalent flag: any study-drug fill in the washout window before candidate index.
prior <- merge(f, idx, by = "person_id")
prevalent_ids <- unique(prior[fill_date < index_date &
fill_date >= index_date - WASHOUT_DAYS, person_id])
idx[, would_be_prevalent := person_id %chin% prevalent_ids]
# Observable washout: continuous medical+pharmacy FFS enrollment, no MA-only gaps.
e <- merge(enroll, idx[, .(person_id, index_date)], by = "person_id")
observable <- e[enroll_start <= index_date - WASHOUT_DAYS &
enroll_end >= index_date & !ma_only, unique(person_id)]
idx <- idx[person_id %chin% observable]
# Early event within FOLLOWUP_DAYS of each person's time zero.
ev <- merge(outcomes, idx[, .(person_id, index_date)], by = "person_id")
early_ids <- unique(ev[event_date >= index_date &
event_date <= index_date + FOLLOWUP_DAYS, person_id])
idx[, early_event := person_id %chin% early_ids]
# Depletion-of-susceptibles diagnostic.
diag <- idx[, .(n = .N, events = sum(early_event)), by = would_be_prevalent]
diag[, rate := events / n]
incident <- idx[would_be_prevalent == FALSE, .(person_id, index_date)]
incident[, baseline_start := index_date - WASHOUT_DAYS]
list(incident = incident, diagnostic = diag)
}