Inspiration

Clinical trials often end early because they can't recruit enough patients. Regeneron's own materials note that about 11% of chosen sites enroll zero patients and 37% enroll fewer than promised. The teams planning a trial have no easy way to see how similar designs ended. TrialRadar puts that history in front of them before they commit.

What it does

A trial planner enters a ClinicalTrials.gov trial ID. TrialRadar shows:

  • A low-accrual risk band (lower, middle or upper third) relative to recent trials, with the estimated chance against the recent average
  • Similar past trials: how many of the 25 most similar were terminated
  • The five nearest terminated trials, with the stop reasons their sponsors gave, in the registry's own words
  • A dashboard of why trials stop, and a "How reliable is this?" page with the full benchmark

It assists planners. It never approves a protocol or claims a cause.

How we built it

  • Data: all 41,380 Phase 2, 2/3 and 3 drug or biological trials from the ClinicalTrials.gov API v2 that started 2008–2019 and ended as completed or terminated. 7,085 were terminated, and 1,763 of those stopped for low accrual.
  • Labels: the registry only says "terminated" with free-text reasons, so we built ordered keyword rules (with negation handling) to label low-accrual stops.
  • Models: logistic regression and gradient boosting on design fields only. Anything that reflects what happened during a trial is excluded, and an automated test fails if one slips in.
  • Evaluation: trained on trials from 2008–2016 and tested on 2017–2019 trials the model never saw, with bootstrap intervals, calibration and drift checks, and simple baselines.
  • Similar trials: TF-IDF text similarity over conditions, interventions and design.
  • Stack: FastAPI backend with a React, Vite, TypeScript, Tailwind and Framer Motion front end. The built front end is committed, so a fresh clone runs without Node.
  • Built solo, using Claude Code as a development tool.

Results

On held-out 2017–2019 trials, the low-accrual model reaches AUC 0.70 (95% interval 0.68–0.72) and is well calibrated: 4.3% predicted against 4.5% observed. Overall termination is weaker (AUC 0.65) and under-predicts the shifted period, so the app shows it as a band only.

Challenges

We first planned to study protocol amendments, but the registry's version-history endpoints aren't publicly available, so we switched to real termination labels instead of simulating anything. Our early keyword labels also misread negated phrases like "not for safety reasons", which we found and fixed.

Limitations (stated in the app too)

  • Labels come from keyword rules over free text, not human review.
  • 37.9% of terminated trials give no usable stop reason.
  • Termination rates drifted upward by 2019.
  • Similarity is text-based, not biological mechanism.
  • It gives planners context. It is not a prediction for any single trial.

What we learned

How to evaluate a model under time drift, and that showing the limits openly builds more trust than a higher number would.

What's next

Access to protocol version histories so amendments can be studied, human-reviewed labels in place of keyword rules, and testing with real trial planners.

Built With

Share this project:

Updates

Submission history