# ProteinIQ clinical-trial discontinuation analysis

We analysed existing ClinicalTrials.gov records for the article [What percentage of clinical trials fail?](https://proteiniq.io/guides/clinical-trial-failure-rate). This is an original descriptive analysis of public registry data, not new experimental data or a peer-reviewed study. The underlying records belong to ClinicalTrials.gov and their submitters. Reason coding is exploratory and has no independent human validation.

## Results and interpretation

Of 33,667 eligible registered trials with actual starts during 2015-2020, 4,692 (13.9365%) had TERMINATED status in the frozen snapshot. This is a cross-sectional registry-status proportion, not an estimate of eventual termination risk, negative trial results, or drug-program failure before approval. All eligible unresolved statuses remain in the denominator.

In a simple random sample of 400 of those terminated trials, 120 (30.0%) reported recruitment difficulties. The marginal 95% Wilson interval is 25.7%-34.7%. Explicit lack of efficacy/activity appeared in 42 (10.5%); safety-related concerns in 16 (4.0%). Reasons can overlap. Unmentioned reasons are not established to be absent. See summary.json for every category, including zero-count categories, and its interval.

## Files

All files are in the same public directory:
https://proteiniq.io/data/guides/clinical-trial-discontinuation/

- [summary.json](summary.json): complete results, denominator/status counts, exclusions, phase and sponsor breakdowns, sensitivity checks, sampling seeds, reason counts and intervals.
- [cohort.csv.gz](cohort.csv.gz): all 58,303 extracted records, not just the eligible cohort. A blank `exclusion` identifies eligible rows; otherwise the field gives the first applicable exclusion. Includes identifiers, phase, status, dates, enrollment, sponsor class and original stopping text.
- [reason-sample.csv](reason-sample.csv): 400 sampled terminated records, original explanations, assigned labels, uncertainty flags and rationales.
- [pilot.csv](pilot.csv): the 30 explanations used to develop the codebook.
- [codebook.json](codebook.json): category definitions and contextual coding rules, frozen before the main review.
- [reviewed.tsv](reviewed.tsv): authored classification decisions used as analysis input. This is not generated by keyword matching.
- [review.json](review.json): review method, second-pass record IDs and correction notes.
- [attribution-checks.json](attribution-checks.json): three supplemental API responses checking sponsor trial identifiers when stopping text referred to named analyses. Includes retrieval times and response hashes.
- [analyze.py](analyze.py): Python standard-library extraction and analysis code.
- [sources.json](sources.json): query, selected fields, complete paginated request URLs, retrieval timestamps, record counts and SHA-256 hashes.
- [snapshot-01.json.gz](snapshot-01.json.gz), [snapshot-02.json.gz](snapshot-02.json.gz), [snapshot-03.json.gz](snapshot-03.json.gz): frozen selected-field API responses. Each decompresses to a JSON array of original response strings. Together they contain all 59 pages; no live API access is needed for reproduction.

## Reproduce the frozen analysis

Download analyze.py, sources.json, all three snapshot parts, codebook.json, reviewed.tsv and review.json into one directory. Use Python 3.11 or newer; this snapshot was processed with Python 3.13.2. No packages or credentials are needed.

```sh
python -B analyze.py --output-dir reproduced
```

The script checks snapshot and original response hashes, page counts and unique identifiers, applies eligibility rules, regenerates the seeded samples, verifies complete coding coverage and reaggregates the results. It produces summary.json, cohort.csv.gz, reason-sample.csv and pilot.csv. These files should match the supplied outputs when run with the frozen inputs and the same Python version. Other Python versions may differ in compressed-file bytes; compare decompressed content and JSON values.

`python -B analyze.py --fetch` downloads a new live snapshot and replaces the source files beside the script. Only use that command in a separate copy. The public registry changes: a new extraction is a new analysis and will usually require a fresh review of the newly selected sample. Existing labels must not be silently carried over to different records or revised stopping explanations.

## Source and extraction

- Source: [ClinicalTrials.gov API v2](https://clinicaltrials.gov/data-api/api), maintained by the U.S. National Library of Medicine.
- API version: 2.0.5.
- API data timestamp: 2026-09-18T09:00:04, as returned by the version endpoint.
- Retrieval completed: 2026-09-19T15:18:02.862846+00:00.
- API version and data timestamp matched before and after extraction.
- Page size: 1,000; 59 pages; 58,303 unique records. The downloaded total matched the first page's totalCount. Subsequent pages do not necessarily repeat totalCount.

Query:

```text
AREA[StudyType]INTERVENTIONAL AND (AREA[InterventionType]DRUG OR AREA[InterventionType]BIOLOGICAL) AND AREA[StartDate]RANGE[2015-01-01,2020-12-31]
```

The script and manifest retain the exact API field selection. These are selected-field snapshots, not complete ClinicalTrials.gov records. We did not retrieve patient-level data or assess reported endpoint results. Supplemental attribution checks did not change the cohort or the frozen stopping text.

## Eligibility and denominator

The unit is one NCT identifier. We include interventional studies containing at least one DRUG or BIOLOGICAL intervention, across all conditions, locations and sponsor classes. Trials of existing medicines, combinations and new indications are included. Multiple interventions do not create extra rows.

We require an ACTUAL start in calendar years 2015-2020 and a registered phase of Phase 1, Phase 1/2, Phase 2, Phase 2/3 or Phase 3. Combined phases are distinct groups. Early Phase 1, Phase 4, missing/NA phases and any other phase combinations are excluded. Trials marked WITHDRAWN or NOT_YET_RECRUITING despite an actual start are excluded as start/status conflicts. Actual enrollment of zero is also excluded; missing enrollment is retained. Three eligible records have missing enrollment. An estimated enrollment of zero is not treated as observed zero enrollment.

The implementation uses the first applicable exclusion in a fixed order. In this snapshot, exclusions were:

| Sequential exclusion | Records |
| --- | ---: |
| Phase outside scope | 16,534 |
| Start not actual, after phase exclusions | 7,508 |
| Start/status conflict, after preceding exclusions | 594 |
| All other rules, after preceding exclusions | 0 |
| **Eligible** | **33,667** |

Eligible statuses were COMPLETED (21,655), TERMINATED (4,692), UNKNOWN (3,857), ACTIVE_NOT_RECRUITING (2,326), RECRUITING (981), ENROLLING_BY_INVITATION (34) and SUSPENDED (122). We retained all of them. The numerator is TERMINATED alone. Suspended does not mean permanently terminated, and unknown is not imputed to any outcome.

The percentage is 100 multiplied by the terminated count divided by all eligible records in that group. Because the extraction enumerates the eligible registry snapshot, we do not attach a sampling confidence interval to its status proportions. This does not remove coverage, reporting or measurement uncertainty.

## Stopping-reason sample and coding

We sorted the 4,692 eligible terminated records by NCT ID, then sampled without replacement using Python `random.Random(20260919).sample`, retaining 400 records. A separately seeded 30-record pilot (`20260918`) informed the codebook. The main draw was from the full population; two pilot records also occur in the main sample. Both IDs are listed in summary.json. The pilot is not a validation set.

One AI assistant read all 400 explanations, respected negation and references to other studies, and assigned one or more labels with a rationale. No primary cause was forced when several explicit reasons were supplied. A sponsor decision alone is not evidence of poor efficacy, toxicity, inadequate funding or commercial strategy. Unspecified sponsor decisions receive their own label. Reports of insufficient efficacy in another study are treated as external evidence rather than observed failure in the sampled trial. Lack of observed activity can include pharmacodynamic activity, not only a clinical endpoint.

Safety-related reasons include explicit concerns arising from external evidence and participant exposure risks. They do not all establish that the intervention was toxic. Pandemic mentions alone do not establish recruitment, financial or operational mechanisms. The original wording and coding rationale are available for every decision.

We flagged 111 records as uncertain because of incomplete, nonspecific, ambiguous or conflicting explanations, including unspecified sponsor decisions. The same assistant re-read all flagged records plus a random 40-record audit drawn from the main sample with seed `20260920`. The union contained 137 records. This is a repeated contextual review, not a second independent reviewer. We did not measure inter-rater agreement or claim human adjudication. Supplemental checks corrected a reference to the current study that could otherwise have been mistaken for evidence from another trial; conservative unclear labels were retained when findings were unspecified.

Every reason percentage uses all 400 sampled records as denominator, including absent explanations and a status-text conflict. Multiple labels can occur in one record and totals can exceed 100%. The chart shows the eight most frequent labels, not an exhaustive or mutually exclusive distribution. Complete labels and counts are in summary.json.

## Uncertainty and sensitivity checks

The script computes two-sided marginal 95% Wilson intervals for each reason proportion, with z = 1.959963984540054. We do not apply a finite-population correction or adjust for multiple categories. Intervals describe sampling uncertainty only; coding uncertainty, incomplete registry coverage and selective explanations may be more consequential. The code reproduces arithmetic from the retained decisions, not an independently validated interpretation of the text.

- Restricting starts to 2015-2019 gives 3,689 terminated of 26,676 eligible (13.8289%). This reduces, but does not eliminate, incomplete follow-up.
- Industry-led trials: 2,448 of 16,935 (14.4553%). Other or missing lead-sponsor classes: 2,244 of 16,732 (13.4114%). These unadjusted groups differ in population and reporting. Industry involvement is not identical to industry lead sponsorship.
- One sampled record, NCT02382406, explicitly described full completion despite TERMINATED status. Removing just that flagged record yields 4,691 of 33,666 (13.9339%). This limited sensitivity check is not a correction of the entire cohort: unsampled records were not adjudicated for such conflicts. Planned enrollment completion alone was not enough to declare a status error.

ClinicalTrials.gov does not cover all clinical research equally, records can be updated late, and the snapshot is not a prospective cohort with uniform follow-up. We did not reconstruct time-to-event outcomes, link trials into drug-indication programs, assess endpoint success, or adjust phase comparisons for disease, sponsor and follow-up. Therefore the 13.9% trial-termination share cannot replace historical Phase 1-to-approval attrition estimates near 90%.

For citation, credit ProteinIQ's September 2026 analysis and ClinicalTrials.gov as the underlying source, identify the 2015-2020 actual-start cohort, and distinguish full-cohort status counts from the exploratory 400-record reason sample.
