← Methods repository
concept

Negative Control Exposures

An exposure that shares the confounding, channeling, and healthcare-contact structure of the primary exposure but has no plausible causal pathway to the outcome, used as a falsification test for residual confounding and surveillance bias in observational effect estimates.

Bias_Controlnegative-controlnegative-control-exposurefalsificationresidual-confoundingconfounding-by-indicationsurveillance-biaschannelingqba
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

A negative control exposure is a second drug or treatment you add to your study that you are confident cannot actually cause the outcome you are studying, but that gets prescribed to the same kinds of patients through the same channels as your main drug of interest. You run the exact same statistical analysis on this control drug as on your real drug, and if the control drug shows an association with the outcome, that is a warning sign: your analysis has a bias problem, not a real treatment effect. Think of it as a built-in lie detector for your study design.

A negative control exposure (NCE) is a second "treatment" variable that, by substantive knowledge, cannot cause the outcome of interest, yet is subject to the same unmeasured confounding, channeling, prescribing-channel, and surveillance forces as the primary exposure. The logic is a falsification test: if the analytic pipeline that produced the primary estimate also produces a non-null association between the NCE and the outcome — after the identical design and adjustment — then the assumption that the primary estimate is unconfounded is contradicted. An NCE that is "clean" (null after adjustment) is reassuring but never proves the primary estimate is unbiased; an NCE that is "dirty" (associated with the outcome) is a positive finding of residual bias. NCEs sit alongside negative control outcomes (a second outcome the exposure cannot cause) as the two halves of the negative-control toolkit; the exposure variant directly interrogates the treatment-assignment and capture process, whereas the outcome variant interrogates the outcome-ascertainment and shared-cause process.

Core conceptual distinction

. The defining requirement is a U-comparability assumption: the NCE must share the unmeasured confounder(s) U with the primary exposure (U drives both who receives the drug and who receives the NCE) while satisfying a sharp causal null (the NCE has no effect on the outcome through any path except U). Formally, in a DAG where U is the unmeasured confounder, the testable implication is NCE ⊥ outcome given measured covariates only if U is fully controlled; observing NCE not-independent of outcome falsifies "no unmeasured confounding." This is fundamentally harder to satisfy than for negative control outcomes: outcome mechanisms are often easy to rule out (the drug cannot cause a fracture in the first week), but exposure mechanisms — why a patient receives drug A — are precisely the thing we cannot fully observe, so finding a second exposure that travels the same confounding channel without its own outcome effect requires deep clinical knowledge of prescribing. The estimand of the falsification step is the NCE–outcome association on the same scale and from the same model as the primary contrast (hazard ratio for a Cox safety analysis, odds ratio for a logistic analysis); the entire value of the test depends on holding design, covariate set, follow-up, and censoring fixed so that only the exposure variable swaps. When multiple NCEs are available, their estimates feed empirical calibration of the primary estimate's confidence interval (see empirical-calibration-negative-controls-rwe).

Pros, cons, and trade-offs

. - vs negative-control-outcomes-rwe: NCEs interrogate the exposure-assignment and capture process directly — the source of confounding by indication and channeling — and can be paired with proximal-causal-inference methods to adjust (not merely detect) bias. Cost: a valid NCE is far harder to find than a valid negative control outcome, because the U-comparability and exposure-null conditions are both demanding and the analyst rarely observes the prescribing reason. Prefer the NCE when the worry is confounding by indication / channeling in the treatment decision; prefer the negative control outcome when the worry is differential surveillance or shared-cause bias in outcome ascertainment. The strongest designs use both. - vs a single sensitivity analysis (E-value, probabilistic bias analysis): An NCE is a data-driven probe that uses the real confounding structure of the cohort, whereas an E-value asks only how strong an unmeasured confounder would have to be. Cost: the NCE answer is only as good as the validity of the chosen control; a poorly chosen NCE gives false reassurance (a clean NCE that does not actually share U), which is more dangerous than no test at all. Use NCEs to complement, not replace, quantitative bias analysis (unmeasured-confounding-probabilistic-bias-analysis-rwe). - vs empirical calibration with many controls: A single NCE is a yes/no falsification; a panel of NCEs (and negative control outcomes) supports systematic-error calibration of p-values and intervals. Cost: assembling a credible panel of exposures that all share U is rarely feasible — exposure controls are scarce, so calibration usually leans on outcome controls and uses one or two NCEs as confirmatory.

