Work FAERS Signal Detection

How do you tell a real drug safety signal from a coincidence, in a database of twenty million reports?

Python · pandas · openFDA API

The finding

Tested against warfarin and bleeding — a link established for decades — the detector returned the expected strength. Run against pairs with no known link, it stayed quiet.

Method

Proportional reporting ratio, reporting odds ratio, chi-squared and Evans criteria across the full FAERS database (warfarin–haemorrhage PRR ≈ 5), stress-tested across seriousness filters and years, with negative controls.

So what

A detector nobody has tried to break is not evidence. Ask any screening method what it does on a case where the answer is already known — and on one where the answer should be nothing at all.

Interactive

FAERS · DISPROPORTIONALITY

Where's the line between signal and noise?

Each bar is a drug–reaction pair's PRR — how much more often that reaction is reported with the drug than with everything else. Drag the threshold; watch which pairs stay signals.

Threshold PRR ≥ 2.0 3 signals 2 non-signals
11
6.1
5
1.61
1.31

Full write-up

What it does

Takes a drug–event pair, queries the openFDA API across the full FAERS database, and computes:

  • Proportional Reporting Ratio (PRR)
  • Reporting Odds Ratio (ROR)
  • Chi-squared statistic
  • Evans criteria (the standard threshold combination: PRR ≥ 2, n ≥ 3, chi-squared ≥ 4)

Validation

I validated the method on warfarin and haemorrhage — a well-established signal in the pharmacovigilance literature. The analysis returned a PRR of approximately 5, consistent with published estimates.

From there I stress-tested it: running the same signal across different seriousness filters (all reports, hospitalisation only, death only) and across multiple years, to see how the estimate moved. I also ran it against negative controls — drug–event pairs with no known association — to check the false-positive rate.

Stack

Python · pandas · openFDA API