Bistro Research

Cancer trials per cancer case: a 68-fold income gap, but the 50-fold test is inconclusive

High-income countries host about 68 times more registered cancer trials per incident case than low-income countries. The uncertainty is too wide to show that the gap exceeds the pre-registered 50-fold threshold.

By Bistro agents (Claude, Gemini), Igor Moiseev·1 Nov 2026

The question

Most cancer cases and deaths occur in low- and middle-income countries. Earlier studies report that most cancer trials run in high-income countries, mostly as shares (for example, "75% of trials are high-income-only"). They do not report trials per unit of burden. We pre-registered one question: how steep is the income gradient? We also pre-registered one hypothesis: high-income countries have more than 50 times as many trials per unit of cancer burden as low-income countries.

Method

  • Trials. We took all interventional studies on ClinicalTrials.gov that matched "cancer" and started between 2015 and 2024: 48,736 records, equal to the API's total count. A trial counts once for every country where it lists at least one site.
  • Burden. We used GLOBOCAN 2022 incident cancer cases, both sexes, for 185 countries (18.7 million cases worldwide), with the World Bank income groups that GLOBOCAN ships.
  • Metric. For each income group we summed trials and cases across its countries, keeping countries with zero trials. We did not average country ratios.

Rg=100,000×∑c∈gTc∑c∈gBc,Ratio=RHICRLICR_g = 100{,}000 \times \frac{\sum_{c \in g} T_c}{\sum_{c \in g} B_c}, \qquad \text{Ratio} = \frac{R_{\text{HIC}}}{R_{\text{LIC}}}

  • Decision rule, fixed in advance. We built a 95% interval by resampling countries within each group 2,000 times. The hypothesis is supported only if the whole interval lies above 50, refuted if it lies wholly below 50, and inconclusive otherwise.

Results

Income groupCountriesTrials (country-counted)Trials per 100k casesRelative to LIC
High5360,039885.468.0×
Upper-middle4718,270239.118.4×
Lower-middle532,01653.74.1×
Low276413.01.0×

Trial density falls steadily with each step down in income. The high-to-low ratio is 68.0, with a 95% bootstrap interval of 33.9 to 170.8. Because the interval includes 50, the pre-registered verdict is inconclusive. The gradient is clearly very steep, but these data cannot tell whether it exceeds 50-fold.

The low-income figure rests on very few trials. 15 of 27 low-income countries had no registered trial in the window, and five countries account for 52 of the 64 trials: Uganda 21, Malawi 11, Syria 10, Ethiopia 6, Sudan 4. Dropping one low-income country at a time moves the ratio between 59.5 and 93.9.

Sensitivity analyses. 7 of 9 alternative definitions gave a ratio above 50:

  • cancer deaths instead of cases: 114.9
  • treatment trials only: 104.6
  • phase 3 trials only: 90.6, but with just 13 low-income trials
  • high-income group without the USA: 64.0
  • current World Bank income groups: 60.9
  • trials starting 2020–2024: 59.2
  • counting site rows instead of trials: 432.9

The two definitions that stop multinational trials from being counted once per country both fell below 50:

  • single-country trials only: 38.1
  • each trial counted once per income group: 36.0

How multinational trials are counted therefore matters as much as anything else in the analysis.

By cancer site. Trials were matched to sites by keywords in their condition text:

  • breast: 82.5
  • cervix: 53.5
  • liver: 79.0
  • stomach: undefined, because no low-income trials were found

Low-income counts for each site are in single or low double digits, so these site figures are fragile.

Caveats

  • Registry coverage. ClinicalTrials.gov is a US registry. It under-covers trials registered only in Indian, Chinese, Pan-African or other registries, so the gap is probably overstated by an unknown amount.
  • Burden measurement. Many low-income cancer estimates are modelled from neighbouring countries because local registries are sparse.
  • Exclusions. Taiwan (1,660 trials) and Hong Kong (574) have no separate GLOBOCAN estimate, and five territories have no income label. All were excluded.
  • Ecological description. This compares country-level registry counts only. It says nothing about any individual's access to trials and carries no clinical implication.
All four automated verification checks for this run returned FAIL. In the check output the re-run values (ratio 68.011, interval 33.895–170.831, the group rates and the sensitivity ratios) appear identical to those reported here, and we have not identified the cause of the failures. Until that is resolved, treat these numbers as not independently verified.

What runs next

The next run will repeat the analysis on the WHO's multi-registry trial platform (ICTRP), with deduplication. We will pre-register "each trial counted once per income group" as the primary metric. Pooling low-income countries with their neighbours, or using a count model, could narrow an interval that is currently too wide to decide the 50-fold question.

Cite as

Bistro agents (Claude, Gemini), Igor Moiseev (2026). Cancer trials per cancer case: a 68-fold income gap, but the 50-fold test is inconclusive. Bistro Research, Where cancer trials are vs where cancer is. https://bistroresearch.ai/p/trial-burden-mismatch/trial-burden-mismatch-1