When to use

. (1) Whenever the primary worry is confounding by indication, channeling, healthy-user/healthy-adherer bias, or differential healthcare contact in a comparative drug or device study — i.e., bias rooted in who gets treated. (2) When a clinically credible second exposure exists that is prescribed through the same channel, to similar patients, at a similar decision point, but has no pharmacologic or behavioral route to the outcome (e.g., an unrelated chronic-disease maintenance drug as a control for a different therapy on an acute outcome). (3) Embedded inside an active-comparator, new-user design so the NCE inherits the same washout, time-zero, and follow-up structure as the primary exposure. (4) As a pre-specified falsification analysis in a protocol/SAP submitted to regulators, where a clean NCE strengthens the causal narrative and a dirty NCE triggers design revision.

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

. - No credible U-comparable exposure exists. If the only available "control" exposures are prescribed to systematically different patients, the NCE does not share U; a null result then manufactures false reassurance — the most dangerous failure mode, because reviewers read it as evidence of validity. An invalid NCE is worse than none. - The NCE has its own path to the outcome. Shared contraindications, disease severity, or a real (even weak) pharmacologic/behavioral effect on the outcome violate the causal null; the resulting "dirty" signal cannot distinguish residual confounding from a genuine NCE–outcome effect, so the test is uninterpretable. - The NCE and primary exposure share a common downstream consequence other than U (collider or mediator), which can induce an association under conditioning and produce a spurious dirty result, falsely condemning a valid primary estimate. - As a substitute for design. An NCE detects but does not repair the underlying bias; reaching for it instead of an active comparator, new-user restriction, or richer confounder adjustment is treating the symptom. The best NCEs are chosen by clinical and data-source reasoning about the prescribing channel, never by scanning the literature for drugs with null outcome associations.

Data-source operational depth

. - Claims (FFS vs MA): The NCE is operationalized exactly like the primary exposure — an NDC/J-code with `fill_date` and `days_supply`, the same continuous-enrollment and washout requirement, and the same index/time-zero logic. Failure mode: Medicare Advantage enrollees lack complete fee-for-service claims, so a patient can look like a non-user of the NCE when the fill simply was not captured; an NCE built on MA-only person-time will be differentially missing relative to the primary exposure and break U-comparability. Restrict to enrollees with full medical+pharmacy benefit and exclude MA-only spans. Surveillance intensity matters: if the NCE drug triggers more lab monitoring or visits than the primary drug, detection of the outcome differs between the "exposures," confounding the falsification — choose an NCE matched on monitoring intensity. - EHR: Orders are not dispensings; an NCE defined on the medication order list inherits the primary exposure's order-vs-fill gap, but only if the same definition is used for both. Visit-driven capture means a patient who exits the health system is differentially lost; if the NCE is prescribed in a different care setting (e.g., specialty vs primary care) the loss-to-follow-up pattern differs and the test is biased. Confirm both exposures are captured in the same encounter stream. - Registry: Registries excel at indication and severity but are usually thin on the full pharmacy record needed to define a second exposure cleanly; an NCE typically requires linkage to claims for complete fills. Spontaneous/voluntary registry enrollment can itself select on healthcare engagement, contaminating the shared-confounder assumption. - Linked claims–EHR–vital records: The ideal substrate — EHR gives clinical reasons for prescribing (sharpening the judgment of whether the NCE truly shares U) while claims give complete fills — but linkage selects the linkable subset and introduces order/fill/service date discrepancies that must be reconciled identically for primary and control exposures before time-zero assignment. Differential competing risks also bite: in elderly claims cohorts, if the NCE-treated subgroup has higher background mortality, competing death censors the outcome differently across "exposures" and can create or mask a falsification signal — model the outcome on a cause-specific or subdistribution scale consistently for both.

Worked claims example

