Methodology
Magistra Side Effects Predictor™ — Version 5.41 (dual-track)
Last updated: September 2026 | Open for peer review
Invitation to researchers
This methodology is deliberately transparent. We invite biostatisticians, epidemiologists, clinical researchers, and ML researchers to critique our approach, propose improvements, or collaborate. All feedback is publicly acknowledged in future versions.
Submit feedback ↓1. Dual-track architecture
Rather than blending clinical and community data into a single number (which hides the evidence hierarchy), we compute two parallel estimates per side effect:
Clinical
Only published clinical trials + regulatory reports. Conservative. All modifiers from peer-reviewed sources.
Real world
Reporting frequency from posts on the community platforms themselves: of all distinct community reports in our corpus, what share mention this effect. News-aggregator search results do not count as community reports (corrected 2026-08-17), and Reddit posts count only if they are in a GLP-1, weight-management or diabetes community we collect from (corrected 2026-08-29, after a failed subreddit restriction let 159 of 185 reports in from unrelated communities; widened 2026-09-25 to ten GLP-1 drug communities the list had omitted, which took the denominator from 26 to 42) — the live platform list is shown on /en/data and in /api/data. Not a measured incidence — a single anecdote is not a percentage (see "5. Honest limitations" below for why we stopped averaging self-reported rates).
The two tracks measure different things and are deliberately not compared as one estimate: clinical is an incidence percentage, real-world is a reporting frequency (how often something comes up, not how often it happens). A high reporting frequency alongside a low clinical estimate is a signal that patients are actively talking about something — useful as a pointer, not evidence of a higher true incidence. (Revised 2026-08-14: earlier versions of this page described the real-world track as an incidence estimate that should "converge" with clinical data — that rested on averaging self-reported percentages from forum posts, including one X/Twitter post claiming 76% hair loss that pulled a 2-source average to 39%.)
2. Data collection
Daily, 17 scrapers collect data from four source categories. Claude Haiku extracts structured data points with a confidence level (high/medium/low):
- • Clinical: PubMed, ClinicalTrials.gov, Cochrane (PubMed-indexed), NICE guidelines, preprints
- • Regulatory: FDA FAERS (direct API — queried daily, but has stored no new row since 2026-08-13: see the note below), EMA (direct ema.europa.eu pages)
- • User reports: Reddit (26 subreddits), Trustpilot, Drugs.com, Quora
- • News: Google News search results (incl. coverage of WHO/MHRA/EMA safety actions — not a direct feed from those agencies)
Each data point retains its sourceType for filtering into the two tracks. Deduplication is performed on the composite key (sourceUrl + sideEffect), extended for ClinicalTrials.gov registry rows with three further discriminators taken from the row itself: the arm label, the registry's own MedDRA preferred term, and which of the record's two adverse-event tables (SERIOUS or OTHER) the row was read from. Every other source produces the pre-extension key unchanged — see the preprint, §2.2. Extraction is conservative: only explicitly stated rates, no inference.
A configured scraper is not the same as a producing source, and a successful query is not the same as a stored row: Reddit has been served an HTTP 403 block since 2026-05-28, and the FDA FAERS query succeeds every day but has stored nothing since 2026-08-13, because openFDA returns the same query URL for every reaction term of a drug and our dedupe key is that URL plus the effect — so an already-stored pair is never re-read. Live per-source counts, each with the date of its most recent data point and a stale flag, are published at /api/data?q=overview.
3. Statistical approach
For the clinical track:
- Filter data points by patient profile: sex and dose tier, keeping records that do not state them (the engine can also filter by ethnicity and exercise, but the side-effect predictor does not ask for them)
- Weighted average (weight = sample size × extraction confidence, capped at 1 for systematic reviews/meta-analyses — their stated sample size describes participants pooled across many trials, not a cohort for the one rate reported; future work: inverse-variance meta-analytic weighting by study quality)
- Winsorization at 5th/95th percentile if n > 10 (bounds logged explicitly)
- Dose scaling if data lacks dose specificity
- Log-odds modifier application (capped at total shift of 2.5 log-odds)
- Random-effects confidence interval (simplified, unweighted τ² — inspired by DerSimonian-Laird, not inverse-variance weighted)
The real-world track is not computed this way: its reporting frequency counts all community reports in the corpus, with a Wilson interval, and is not filtered by profile.
4. Self-evolving model
A daily statistical analysis computes empirical odds ratios for every dimension × effect with enough citable evidence (≥10 eligible rates). 14 of 15 effects clear that bar and are fitted daily — but every fit is degenerate: the eligible rate points behind them carry no demographic covariate at all (sex unspecified, no age band), so every fitted coefficient comes out at an odds ratio of 1.0 and cannot move a modifier in production. Every modifier in production is therefore still the 2026-04-12 hand-coded seed value, and no auto-update has ever been applied or flagged (the model config now stands at v7, manual corrections only). Safeguards for when the evidence changes:
- • FDR correction (Benjamini-Hochberg) across all hypothesis tests
- • Auto-update only when n ≥ 30, corrected p < 0.01, and OR change < 0.3
- • Larger changes are flagged for human review
- • New parameters (ethnicity, BMI, diet) get 'promoted' when significant for 2+ effects
- • Max 5 auto-updates per day; all changes logged with provenance
- • Every applied or flagged change archives the outgoing config version (no retention cap) — this has never happened yet, since no auto-update has ever been applied or flagged
5. Honest limitations
We publish our limitations because hidden weaknesses are more dangerous than visible ones:
- Evidentiary base (not the corpus size): The corpus holds 3,669 data points across the 15 published side effects, but only 2612 of them state a rate, and after our eligibility rules 1961 rates from 89 distinct studies are allowed to support a published estimate. Excluded: 150 seed unverified, 66 spontaneous report share, 14 aggregator result, 421 placebo comparator arm. Rates are collapsed to one entry per source per effect (614 entries in total); since 2026-09-08 the site-wide count is keyed by study URL, so one registry record or paper counts once however many effects it reports. Many effects therefore rest on a single source — which is stated next to each estimate. (Correction 2026-08-31: the April-2026 seeding pass turned out to have also written rows restating our own static literature table under real trial/study URLs that no extraction ever read — rows a URL-based screen cannot catch. All 150 seed rows are now labelled and excluded; the eligible base roughly halved as a result, and five effects fell back to a labelled literature figure. Base figures published before this date should not be cited.)
- FAERS is not incidence: FAERS shares are reported separately and never averaged into an incidence estimate. Note what the denominator is: our collector sums the counts of a drug's 30 most-reported reaction terms and divides each term's count by that sum, so the published share is a share of term-mentions — not of reports and not of patients (a report naming three reactions counts under all three, and any term outside the top 30 is in neither the numerator nor the denominator).
- Reviews do not count as extra studies: A systematic review or network meta-analysis that restates rates from trials we already pool must not carry its own pooling weight — otherwise the review's already-pooled sample size (thousands to tens of thousands of participants across many trials) would outweigh the individual registry records it draws from. Any source whose title or abstract describes itself as a systematic review or (network) meta-analysis is therefore capped to a pooling weight of 1, the same floor a single community post gets. Checked 2026-09-18: every source this rule currently affects is itself a self-described review (0 primary trials incorrectly capped); this is text detection, not a guarantee, so it stays an acknowledged residual risk.
- Populations and counting windows are mixed: A pooled clinical rate combines trials of every indication among the trials we pool — obesity, type 2 diabetes, cardiovascular outcomes, and type 1 diabetes on background insulin — and each trial counts an event at least once within its own window, which runs from days to years. The window changes the number: short Phase 1 studies supply many rows but little weight, and most of the weight comes from trials of a year or longer, so read a pooled rate as a share over roughly one to several years. The indication and window mix behind each estimate is published per effect in /api/data (indicationMix, windowMix); we re-weight by neither, because no evidence base for such a weighting exists. Read the weight, not the row count: seven cardiovascular-outcomes trials (participants with type 2 diabetes and established cardiovascular disease or high cardiovascular risk or, in SELECT, established cardiovascular disease with overweight or obesity and without diabetes) carry 63% of nausea's pooled weight on 2 October 2026, obesity trials 15%.
- Below 5%, trials go missing: Most of the registry trials we pool list a non-serious adverse event only when it exceeded 5% in at least one arm. A trial in which a term stayed at or under 5% in every arm contributes no row for it. For effects pooled near or below 5%, the base can therefore mostly include only trials where the term was listed: the count of trials is a floor on how many trials saw the effect, and the pooled rate is likely higher than it would be across all trials. Serious adverse-event tables carry no threshold. Rows per threshold are published per effect in /api/data (thresholdMix).
- Demographic gaps: Female bias (81% of the 151 data points that specify a sex), minimal ethnic diversity in sources. Only 151 of 3,884 data points state a sex at all.
- Modifier sources: Every modifier currently applied was hand-coded at the 2026-04-12 seed and no per-modifier citation is recorded for any of them, so treat each odds ratio as an expert-coded prior rather than a sourced estimate — the predictor now prints the modifiers it applied, and their provenance, beside every adjusted figure. Zero have so far been replaced by empirically estimated values, because no effect reaches the threshold of 10 citable stated rates. Target architecture: inverse-variance meta-analytic framework with formal study quality assessment (Cochrane Risk of Bias).
- No interaction terms: Modifiers are applied independently. Interactions (e.g., sex × age) are not modeled — we cap cumulative log-odds shifts to limit stacking bias.
- Calibration testing: Not yet formally validated against independent outcome data. Planned once n ≥ 500 per effect.
- LLM extraction: Imperfect. Gold-standard manual audit is planned on a sample of 50 sources per effect.
- Journey predictor: Since 2026-09-12 the weight-trajectory model takes its total loss from the ClinicalTrials.gov arm matching the selected molecule, dose tier and diabetes status (semaglutide: STEP; tirzepatide: NCT04184622/NCT04657003; liraglutide: NCT01272219/NCT01272232, with lower tiers scaled via NCT00422058); the shape of the curve and every age, sex, exercise and BMI modifier remain calibrated on semaglutide STEP data for all molecules. The muscle-preservation and after-stopping models use STEP trial constants with expert-coded modifiers throughout. None of the three is empirically validated.
- Not causal: These are population-average conditional risks, not individual causal predictions.
6. Publication roadmap
- • Phase 1 (current): dual-track framework, open methodology, community feedback
- • Phase 2: n ≥ 100 per effect, formal calibration testing
- • Phase 3: n ≥ 500, external validation on independent dataset
- • Phase 4: pre-register at OSF.io, submit to peer-reviewed journal (target: Nature Medicine)
We are a small team and our methodology inevitably has weaknesses. If you see something wrong or improvable, let us know.
Researcher feedback
If you're a biostatistician, epidemiologist, clinical researcher, or ML scientist: critique our approach. We acknowledge all contributors in future versions and maintain a public changelog.
Open review request, with the five questions we most want answered: GitHub issue #1 →
Submit a source
Know a published trial result or paper we're missing? Give us the source and the numbers for one arm and one side effect. We check it against the published record before it can be used.
Open source on GitHub
The full methodology, source code, and preprint are published under Apache 2.0. Inspect, fork, or submit a pull request.
github.com/saurabhgoyal75/magistra-predictor →Cite this methodology
This page is the canonical, continuously updated version of the methodology. An archived snapshot is on Zenodo with DOI 10.5281/zenodo.23138788 (all versions; v5.41 is 10.5281/zenodo.23138789).
Working from the corpus itself? The dated snapshot behind these estimates — the full dataset CSV with a PDF brief and this methodology annex — is available as a one-off purchase, alongside the free public API. Data & API.
Magistra Side Effects Predictor™ — Statistical indicator, not medical advice.