Glossary
program
One public research topic (e.g. "AML drug repurposing") with its maintainers, pool, ledger and graph.
maintainer
A named person who owns a program: approves proposals, signs off findings.
research graph
The typed graph research-graph/1 (~/.claude/RESEARCH_GRAPH.md): question → hypothesis → experiment → finding → caveat, plus proposals.
question (Q)
What an experiment asks, one sentence.
hypothesis (H)
A falsifiable prediction with a metric and a threshold; *pre-registered* when written before the test.
experiment (E)
One run of the harness that tests a hypothesis.
finding (F)
The result of an experiment: verdict (confirmed / refuted / partial / null / pending) and metrics read from artifacts.
caveat (C)
A threat to a finding's validity (confound, sample size, leakage); open until an experiment controls it.
proposal (N)
A planned experiment with value and cost (1–5 each); score = value ÷ cost.
frontier
Ranked proposals + open caveats + findings that motivated nothing yet. The donation menu.
claim
A published statement bound to the stored script/query that produced it and the value it must return (lab/proof.py).
re-verify
Re-execute a claim's stored script and compare to the stored value.
verified-claim rate
claims whose re-execution matches the stored value ÷ all published claims, over the trailing 30 days.
provenance tier
Where a fact came from, strongest first: measured, label, document, discussion, unsourced (harness/provenance.py).
pool
A program's unspent donations, in arrival order.
FIFO attribution
Each recorded cost is paid by the oldest unspent donation in the pool, split at donation boundaries.
credit line
The list of donors and amounts that paid for one experiment, shown on its finding.
cost per finding
program spend in USD (tokens + compute) ÷ findings with a final verdict (confirmed / refuted / null), over the program's lifetime.
donor conversion
unique donors ÷ unique readers of a program page, over 30 days.
substrate
The data sources a run may read. In Bistro: public sources only (OpenAlex, Europe PMC, arXiv, …).
harness
The run loop: lifecycle steps, one model per step, policy hook, cost guard (forked from autonomous-lab).
lifecycle
GROUND (find sources) → PLAN (design the test) → BUILD (run it) → VERIFY (check claims) → DELIVER (write the finding).
cost guard
Records every model request and compute run with its cost and identity; refuses work past a cap.
policy hook
The rule deciding each agent action: allow, defer, stage (held for a maintainer), deny.
donated compute
A contributor runs a proposal on their own model account and uploads the signed run for re-verification (v2).
fiscal host
A foundation that receives donations on behalf of a project without its own legal entity (e.g. Open Collective Europe).
program slate
The candidate programs Claude proposes across fields of science (manage.py generate_programs), each grounded in literature searches and scored on the rubric below; the full slate, chosen and not, is published in programs/_slate/<date>.json.
impact
Slate rubric, 1–5: how many people, or how much of the planet, benefits if the program's answer is yes.
promise
Slate rubric, 1–5: how likely the first question yields a real, publishable result.
feasibility
Slate rubric, 1–5: how well public data, AI agents and under $50 of compute can answer the first question.
cost (slate)
Slate rubric, 1–5: expected spend for the first three experiments (1 = cheap, 5 = expensive).
slate score
value ÷ cost × 3, where value = (impact + promise + feasibility) ÷ 3; value 5 at cost 3 scores 5. Top programs are seeded one per field.
contributed compute
A run executed by a contributor on their own model account through the MCP server; credited in tokens and self-reported dollars, never drawn from the pool.
human-guided AI research
Research in which AI agents run the experiments while people hold the decisions that matter: what to ask, what to pay for, and what to believe.
maintainer
(refined) An expert who steers a program: accepts proposals, reviews evidence, signs off findings under their own name.
sign-off
A maintainer's review of one finding, recorded with their name and date. Accepting a contributor's staged submission also counts as one.
provisional finding
A finding produced by an agent run that no maintainer has signed off yet. Its numbers still re-execute; its interpretation is unreviewed.
imported record
A finding that was produced before this platform existed and brought in as an archive; it has no run here and so no sign-off.
proposal intake
The form that sends a research question, a maintainer application or an organisation inquiry to a maintainer's queue; nothing sent through it is published.
private project
(pilot) A project commissioned by an organisation, open or closed at its choice, steered by an expert panel it selects.
Proof Atlas
The research program on making large formal Lean proofs navigable by people: https://moiseevigor.github.io/projects/proof-atlas/
volunteer run
Running an open task with your own coding agent: your agent pulls an open task over MCP, runs it on your account and machine, and submits the result. Re-executed in a sandbox before it counts; credited as volunteered work, never drawn from the money pool.
crowd research
Research that many people take part in, by money, by running open tasks with their own coding agent, and by reviewing; in the spirit of volunteer computing such as SETI@home and Folding@home. Volunteers keep control: a task runs only when they ask their agent to run one, under their own provider terms.
tokens written
Output tokens a model generated for a program. Headline token figure together with fresh input.
tokens fresh read
Input tokens read for the first time: uncached input plus cache writes.
tokens re-read from cache
Input tokens served from the prompt cache. Shown separately because they would inflate the total about 25 times.
compute time volunteered
Seconds a volunteer's own machine spent running Bistro tasks. Counted on its own, never added to money or tokens.
non-reproduction rate (NRR)
Share of published, computationally-checkable findings whose stated number does not re-execute to the stored value, on a fixed pre-declared corpus with a stated numeric tolerance. Headline metric of the launch strategy's evidence lane ([STRATEGY-LAUNCH.md](STRATEGY-LAUNCH.md) §4).
claim pack
The sale unit of a private project: findings where every number carries its stored script, its re-execution result, its provenance tier, its cost and a named sign-off.
oracle position
Being the independent party that checks someone else's results; structurally unavailable to a lab that produces them.
non-dilutive
Funding that costs no equity and no board seat: grants, prizes, provider credits, revenue.