Primary question: incident hospitalized heart failure (HF) among adults with type 2 diabetes initiating a second-generation sulfonylurea vs a DPP-4 inhibitor, in a commercial + Medicare FFS database, under an active-comparator, new-user design (age ≥18; ≥2 diabetes diagnoses; 365 days continuous medical+pharmacy enrollment before the first study fill; washout = no sulfonylurea or DPP-4i fill in the 365-day lookback; time zero = first qualifying fill; follow-up to first validated HF hospitalization, censoring at disenrollment, death, end of data). Concern: channeling — sicker or more vascularly compromised patients may be steered toward sulfonylureas, biasing the HF estimate. Negative control exposure: initiation of a topical glaucoma agent (ophthalmic prostaglandin analog) or a statin among the same diabetic initiators — drugs prescribed through the same chronic-disease maintenance channel to comparably engaged patients but with no plausible acute pharmacologic route to HF hospitalization over the study window (statin chosen only if the analyst is confident it does not protect against the HF outcome on this timescale; otherwise the ophthalmic agent is safer). Operationally: build the NCE cohort with the identical 365-day continuous enrollment, 365-day NCE-washout, index = first NCE fill (`fill_date`, `days_supply`), and the same high-dimensional propensity-score covariate set measured in `[index_date − 365, index_date]`, then fit the same Cox model (HF hospitalization, same censoring rules) with the NCE as the exposure. Interpretation: an adjusted NCE hazard ratio near 1.0 with a tight interval is consistent with no residual channeling on this confounding channel; an NCE HR materially away from 1.0 (e.g., 1.3, 95% CI 1.1–1.6) signals residual confounding or differential surveillance and obligates redesign (richer adjustment, alternative comparator, or empirical calibration of the primary CI using this and additional controls) before any HF conclusion is reported.

Interpreting the output

From the worked example: primary sulfonylurea vs DPP-4i HR = 1.28 (95% CI 1.10–1.48) for heart failure. NCE (ophthalmic agent, identical cohort design) HR = 1.31 (95% CI 1.09–1.57).

(1) Formal interpretation. The ophthalmic NCE has no plausible causal path to heart failure — any observed association must arise from confounding, surveillance differences, or other systematic error. An NCE HR = 1.31 that closely matches the primary HR = 1.28 suggests that a substantial portion of the primary estimate reflects residual confounding rather than a pharmacological effect of sulfonylureas on HF. The NCE does not quantify how much of the primary HR is bias — its magnitude on the HF outcome may differ from the bias operating on the primary even when both point in the same direction. The result indicates bias presence and approximate direction, not its exact magnitude on the primary endpoint.

(2) Practical interpretation. An NCE HR of 1.31 almost identical to the primary HR of 1.28 is a strong signal that much or all of the observed sulfonylurea–HF association may be confounded by channeling — sicker, higher-risk patients preferentially receiving sulfonylureas. A decision-maker reviewing this study should not conclude that sulfonylureas increase HF risk by 28% until the primary analysis has been redesigned (stricter active-comparator restriction, additional proxies) or subjected to empirical calibration using this and other NCEs to re-anchor the inference.

Worked example

Scenario

A researcher is studying whether starting a sulfonylurea (a diabetes pill) increases the risk of hospitalization for heart failure compared with starting a DPP-4 inhibitor (a different diabetes pill). She worries that sicker patients are being steered toward sulfonylureas, which would inflate the hazard ratio (HR) even after statistical adjustment. To test this, she adds a falsification check: she runs the same analysis replacing the real drug comparison with an ophthalmic (eye) drop that lowers intraocular pressure in glaucoma. Eye drops have no pharmacologic pathway to heart failure hospitalization. If the analysis is clean, the eye-drop HR should hover around 1.0 -- no association. If it does not, bias is present in the pipeline.

Dataset

Summary results table from the falsification analysis. Each row is one exposure run through the identical Cox model on the same cohort with the same covariate adjustment. An HR of 1.0 means no association; CIs crossing 1.0 are consistent with no effect.

ExposureAdjusted HR95% CI Lower95% CI UpperInterpretation
Sulfonylurea vs DPP-4i (primary)1.281.101.48Study result: apparent 28% higher HF risk
Ophthalmic eye drop vs no eye drop (NCE)1.311.091.57Negative control: should be ~1.0, but is not

