← Methods repository
CONCEPTINTERMEDIATEPYTHON · R · SAS5 citations

Multi-Database / Distributed Network Study

A study design that runs one common protocol against two or more independently held data sources, executing identical analytic code at each site and combining only privacy-preserving site-level summaries (e.g., risk-set tables, propensity-score-adjusted estimates) rather than pooling patient-level records.

Study Designdistributed-networksentinelcnodesohdsicommon-data-modelprivacy-preservingmulti-databasepharmacoepidemiology
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

A multi-database study runs the exact same research question across several independent health databases at the same time, combines the findings from each one, and checks whether they agree. No patient records are ever shared between databases — each site keeps its own data, runs the same computer code locally, and sends back only a privacy-safe summary number. Running the same study across multiple sources boosts statistical power for rare events, shows whether a finding holds across different patient populations, and lets researchers spot when one database tells a very different story from the others.

When to use it
When one database lacks power or external validity, or when reproducibility across sources is itself the evidentiary claim (e.g., regulatory safety surveillance).
Whenever data-use agreements forbid pooling, which is the default in real networks.
When you control the analysis across the contributing data sources.
Watch out for
Large operational overhead (governance, CDM mapping, code distribution, site QC) and slower timelines.
Limited to estimators expressible from site-level aggregates; some flexible individual-level models are impossible without IPD.
Requires a live governed network and active data access rather than a desk review.

A multi-database (distributed network) study answers a single research question by executing one harmonized protocol across several independently governed data sources — commercial and Medicare claims plans, integrated-delivery EHRs, registries — and then combining the results, not the records. Each data partner maps its data to a shared structure (a common data model such as OMOP CDM or the Sentinel SCDM, or a shared analytic-table specification), runs byte-identical or specification-identical code locally, and returns only aggregate output. The patient-level protected health information never leaves the partner's firewall. This is the operating model of the FDA Sentinel System, the Canadian Network for Observational Drug Effect Studies (CNODES), the OHDSI network, and most multinational PASS.

Core conceptual distinction

