Pilot: How much of dismech's evidence could carry a CEBM/GRADE-style level?
Pilot investigation for issue #5000 ("Add a level-of-evidence / strength tier to
EvidenceItem"), requested by @cmungall in lieu of implementing the field directly.
Generated from a corpus-wide scan of kb/disorders/*.yaml and kb/modules/*.yaml
plus a live NCBI EFetch query of the MEDLINE PublicationTypeList for every
unique PMID cited. Reproduce with scripts/cebm_pilot_analysis.py
(see "Reproducing this pilot" below). This is a data-gathering pilot, not a
schema change — no evidence_level field has been added anywhere.
TL;DR
- Only ~2.5% of dismech's PMID-backed evidence is drawn from a publication MEDLINE itself classifies as a systematic review/meta-analysis or RCT. Case reports/series (14.9%) alone outnumber SR+RCT+guideline evidence (4.4%) by more than 3:1.
- For the specific case cmungall asked about — pathophysiology assertions
— RCT-typed evidence is even rarer: 82 of 17,425 pathophysiology evidence
items (0.47%) cite a MEDLINE-tagged RCT, and only 2.26% are SR/RCT/guideline
combined. This is expected: CEBM/GRADE were built to grade therapeutic
intervention evidence, and pathophysiology nodes mostly cite mechanistic
observation, not intervention trials. By contrast, in the
treatmentssection 11.8% of evidence is SR/RCT/guideline-tier, and the dedicatedclinical_trialssection is 66.7% RCT — CEBM is a much better fit there. - Real examples confirm cmungall's "impeccable source, subjective interpretation" worry — see the ALS/riluzole and celiac/ZED1227 cases below. The same RCT PMID backs both a snippet that IS the trial's own novel finding and a snippet that is background literature merely repeated in the trial's introduction. A per-reference evidence level would misclassify one of the two.
- Published inter-rater-reliability studies exist for both GRADE and orthopaedic-journal levels-of-evidence, and even under much easier conditions than dismech's (pre-filtered study designs, trained methodologists, whole-article not per-snippet judgments) agreement is only moderate-to-substantial (κ 0.44–0.85 depending on domain/experience) — see "Existing inter-annotator agreement literature" below. This directly informs the #1105 oscillation problem: disagreement is not unique to dismech's LLM curators, it's inherent to the task.
- PubMed already publishes a structured, NLM-curated
PublicationTypeListfield (Randomized Controlled Trial, Meta-Analysis, Systematic Review, Practice Guideline, Case Reports, Review, …) that dismech's own reference fetcher does not currently capture — it only storesMeshHeadingList(src/dismech/schemaconsumeslinkml_reference_validator'sPMIDSource._fetch_mesh_terms, which ignores the siblingPublicationTypeListelement in the same XML payload it already downloads). This is a concrete, low-cost opportunity: ingest an externally-curated ranking rather than asking an LLM to re-derive it — see "Actionable finding" below.
Method
scripts/cebm_pilot_analysis.py:
- Recursively walks every
kb/disorders/*.yamlandkb/modules/*.yaml(excluding*.history.yaml) and collects every dict that looks like anEvidenceItem(hasreference+evidence_source/supports), tagging each with the top-level slot it was found under (pathophysiology,treatments,phenotypes,clinical_trials, …). - Filters to
PMID:-backed items and gets the unique PMID set. - Batch-queries
https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi(db=pubmed,rettype=xml, 200 IDs/request, rate-limited to NCBI's 3 req/s unauthenticated cap) for the real MEDLINEPublicationTypeListof each PMID, caching results inresearch/cebm_pilot_pubtypes_cache.json. - Buckets each PMID's publication types into a coarse CEBM-oriented tier
(see the script's
LEVEL_1_SR/LEVEL_2_RCT/ … constants) and cross-tabulatesevidence_source × bucketandKB-section × bucket.
Corpus scanned: 1,568 disorder/module YAML files, 67,967 evidence-item-shaped
nodes, 54,821 (80.7%) PMID-backed, spanning 16,370 unique PMIDs. NCBI
returned PublicationTypeList data for 16,058 of those (98.1%); the
remainder are mostly NCBI Bookshelf records (GeneReviews chapters, which are
indexed as PubmedBookArticle rather than PubmedArticle and carry no
PublicationTypeList) or PMIDs the live query didn't resolve.
Caveat on the bucketing itself: this is a coarse pilot mapping, not a
proposed final scheme — e.g. Review (narrative review) has no clean home in
either CEBM or GRADE (see "What CEBM doesn't capture well" below), and a
publication can carry multiple PublicationType tags simultaneously (e.g. a
paper tagged both Randomized Controlled Trial and Multicenter Study);
the script takes the highest tier present.
Headline numbers (all PMID-backed evidence, corpus-wide)
| Bucket | Evidence items | % of PMID-backed | Unique PMIDs |
|---|---|---|---|
| L1 — Systematic review / meta-analysis | 1,394 | 2.54% | 533 |
| L2 — RCT (incl. controlled/pragmatic trial) | 731 | 1.33% | 368 |
| Guideline / consensus | 283 | 0.52% | 77 |
| L3 — Other trial or observational study | 2,509 | 4.58% | 905 |
| L4 — Case report / case series | 8,153 | 14.87% | 2,101 |
| Narrative review (non-systematic) | 15,340 | 27.98% | 4,699 |
| Journal article, no special design tag | 22,178 | 40.46% | 7,279 |
| Non-evidentiary (letter/comment/editorial) | 187 | 0.34% | 96 |
No PublicationTypeList data (Bookshelf, etc.) |
4,046 | 7.38% | 312 |
SR + RCT + Guideline combined ("classic CEBM top tier"): 2,408 evidence items = 4.39% of PMID-backed evidence (3.54% of all 67,967 evidence items).
The remaining ~19.3% of all evidence items (13,146) are not literature
citations at all — ORPHA:, CGGV:/CGDS: (ClinGen), ICEES:,
clinicaltrials:, NCIT:, CIVIC_*, GEO:/geo:, DOI: (non-PMID),
url:. CEBM/GRADE, which grade individual primary/secondary clinical
studies, don't apply to these directly — they already carry their own
source-native provenance signal (ClinGen's own gene-disease validity
classification tier, Orphanet's expert-review status, a trial's own
clinicaltrials.gov phase/status field). Worth a follow-up note in any
evidence_level design: for these sources, "ingest the external ranking"
(see below) is the only sensible model — there's no paper to re-grade.
Section breakdown — where does CEBM actually fit?
This is the direct answer to "how many pathograph[y] assertions come from RCTs":
| KB section | Total PMID evidence | SR+RCT+Guideline | RCT only | Case report/series | Narrative review |
|---|---|---|---|---|---|
| pathophysiology | 17,425 | 394 (2.26%) | 82 (0.47%) | 2,176 (12.49%) | 5,705 (32.74%) |
| phenotypes | 13,629 | 476 (3.49%) | 64 (0.47%) | 2,891 (21.21%) | 3,310 (24.29%) |
| genetic | 4,151 | 119 (2.87%) | 10 (0.24%) | 578 (13.93%) | 827 (19.93%) |
| treatments | 6,823 | 803 (11.77%) | 453 (6.64%) | 771 (11.30%) | 2,000 (29.31%) |
| clinical_trials | 36 | 24 (66.7%) | 24 (66.7%) | 0 | 0 |
| diagnosis | 1,960 | 73 (3.72%) | 7 (0.36%) | 404 (20.61%) | 440 (22.45%) |
| biochemical | 1,877 | 87 (4.64%) | 33 (1.76%) | 279 (14.87%) | 451 (24.03%) |
The pattern is exactly what CEBM's own design would predict: it's a scheme
for grading therapeutic intervention evidence, and it concentrates where
dismech records intervention evidence (treatments, clinical_trials).
Applying it to pathophysiology — the section that carries the plurality of
all evidence (17,425 of 67,967 items, 25.6%) — would leave essentially all of
it (97.7%) bottomed out at CEBM's lowest tier ("Level 5, mechanism-based
reasoning") or unclassifiable, which is not very discriminating for the
evidence type dismech actually depends on most.
Concrete examples: impeccable source, subjective dismech interpretation
Pulled from the 82 pathophysiology evidence items backed by a MEDLINE-tagged RCT, then manually checked against the cached abstract:
1. Amyotrophic Lateral Sclerosis, PMID:8302340 (Bensimon et al., the
landmark 1994 riluzole survival RCT — PublicationType: Randomized
Controlled Trial, Clinical Trial):
snippet: "Some research suggests that the excitatory amino acid neurotransmitter
glutamate may be involved in the pathogenesis."
explanation: "Trial of riluzole, an antiglutamate agent, supports role of
glutamate excitotoxicity in ALS pathogenesis."
supports: PARTIAL
The trial's design (RCT, survival endpoint) is about as strong as clinical
evidence gets. But the dismech claim being supported is mechanistic
("glutamate excitotoxicity drives pathogenesis"), inferred backward from
drug response — a drug working through target X is suggestive, not
confirmatory, of X's causal role (response could be off-target, or the
target could be downstream of the true driver). The curator already
encoded this gap via supports: PARTIAL, without any evidence_level
field — evidence that supports and a future evidence_level are doing
different jobs and both matter: evidence_level would say "RCT, strong
study design"; supports: PARTIAL says "the inferential leap from that
RCT's result to this specific mechanistic claim is only partial." A naive
per-reference evidence_level: HIGH tag on this item, divorced from
supports, would overstate confidence in the mechanistic claim itself.
2. Celiac Disease, PMID:38914866 (Dotsenko et al. 2024, Nat Immunol —
the CEC-3 phase-2a randomized placebo-controlled trial of the TG2 inhibitor
ZED1227 — PublicationType: Randomized Controlled Trial). This single PMID
backs four pathophysiology evidence items in the dismech entry, and they
are not equally strong:
"Transglutaminase 2 (TG2) plays a pivotal role in the pathogenesis of celiac disease... by deamidating dietary gluten peptides"— this is background/introduction text restating prior literature, not a new finding of this trial (confirmed by reading the full cached abstract:references_cache/PMID_38914866.md)."ZED1227 treatment preserved transcriptome signatures associated with mucosal morphology, inflammation, cell differentiation and nutrient absorption to the level of the gluten-free diet group"— this is the trial's own novel transcriptomic result.
Both snippets would inherit the identical Randomized Controlled Trial
PublicationType tag if evidence_level were assigned per-reference. Only
the second deserves it; the first is really citing background literature at
one remove. This is the concrete version of cmungall's worry —
evidence_level has to stay scoped to the individual EvidenceItem (which
is what the schema in #5000 already proposes, correctly) and cannot be
safely bulk-assigned from a reference's own publication type without a
human/LLM check on whether the specific quoted sentence is the paper's own
finding or borrowed context.
Existing inter-annotator agreement literature
Two real, checked studies bear directly on the #1105 oscillation problem (disagreement isn't a dismech-specific defect — it's intrinsic to this kind of classification):
- Hartling L, Fernandes RM, Seida J, Vandermeer B, Dryden DM. "From the Trenches: A Cross-Sectional Study Applying the GRADE Tool in Systematic Reviews of Healthcare Interventions." PLOS ONE 2012. (PMC3320617) — two trained methodologists independently GRADE-rated evidence for clinically important outcomes across three systematic reviews. Inter-rater κ ranged from 0.18 (precision — poor) to 0.84 (consistency — near-perfect), with overall quality-of-evidence κ = 0.44 (only moderate), even between trained raters doing the much narrower job of grading an already-conducted systematic review's outcomes (not raw individual papers, and not mechanistic claims).
- Obremskey WT, Pappas N, Attallah-Wasif E, Tornetta P 3rd, Bhandari M. "Level of evidence in orthopaedic journals." J Bone Joint Surg Am. 2005;87(12):2632-2638. (PMID:16322612) — 382 clinical articles, rated Level I–IV by 3 experienced + 2 inexperienced reviewers using the JBJS-A scheme (a close cousin of CEBM). κ = 0.62 (level of evidence) / 0.76 (study type) between experienced and inexperienced reviewers; κ = 0.75 / 0.85 between experienced reviewers only; κ = 0.84 / 1.00 against the journal's own gold-standard grade. Crucially, this study pre-excluded animal/cadaver studies, basic-science articles, review articles, case reports, and expert opinion — i.e., it only tested agreement on the subset of literature CEBM/JBJS-A levels were built for.
Implication for dismech: even in a much friendlier setting than dismech's
(single per-article grade rather than per-snippet/per-claim, expert human
raters rather than an LLM, and — in the orthopaedic study — a pre-filtered
set that already excludes the review articles, case reports, and mechanistic
papers that make up ~73% of dismech's pathophysiology evidence), agreement
tops out around "substantial" (κ ~0.75–0.85), not "near-perfect." No
published study was found that measures agreement on the specific judgment
dismech needs: given one quoted snippet supporting one specific mechanistic
edge, what CEBM/GRADE tier applies. That task is likely harder than either
study above, because it also requires the "is this snippet the paper's own
finding or borrowed background" distinction from the celiac-disease example.
This argues for treating any curation-LLM-assigned evidence_level as
provisional/advisory rather than authoritative, at least initially — possibly
with a lower confidence bar than other structured curation fields, and a
compliance/QC pass analogous to linkml-reference-validator's snippet check.
What CEBM doesn't capture well
Two real gaps surfaced by this corpus, beyond what issue #5000 already flags:
- Narrative (non-systematic) reviews are 28% of all PMID-backed evidence and CEBM 2011 has no clean tier for them — they're not "systematic review of RCTs" (Level 1), and calling them "Level 5 mechanism-based reasoning" undersells a review that synthesizes a large primary literature (e.g. a GeneReviews-style clinical overview) versus one author's speculative mechanistic hypothesis, which really are both "Level 5" under CEBM's letter. GRADE has the same blind spot (it grades primary study evidence feeding into a specific recommendation, not narrative synthesis).
JOURNAL_ARTICLE_UNCLASSIFIED(40.5%) is dismech's largest single bucket — case series too small to be codedCase Reports, small cohort/mechanistic-observation papers, etc. This is exactly the tier the original issue's Option A (GRADE) buckets asVERY_LOW/LOWwithout further distinction, which may be too coarse: a 200-patient mechanistic cohort study and a 1-family linkage study both land here today.
These reinforce the issue's own Option C instinct (a dismech-native scheme)
for the pathophysiology-heavy majority of the corpus, while Option A/B
(GRADE/CEBM proper) look like a strong, low-friction fit specifically for the
treatments/clinical_trials sections where intervention evidence actually
concentrates.
Actionable finding: an external ranking already exists — dismech just isn't ingesting it
cmungall's third question — "maybe there is separate ranking of the references from external sources and we just ingest these?" — has a concrete, immediately actionable answer: yes, for the RCT/SR/guideline axis specifically.
PubMed's MEDLINE PublicationTypeList (NLM-indexer-curated, not
author-self-reported, not LLM-derived) already answers "is this an RCT /
meta-analysis / systematic review / practice guideline?" with the same
Entrez.efetch(db="pubmed", rettype="xml") call dismech's reference fetcher
already makes for every PMID. But
linkml_reference_validator.etl.sources.pmid.PMIDSource._fetch_mesh_terms
(the function just fetch-reference uses) only extracts MeshHeadingList
from that XML and discards the sibling PublicationTypeList element —
confirmed by inspecting the installed package
(.venv/lib/python3.12/site-packages/linkml_reference_validator/etl/sources/pmid.py).
A false-friend caution surfaced in this pilot: naively grepping the MeSH
keywords already cached in references_cache/*.md for RCT-like terms is
not a safe substitute — PMID:10693687 carries the MeSH heading
"Randomized Controlled Trials as Topic" (the paper discusses RCT
methodology) while its real PublicationType is plain "Journal Article";
MeSH topic headings and PublicationType tags are different NLM fields that
happen to share vocabulary.
This suggests a two-tier design for the eventual evidence_level schema
work: (1) a deterministic, externally-sourced signal — capture
PublicationTypeList in the reference cache (e.g. a publication_types:
frontmatter field alongside the existing keywords:), and let tooling
auto-suggest HIGH/L1–L2 for RCT/SR/meta-analysis/guideline tags — vs.
(2) the subjective per-snippet judgment (mechanistic-inference strength,
background-vs-finding distinction) that the ALS and celiac examples show
must stay a curator/LLM call, never auto-derived from the reference alone.
Implementing (1) is a small, self-contained change to
src/dismech/reference_cache_frontmatter.py / the just fetch-reference
pipeline and would give dismech an auto-suggested floor for evidence_level
on ~4.4% of PMID evidence (the SR/RCT/guideline tier) with essentially no
hallucination risk, before any LLM judgment is asked to do the harder
(2)-type work for the rest.
Open questions for the schema-design follow-up (not answered by this pilot)
- Should
evidence_levelbe required to be internally consistent withsupports, or are they allowed to diverge the way the riluzole example does (PARTIALsupport from what would nominally beHIGH-level design)? - For the ~19.3% of evidence that isn't a PMID at all (ORPHA/ClinGen/ICEES/
clinicaltrials/etc.), should
evidence_levelbe left absent, or should each structured source define its own mapping (e.g. ClinGen's own validity classification tiers)? - Given the IRR literature above, should a first
evidence_levelrollout be scoped totreatments/clinical_trialsonly (where the scheme fits well and reliability precedent is closest to this pilot's citations), leavingpathophysiology/mechanistic evidence for a later, possibly dismech-native, scheme?
Reproducing this pilot
# Full corpus + live NCBI query (~3-4 min, respects NCBI's 3 req/s unauthenticated cap)
uv run python scripts/cebm_pilot_analysis.py --out research/cebm_pilot_data.json
# Reruns reuse research/cebm_pilot_pubtypes_cache.json and only fetch new/uncached PMIDs
uv run python scripts/cebm_pilot_analysis.py --sample 400 # fast dev run
Outputs: research/cebm_pilot_data.json (summary cross-tabs) and
research/cebm_pilot_pubtypes_cache.json (raw pmid -> [PublicationType,...],
committed so the numbers above are reproducible without re-querying NCBI).