Steps

  • Build the negative control exposure cohort exactly like the primary cohort: same enrollment rules, same washout period, same index date logic, same follow-up window, same outcome definition (heart failure hospitalization).

  • Fit the identical Cox regression model, swapping only the exposure variable from the real drug comparison to the ophthalmic eye drop comparison; every covariate in the adjustment set stays the same.

  • Read the NCE hazard ratio: the eye-drop HR is 1.31 (95% CI 1.09-1.57), meaning patients who initiated the eye drop appear 31% more likely to be hospitalized for heart failure than those who did not.

  • Because eye drops cannot biologically cause heart failure, this non-null result cannot reflect a true effect -- it must reflect residual confounding or differential healthcare contact that the adjustment did not remove.

  • Compare the NCE HR to the primary HR: both are in the same direction and similar in magnitude (1.31 vs 1.28), which means much or all of the apparent sulfonylurea signal could be explained by the same unmeasured bias detected in the control.

Result

The negative control exposure HR is 1.31 (95% CI 1.09-1.57), well above the null value of 1.0 and statistically significant. This dirty NCE reveals that the analytic pipeline carries residual confounding of approximately 30%, which matches the size of the primary estimate (HR 1.28). The conclusion is that the sulfonylurea result cannot be taken at face value without redesign -- for example, richer covariate adjustment, a more restrictive active comparator, or empirical calibration of the confidence interval using this and additional control exposures.

Runnable example

python implementation

Falsification test: fit the SAME outcome model used for the primary contrast, swapping in each negative control exposure, on the SAME analytic cohort. Required input (one row per person, already cohort-built via the ACNU logic and covariate-resolved; do not...

import numpy as np
import pandas as pd
from lifelines import CoxPHFitter

ADJUST = ["ps_logit", "age", "cci", "prior_util"]  # identical covariate set for every exposure

def falsify(df: pd.DataFrame, exposures: list[str]) -> pd.DataFrame:
    rows = []
    for exp in exposures:
        cph = CoxPHFitter()
        cph.fit(df[["time", "event", exp] + ADJUST], duration_col="time",
                event_col="event", formula=" + ".join([exp] + ADJUST))
        s = cph.summary.loc[exp]
        rows.append({"exposure": exp, "hr": np.exp(s["coef"]),
                     "ci_low": np.exp(s["coef lower 95%"]),
                     "ci_high": np.exp(s["coef upper 95%"]), "p": s["p"]})
    out = pd.DataFrame(rows)
    # Flag any NEGATIVE CONTROL whose CI excludes the null -> falsification of "no residual confounding".
    out["nce_dirty"] = (out["exposure"].str.startswith("nce_") &
                        ((out["ci_low"] > 1) | (out["ci_high"] < 1)))
    return out

result = falsify(df, ["primary_drug", "nce_ophthalmic", "nce_statin"])
print(result)
r implementation

Falsification test in R: the SAME Cox model, looped over the primary exposure and each negative control exposure, on the SAME cohort. Input mirrors the Python version: df : person_id, time, event (1/0), primary_drug (1/0), nce_ophthalmic (1/0), nce_statin...

library(survival)
adjust <- c("ps_logit", "age", "cci", "prior_util")  # identical covariate set for every exposure

falsify <- function(df, exposures) {
  do.call(rbind, lapply(exposures, function(exp) {
    f <- as.formula(paste("Surv(time, event) ~", exp, "+", paste(adjust, collapse = " + ")))
    fit <- coxph(f, data = df)
    ci  <- summary(fit)$conf.int[exp, ]          # exp(coef), 1/exp(coef), lower .95, upper .95
    p   <- summary(fit)$coefficients[exp, "Pr(>|z|)"]
    data.frame(exposure = exp, hr = ci["exp(coef)"],
               ci_low = ci["lower .95"], ci_high = ci["upper .95"], p = p,
               # a negative control whose CI excludes 1 falsifies "no residual confounding"
               nce_dirty = grepl("^nce_", exp) & (ci["lower .95"] > 1 | ci["upper .95"] < 1),
               row.names = NULL)
  }))
}

result <- falsify(df, c("primary_drug", "nce_ophthalmic", "nce_statin"))
print(result)