The defining choice is distributed analysis vs centralized pooling, and it is separable from the choice of estimator.

  1. Distributed vs pooled individual-level data (IPD): in a distributed network each site holds its own data and shares only aggregates; in a pooled study all records are physically combined in one analytic file. Distributed analysis is what makes data partners willing to participate (governance, HIPAA, GDPR), but it constrains what you can compute — you must design every quantity so it can be assembled from site-level pieces.
  2. Common data model vs ad hoc harmonization: a CDM (OMOP, SCDM/Sentinel) fixes table schemas and vocabularies so the same code runs everywhere; ad hoc harmonization writes bespoke extraction per site and is fragile.
  3. What gets shared sits on a spectrum: fully aggregate counts/effect estimates (most private), stratified risk-set or propensity-score-stratum tables that enable exact stratified or conditional analyses without IPD (Toh's distributed risk-set sharing), or, rarely, a curated pooled extract under a data-use agreement. The estimand is still a comparative effect (e.g., a hazard ratio or risk difference for drug A vs B), but it is a network-level summary of site-specific estimates whose interpretation depends on whether you fix-effect or random-effect combine them, and on how heterogeneous the sites are.

Pros, cons, and trade-offs

  • vs a single-database study: A network buys sample size for rare exposures and outcomes, broader generalizability across payers/regions/care settings, and the ability to measure heterogeneity (is the signal real or one site's artifact?). Cost: enormous operational overhead — common-protocol governance, CDM mapping, code distribution, site QC, and a slower timeline. Prefer a network when one database lacks power, when external validity matters for a regulatory or coverage decision, or when reproducibility across data sources is itself the evidentiary claim; prefer a single well-characterized database for an exploratory or hypothesis-generating analysis where speed and deep knowledge of one source outweigh breadth.
  • vs centralized pooled individual-level analysis: Distributed analysis preserves privacy and partner autonomy and sidesteps the legal/ethical barriers to moving PHI. Cost: you cannot run arbitrary individual-level models centrally; you are limited to what aggregates support (stratified Cox/conditional logistic via risk sets, site-specific PS models, meta-analytic combination). Some flexible estimators (certain machine-learning PS, individual-level g-methods) are awkward or impossible without IPD. Prefer distributed unless a data-use agreement genuinely permits pooling and the analysis demands individual-level modeling that aggregates cannot reproduce.
  • vs aggregate meta-analysis of separately published studies: A distributed network uses one protocol, one set of code lists, and one outcome definition everywhere, eliminating the between-study methodological heterogeneity and publication bias that plague literature-based meta-analysis. Cost: it requires a live, governed network rather than a desk review. Prefer the network when you control the analysis; fall back to meta-analysis of published estimates only when you cannot access the underlying data.

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

  • When one database already answers the question with adequate power and validity. The network's overhead buys nothing and slows the answer; the breadth is decorative.
  • When the exposure, outcome, or confounders are not measurable identically across sites. If inpatient drug administration is captured at one integrated-delivery site but invisible in another's claims, the "same" exposure definition means different things; combining them manufactures a spurious network estimate. Pooling or meta-analyzing non-comparable site definitions is the dangerous failure mode — heterogeneity then reflects measurement, not biology, and a fixed-effect summary will confidently report a number that means nothing.
  • When sites differ structurally in ways the analysis ignores. Different drug launch dates and formulary timing by plan create calendar-time confounding that varies by site; Medicare Advantage vs fee-for-service capture differs; case-mix differs. Blindly fixed-effect combining hides this. Always report between-site heterogeneity (I², τ², forest plot) and investigate large I² before trusting a pooled number.
  • When privacy constraints force aggregates so coarse that the estimator is biased. If a site can only return marginal counts (not PS-stratified risk sets), residual confounding cannot be controlled distributedly and the network estimate is no better than a crude one.

Data-source operational depth

  • Claims (commercial / Medicare FFS): The workhorse of Sentinel and CNODES. Exposure = pharmacy claim (`ndc` + `fill_date` + `days_supply`); enrollment spans define observable time. Require continuous medical + pharmacy enrollment across washout and follow-up so absence of a fill is real. Failure mode: Medicare Advantage person-time lacks FFS claims — MA enrollees' encounters are paid by the plan, not adjudicated as FFS claims, so diagnoses/procedures are missing or undercounted; exclude MA-only person-time (or use MA encounter data only where a partner certifies its completeness). Sample fills, 90-day mail order, and free samples distort `days_supply`.
  • EHR / integrated delivery (e.g., a Sentinel data partner with an internal pharmacy): Captures inpatient administrations, labs, and vitals that claims miss — an advantage that becomes a threat to comparability when pooled with claims-only partners. A drug given in hospital is observed at the EHR site and invisible at the claims site, so the operational exposure definition silently differs. Visit-driven capture also means patients who leave the system are differentially lost. Workaround: restrict to the lowest common denominator of captured care, or model site as a fixed effect and stratify so each site's estimate uses only its own internally consistent data.
  • Registry: Strong for indication, disease severity, and adjudicated outcomes (e.g., cancer stage, validated MI); weak for complete longitudinal drug exposure. Use registries in a network for the outcome/severity layer and link to claims for exposure and to a death index for censoring; never assume a registry's drug history is complete.
  • Linked claims–EHR–vital records: The richest partner type, but linkage selects the linkable subset and creates order/fill/service date discrepancies that must be reconciled before time-zero assignment. In a network, a few linked sites plus many claims-only sites create a capability gradient — design the common protocol to the weakest site, then run richer sensitivity analyses only where the data support them.
  • Cross-cutting failure modes: differential competing risks by exposure (in elderly claims populations a drug preferentially used in frailer patients faces higher competing mortality, biasing cause-specific estimates differently across sites with different age mixes); immortal time in procedure studies (defining exposure by a procedure that can only occur after surviving to it); and outcome-algorithm portability (a claims-based MI algorithm validated in one plan may have different PPV in another).

Worked claims example (distributed safety study)

Question: incidence of acute pancreatitis among new users of incretin-based therapy (GLP-1/DPP-4) vs sulfonylureas, run across four data partners (two commercial claims plans, one Medicare FFS extract, one integrated-delivery EHR), one common protocol. At each site, local code builds the analytic table identically:

  1. Cohort entry = first fill (`fill_date`) of either drug class with no fill of any study or comparator drug in the prior 365 days (washout), among adults with ≥2 type-2-diabetes diagnoses in the baseline window.
  2. Observable time = continuous medical + pharmacy enrollment spanning the full 365-day washout through follow-up; exclude MA-only person-time at the Medicare partner because FFS claims are absent there.
  3. Index date / time zero = the qualifying fill date; assign the arm from the `ndc` dispensed that day.
  4. Outcome = first inpatient acute-pancreatitis diagnosis (validated algorithm) after time zero; censor at disenrollment, death (death index), end of data, treatment discontinuation (`days_supply` end + 30-day grace), or switch.
  5. Each site estimates a site-specific propensity score from baseline covariates measured only in `[index_date-365, index_date]`, forms PS strata, and returns only a stratified risk-set / event-count table per PS stratum and arm (person-time and events) — no patient-level rows leave the site.
  6. The coordinating center combines the four site-specific stratified incidence-rate ratios with a random-effects meta-analysis, reports the pooled IRR with its 95% CI, and reports I² and a forest plot; a high I² triggers investigation of whether one partner's inpatient capture or formulary timing — not biology — drives the divergence before any pooled number is released.

Decision diagram

flowchart TD
  Q[Common protocol + shared code list<br/>one operational definition] --> CDM[Map each source to shared CDM<br/>OMOP / Sentinel SCDM]
  CDM --> S1[Site 1: commercial claims]
  CDM --> S2[Site 2: Medicare FFS]
  CDM --> S3[Site 3: integrated-delivery EHR]
  CDM --> S4[Site 4: registry-linked claims]
  S1 --> A1[Run identical code locally<br/>build cohort + site PS]
  S2 --> A2[Run identical code locally]
  S3 --> A3[Run identical code locally]
  S4 --> A4[Run identical code locally]
  A1 --> Agg[Return ONLY aggregates<br/>PS-stratum x arm events + person-time]
  A2 --> Agg
  A3 --> Agg
  A4 --> Agg
  Agg --> Meta[Coordinating center:<br/>random-effects meta-analysis]
  Meta --> Het{High I-squared?}
  Het -->|Yes| Inv[Investigate measurement /<br/>formulary / capture heterogeneity]
  Het -->|No| Out[Pooled estimate + forest plot]
Distributed-network workflow. PHI never leaves a data partner; only privacy-preserving site-level summaries are combined, and between-site heterogeneity is interrogated before any pooled estimate is released.
flowchart LR
  subgraph Site[Inside each data partner's firewall]
    PHI[Patient-level records<br/>person_id, fill_date, dx] --> Cohort[New-user cohort + local PS]
    Cohort --> StratTab[PS-stratum x arm table<br/>events, person-time, n]
    StratTab --> Supp[Cell suppression n<11]
  end
  Supp -->|aggregate only| Center[Coordinating center]
  Center --> Pool[Stratified MH + random-effects pool]
style PHI fill:#fde2e2
style Supp fill:#e2f0fd
What crosses the firewall. Individual records and the local propensity model stay at the site; only a suppressed, PS-stratified aggregate table is transmitted, enabling confounding-adjusted pooling without IPD.

Worked example

Scenario

A research team wants to know whether GLP-1 diabetes medications are associated with fewer hospitalizations for pancreatitis compared with sulfonylureas. No single insurance database has enough pancreatitis cases to answer this reliably, so the team runs the identical study at three separate data partners. Each partner maps its data to a shared common data model, runs the same code locally, and returns only a small table of event counts and patient-years. The coordinating center then pools those three site-level estimates.

Dataset

Privacy-preserving summary table returned by each data partner (no patient rows cross the firewall). events_study = pancreatitis hospitalizations in GLP-1 arm; PY_study = patient-years in GLP-1 arm; events_comp = hospitalizations in sulfonylurea arm; PY_comp = patient-years in sulfonylurea arm.

siteevents_studyPY_studyevents_compPY_comp
Site A (commercial claims)36006600
Site B (Medicare FFS)58008800
Site C (integrated-delivery EHR)6100081000

Steps

1For each site, compute the incidence rate ratio (IRR): divide the GLP-1 event rate (events_study / PY_study) by the sulfonylurea event rate (events_comp / PY_comp).
2Site A IRR = (3 / 600) / (6 / 600) = 0.005 / 0.010 = 0.500 — GLP-1 users had half the pancreatitis rate of sulfonylurea users at this site.
3Site B IRR = (5 / 800) / (8 / 800) = 0.00625 / 0.01000 = 0.625 — GLP-1 users had 62.5% of the sulfonylurea rate at this site.
4Site C IRR = (6 / 1000) / (8 / 1000) = 0.006 / 0.008 = 0.750 — GLP-1 users had 75% of the sulfonylurea rate at this site.
5Pool the three site-specific IRRs by taking a simple average: (0.500 + 0.625 + 0.750) / 3 = 1.875 / 3 = 0.625.
6Note the spread across sites: IRRs range from 0.500 to 0.750, which signals real heterogeneity. Before releasing the pooled number, the coordinating center investigates whether one site captures inpatient events differently or serves a different age mix.

Result

Pooled IRR = (0.500 + 0.625 + 0.750) / 3 = 1.875 / 3 = 0.625. Across all three data partners, GLP-1 users had approximately 37.5% fewer pancreatitis hospitalizations per patient-year than sulfonylurea users (IRR 0.625). The finding is consistent in direction across all three sites, which strengthens confidence in the signal. The range of site-specific estimates (0.500 to 0.750) is worth reporting so readers can judge how much the result varies by data source.

Trade-offs

vs. Single database study
Pros of this
Power for rare exposures/outcomes, broader generalizability, and the ability to measure and report cross-source heterogeneity rather than assume a single source is representative.
vs. Centralized pooled individual level (IPD) analysis
Pros of this
Preserves patient privacy and partner autonomy; avoids the legal/ethical barriers to moving PHI; feasible across jurisdictions.
vs. Meta analysis of separately published observational studies
Pros of this
One common protocol, code list, and outcome definition everywhere eliminates between-study methodological heterogeneity and publication bias.

Runnable example

Site-level distributed analysis for a multi-database study. STEP 1 (this code) runs identically at EACH data partner and returns ONLY a privacy-preserving aggregate (events + person-time by arm and PS stratum) — no patient-level rows leave the site.

requires: pandas · numpy
import pandas as pd
import numpy as np

WASHOUT_DAYS = 365   # drug-free + continuous-enrollment lookback defining a new user
GRACE_DAYS   = 30    # as-treated grace period after last days_supply
MIN_CELL     = 11    # suppress small cells before sharing (re-identification guard)

def site_summary(rx: pd.DataFrame, enroll: pd.DataFrame,
                 events: pd.DataFrame, cov: pd.DataFrame, data_partner_id: str) -> pd.DataFrame:
    rx = rx.sort_values(["person_id", "fill_date"])
    study = rx[rx["drug_class"].isin(["STUDY", "COMPARATOR"])]

    # New-user index: first qualifying fill; arm = drug_class dispensed that day.
    idx = (study.groupby("person_id").first().reset_index()
                .rename(columns={"fill_date": "index_date", "drug_class": "arm"}))

    # Washout: drop anyone with a prior study/comparator fill in the 365 days before index.
    prior = study.merge(idx[["person_id", "index_date"]], on="person_id")
    bad = prior[(prior["fill_date"] < prior["index_date"]) &
                (prior["fill_date"] >= prior["index_date"] - pd.Timedelta(days=WASHOUT_DAYS))]["person_id"]
    idx = idx[~idx["person_id"].isin(bad)].copy()

    # Continuous, FFS-observable enrollment across washout through index (no MA-only person-time).
    e = enroll.merge(idx[["person_id", "index_date"]], on="person_id")
    e["ok"] = ((e["enroll_start"] <= e["index_date"] - pd.Timedelta(days=WASHOUT_DAYS)) &
               (e["enroll_end"]   >= e["index_date"]) & (~e["ma_only"]))
    idx = idx[idx["person_id"].isin(e.loc[e["ok"], "person_id"])].copy()

    # As-treated exit: min(last days_supply end + grace, end of enrollment).
    last_supply = (study.merge(idx[["person_id"]], on="person_id")
                        .assign(supply_end=lambda d: d["fill_date"] + pd.to_timedelta(d["days_supply"], "D"))
                        .groupby("person_id")["supply_end"].max())
    enr_end = enroll.groupby("person_id")["enroll_end"].max()
    c = idx.merge(last_supply.rename("supply_end"), on="person_id") \
           .merge(enr_end.rename("enr_end"), on="person_id") \
           .merge(events.groupby("person_id")["event_date"].min().rename("event_date"),
                  on="person_id", how="left") \
           .merge(cov[["person_id", "ps_stratum"]], on="person_id", how="left")
    c["tx_exit"]  = (c["supply_end"] + pd.Timedelta(days=GRACE_DAYS)).clip(upper=c["enr_end"])
    c["exit"]     = c[["tx_exit", "enr_end"]].min(axis=1)
    had_event     = c["event_date"].notna() & (c["event_date"] <= c["exit"])
    c["exit"]     = np.where(had_event, c["event_date"], c["exit"])
    c["event"]    = had_event.astype(int)
    c["pt_days"]  = (pd.to_datetime(c["exit"]) - c["index_date"]).dt.days.clip(lower=0)

    # Aggregate to PS-stratum x arm; this is the ONLY thing that leaves the site.
    agg = (c.groupby(["ps_stratum", "arm"])
             .agg(events=("event", "sum"), person_years=("pt_days", lambda s: s.sum() / 365.25),
                  n=("person_id", "size")).reset_index())
    agg["data_partner_id"] = data_partner_id
    agg.loc[agg["n"] < MIN_CELL, ["events", "person_years", "n"]] = np.nan  # cell suppression
    return agg

Citations

FOUNDATIONAL / METHODS
  1. [1]Toh S, Gagne JJ, Rassen JA, Fireman BH, Kulldorff M, Brown JS. Confounding adjustment in comparative effectiveness research conducted within distributed research networks. Medical Care. 2013;51(8 Suppl 3):S4-S10.
  2. [2]Toh S, Reichman ME, Houstoun M, et al. Multivariable confounding adjustment in distributed data networks without sharing of patient-level data. Pharmacoepidemiology and Drug Safety. 2013;22(11):1171-1177.
  3. [3]Platt RW, Henry DA, Suissa S. The Canadian Network for Observational Drug Effect Studies (CNODES): reflections on the first eight years, and a look to the future. Pharmacoepidemiology and Drug Safety. 2020;29(S1):103-107.
APPLIED EXAMPLES
  1. [4]Hripcsak G, Ryan PB, Duke JD, et al. Characterizing treatment pathways at scale using the OHDSI network. Proceedings of the National Academy of Sciences. 2016;113(27):7329-7336.
REPORTING & GUIDANCE
  1. [5]Desai RJ, Wang SV, Sreedhara SK, et al. The FDA Sentinel Real-World Evidence Data Enterprise (RWE-DE). Pharmacoepidemiology and Drug Safety. 2024.