Primary Non-Adherence and Treatment Initiation
The operational distinction between a medication being prescribed/ordered and actually being dispensed, picked up, or administered, where failure of that first fill or first administration (primary non-adherence) silently removes patients from any "first-fill" exposure cohort and selects a more adherent population.
On this page
Primary non-adherence describes what happens when a doctor writes a prescription for a drug but the patient never goes to the pharmacy to fill it — the medication is ordered but the bottle is never picked up. To measure this you need two data layers linked together: the electronic order that the doctor sent, plus the pharmacy dispensing record that shows whether a fill actually happened. A claims database alone cannot reveal this gap, because it only records fills that occurred, not prescriptions that were ignored. This is different from secondary non-adherence, where the patient fills the prescription at least once but later stops taking the drug consistently.
Primary non-adherence
is the gap between the moment a clinician prescribes or orders a drug and the moment the patient actually starts it — fills the prescription at a pharmacy, picks up the dispensed product, or (for administered products) receives the first dose A patient who is prescribed a statin but never fills it is a primary non-adherer; this is categorically different from a patient who fills once and then stops (persistence) or fills sporadically (secondary non-adherence, measured by PDC/MPR)
The reported magnitude is large and consistent: ~28% of new e-prescriptions were never dispensed within the index period in a 195,930-prescription analysis (Fischer 2010), and ~31% of newly prescribed medications in primary care were never filled (Tamblyn 2014). "Initiation" is the mirror image: the point at which exposure truly begins and time zero can legitimately be set.
Core conceptual distinction
The decisive fact — and the reason this is a discrete catalog entry rather than a footnote to exposure-episode construction — is that administrative claims data structurally cannot measure primary non-adherence. Claims record dispensings, not orders The denominator you need (everyone who was prescribed) is invisible in a claims database; you only ever observe the numerator's survivors (those who filled at least once)
Measuring primary non-adherence therefore requires a source that captures the order: an e-prescribing network (Surescripts), EHR computerized provider order entry (CPOE), or an integrated delivery system's prescribing record, linked to fill/administration data Without that order layer you can measure secondary non-adherence among fillers and nothing about the people who never filled
Two further sub-distinctions matter: (1) dispensed vs picked up — a pharmacy can adjudicate and reverse a claim when the patient never collects the drug (prescription abandonment), so a raw paid pharmacy claim is not proof of pickup unless reversals are netted out; (2) dispensed vs administered — for buy-and-bill infusibles, injectables, and in-office products, a pharmacy fill is not initiation; the J-code/procedure on a service date or the EHR medication administration record (MAR) is A vialed biologic that is dispensed but never infused is initiation failure, not initiation.
Pros, cons, and trade-offs
- vs PDC / MPR (secondary-adherence measures): PDC and MPR are computed conditional on having filled at least once — they are blind to primary non-adherers by construction and so systematically overstate population-level drug exposure. Capturing primary non-adherence + initiation gives the complete picture from order to discontinuation. Cost: it requires an order source PDC/MPR do not (PDC runs on claims alone). Prefer this concept when the policy or effectiveness question concerns uptake, abandonment, or the validity of "first-fill" time zero; prefer PDC/MPR for ongoing-coverage adherence among established users.
- vs simply defining index = "first fill" and moving on (the silent default in most new-user/ACNU studies): explicitly modeling primary non-adherence reveals that the first-fill cohort is a selected, more-adherent subset — the ~25-30% who never filled are dropped before time zero, a healthy-adherer-flavored selection that can bias even a methodologically clean comparative-effectiveness contrast. Cost: more data, an order-to-fill window to defend, and extra diagnostics. Prefer explicit modeling whenever the exposure decision (not just on-treatment behavior) could differ across the comparison groups.
- vs an intention-to-treat "as-prescribed" estimand from e-Rx alone: counting the order as exposure regardless of fill answers a prescriber-behavior question but misclassifies never-fillers as treated, biasing effect estimates toward the null for any drug that works only if taken. Prefer the as-prescribed estimand only when the question is explicitly about the prescribing decision (e.g., a prescriber-level intervention), and say so in the estimand.
When NOT to use — and when it is actively misleading or dangerous
- You have claims only. Do not report a "primary non-adherence rate" from a claims database — there is no order denominator, so any such number is uninterpretable and will mislead reviewers. With claims you can only study secondary non-adherence among fillers. State this as a hard limitation, not something a workaround fixes.
- The order source is incomplete. Surescripts misses paper/written and verbal prescriptions; an EHR captures only in-network orders. If a non-trivial share of prescribing bypasses the captured channel, "never filled" conflates true abandonment with prescriptions that were routed elsewhere — differential by clinic, payer, or drug.
- For administered products, when only the pharmacy fill is checked. Declaring initiation on a buy-and-bill fill that was never infused overcounts initiation and miscounts the true initiation-failure population.
- When the order-to-fill window is left implicit. A 7-day window labels mail-order and prior-authorization delays as non-adherence; a 365-day window absorbs genuine abandonment into "delayed fill." The window is an analytic choice that must be pre-specified and varied in sensitivity analysis.
Data-source operational depth
- Claims only (FFS, commercial, MA): Cannot measure primary non-adherence at all — no order denominator. Worse, in Medicare Advantage and capitated arrangements, fee-for-service pharmacy claims may be absent, so even fill capture among the supposedly-treated is incomplete; "no fill" can be MA-only missing person-time rather than true non-fulfillment. Workaround: restrict to enrollees with complete Part D (or commercial pharmacy benefit) and use claims for secondary adherence only.
- EHR with CPOE / e-prescribing: the order is visible (good), but the fill is not unless pharmacy data are linked. Use the Surescripts fill-status response, payer pharmacy claims, or integrated-pharmacy dispensings to close the loop. Failure mode: external-care leakage — a patient who fills at a pharmacy outside the linked network looks like a non-adherer.
- Surescripts / e-Rx network: the standard denominator source. Failure modes: transmission failures, cancel/replace messages that double-count, and invisibility of paper/verbal prescriptions and free-text orders; reconcile the new-prescription event before treating it as the denominator.
- Linked claims–EHR (and integrated systems such as Kaiser, VA, Geisinger): the gold standard — order from EHR/e-Rx, fill from claims/pharmacy, administration from MAR/J-codes. The central reconciliation task is date alignment: a fill may post 7, 30, or 90 days after the order; pre-specify the index window and test 7/30/90-day cuts. For infusibles, require a J-code/administration on a service date, not the buy-and-bill fill, to confirm initiation.
Worked example (e-Rx linked to claims)
Question: primary non-adherence to newly e-prescribed oral anticoagulants, and its effect on a downstream "new-user" cohort (1) Denominator: every new e-prescription (`erx_date`, `drug_class='DOAC'`, `new_start_flag=1` so refills/continuations are excluded) for an adult with continuous medical + pharmacy enrollment in the 90 days before and the index window after `erx_date` — enrollment is required so that "no fill" is observed, not missing (2) Numerator (primary non-adherer): no DOAC pharmacy dispense (`fill_date` within `[erx_date, erx_date + W]`), netting out reversed/abandoned claims
(3) Primary non-adherence rate = numerator / denominator; with W = 30 days suppose 1,000 of 4,000 new e-Rx never filled → 25.0% (4) Window sensitivity: W = 7 days → 1,420/4,000 = 35.5% (counts slow legitimate fills as non-adherence); W = 90 days → 860/4,000 = 21.5% (absorbs true abandonment) Report all three
(5) Selection-bias link: the 3,000 fillers are the exact population a conventional new-user/ACNU study would index on "first fill" — so that downstream cohort has silently excluded the 25% never-fillers and is selected toward adherence; flag this when interpreting the comparative estimate (6) For an injectable arm, replace step (2) with a J-code administration on a service date so a dispensed-but- never-infused vial is correctly counted as initiation failure.
Decision diagram
flowchart TD
Order[New e-prescription / CPOE order<br/>drug_class, new_start_flag, erx_date] --> Window{Eligible dispense or administration<br/>within order-to-fill window?}
Window -->|No fill / no administration| PNA[Primary non-adherence<br/>= initiation failure]
Window -->|Fill / J-code on service date| Init[Initiation: time zero set here]
Init --> Cohort[Enters first-fill new-user / ACNU cohort]
PNA -.silently excluded.-> Cohort
Cohort --> Bias[Cohort selected toward adherers<br/>-> healthy-adherer-like selection bias]flowchart LR
subgraph Sources[Required data layers]
eRx[Order: Surescripts / EHR CPOE] --> Link
Fill[Fill: pharmacy claims / dispensings] --> Link
Adm[Administration: J-code / MAR] --> Link
end
Link[Linked, date-reconciled record] --> Num[Numerator: orders with no fill/admin in window]
Link --> Den[Denominator: all new orders for the class]
Num --> Rate[Primary non-adherence rate<br/>vary window 7/30/90 days]
Den --> Rate
ClaimsOnly[Claims only: no order layer] -.cannot compute.-> RateWorked example
Scenario
A cardiologist sends three e-prescriptions for a blood thinner (a DOAC) on 2023-03-01. We want to see which patients started the drug (filled it within 30 days) and which were primary non-adherers (never filled). The pharmacy claims table covers the same time window. Patient 2001 fills promptly, patient 2002 fills late (outside the 30-day window), and patient 2003 never fills at all.
Dataset
- Caption
Left table: electronic prescriptions sent by the doctor. Right table: pharmacy fills found in claims (reversed = claim later voided, meaning the patient left without the drug).
- Erx Table
person_id erx_date drug_class new_start_flag 2001 2023-03-01 DOAC 1 2002 2023-03-01 DOAC 1 2003 2023-03-01 DOAC 1 - Rx Table
person_id fill_date drug_class days_supply reversed 2001 2023-03-10 DOAC 30 False 2002 2023-04-15 DOAC 30 False 2003 2023-03-05 DOAC 30 True
Steps
Result
- Label
Primary non-adherence rate (30-day window): 2 of 3 patients never filled = 67% (illustrative example; real-world rates ~25-35%)
- Value
0.667
Trade-offs
Runnable example
Primary non-adherence (oral/self-administered) by anti-joining e-prescriptions to dispensings. Required inputs (already cleaned, de-duplicated, restricted to enrolled person-time): erx : new e-prescription orders -> person_id, erx_date (datetime), drug_class, new_start_flag (1=new start) rx : pharmacy dispensings ->...
import pandas as pd
def primary_non_adherence(erx: pd.DataFrame, rx: pd.DataFrame,
drug_class: str, window_days: int = 30) -> tuple[pd.DataFrame, float]:
# Denominator: one row per new e-prescription for the target class.
orders = erx[(erx["drug_class"] == drug_class) & (erx["new_start_flag"] == 1)].copy()
# Eligible fills: same class, NOT reversed/abandoned, within [erx_date, erx_date + window].
fills = rx[(rx["drug_class"] == drug_class) & (~rx["reversed"])][["person_id", "fill_date"]]
m = orders.merge(fills, on="person_id", how="left")
in_window = (m["fill_date"] >= m["erx_date"]) & \
(m["fill_date"] <= m["erx_date"] + pd.Timedelta(days=window_days))
# An order is "filled" if at least one eligible fill falls in its window.
m["filled"] = in_window
filled_per_order = m.groupby(orders.index).agg(filled=("filled", "any"))
orders = orders.join(filled_per_order)
orders["primary_non_adherent"] = ~orders["filled"].fillna(False)
rate = orders["primary_non_adherent"].mean()
return orders[["person_id", "erx_date", "primary_non_adherent"]], float(rate)Primary non-adherence via e-Rx-to-dispense anti-join, data.table. Inputs mirror the Python version: erx : person_id, erx_date (Date), drug_class, new_start_flag (1L = new start) rx : person_id, fill_date (Date), drug_class, days_supply, reversed (logical) Valid only when 'erx' is a real order source (Surescripts/EHR...
library(data.table)
primary_non_adherence <- function(erx, rx, drug_class, window_days = 30L) {
setDT(erx); setDT(rx)
orders <- erx[drug_class == ..drug_class & new_start_flag == 1L]
orders[, order_id := .I]
fills <- rx[drug_class == ..drug_class & reversed == FALSE, .(person_id, fill_date)]
# Non-equi join: a fill is eligible if erx_date <= fill_date <= erx_date + window.
orders[, win_end := erx_date + window_days]
hit <- fills[orders, on = .(person_id, fill_date >= erx_date, fill_date <= win_end),
.(order_id = i.order_id), nomatch = NULL, allow.cartesian = TRUE]
orders[, filled := order_id %in% unique(hit$order_id)]
orders[, primary_non_adherent := !filled]
list(per_order = orders[, .(person_id, erx_date, primary_non_adherent)],
rate = orders[, mean(primary_non_adherent)])
}Primary non-adherence via e-Rx-to-dispense NOT EXISTS anti-join in SAS. Required input datasets (post data-management, restricted to enrolled person-time): work.erx : person_id, erx_date, drug_class, new_start_flag (1 = new start) work.rx : person_id, fill_date, drug_class, days_supply, reversed (0/1) Set &dclass...
%let dclass = DOAC;
%let window = 30;
/* Denominator: new e-prescriptions for the target class; flag each order filled / not filled. */
proc sql;
create table pna as
select o.person_id,
o.erx_date,
case when exists (
select 1 from work.rx f
where f.person_id = o.person_id
and f.drug_class = o.drug_class
and f.reversed = 0
and f.fill_date >= o.erx_date
and f.fill_date <= o.erx_date + &window
) then 0 else 1 end as primary_non_adherent
from work.erx o
where o.drug_class = "&dclass" and o.new_start_flag = 1;
quit;
/* Aggregate primary non-adherence rate for the chosen order-to-fill window. */
proc sql;
select mean(primary_non_adherent) as primary_non_adherence_rate format=percent8.1,
count(*) as n_new_eRx
from pna;
quit;Citations
- [1]Fischer MA, Stedman MR, Lii J, et al. Primary medication non-adherence: analysis of 195,930 electronic prescriptions. Journal of General Internal Medicine. 2010;25(4):284-290.
- [2]Raebel MA, Schmittdiel J, Karter AJ, Konieczny JL, Steiner JF. Standardizing terminology and definitions of medication adherence and persistence in research employing electronic databases. Medical Care. 2013;51(8 Suppl 3):S11-S21.
- [3]Andrade SE, Kahler KH, Frech F, Chan KA. Methods for evaluation of medication adherence and persistence using automated databases. Pharmacoepidemiology and Drug Safety. 2006;15(8):565-574.
- [4]Tamblyn R, Eguale T, Huang A, Winslade N, Doran P. The incidence and determinants of primary nonadherence with prescribed medication in primary care. Annals of Internal Medicine. 2014;160(7):441-450.
- [5]Steiner JF, Prochazka AV. The assessment of refill compliance using pharmacy records: methods, validity, and applications. Journal of Clinical Epidemiology. 1997;50(1):105-116.