Graduate capstone

Metabolite
association maps

Eleven analytes you can read from an at-home urine or saliva strip, mapped against the diseases and chemicals that appear alongside them in PubMed abstracts. Built to ask which of these underused, non-invasive measurements might be worth studying further.

A hypothesis generator, not a prescription generator.

These maps suggest associations that might merit study. They are not medical advice, not diagnostic, and no substitute for clinically validated testing. An association here means two terms turned up in the same abstracts, nothing more.

None of the eleven require a blood draw. Ten are read from urine, one from saliva.

01

Explore

Entity type (visualized on map)
Compare

 

 

Most characteristic terms

Ranked by lift: how much more often a term appears here than across all eleven corpora combined. This is not the same as most frequent.

Most cited terms

Ranked by how many distinct abstracts used the term. Two mentions in one paper is not two sources.

02

What this is, and what it isn't

How a map is made

Search PubMed for the analyte, sorted by relevance, and take up to 400 abstracts. Run scispaCy's biomedical named-entity recognizer over them to pull out every disease and chemical mentioned. Turn each term into a 200-dimension word vector trained on PubMed text, then use t-SNE to press those vectors down to two dimensions so they can be drawn.

Nothing runs when you load this page. The maps are computed ahead of time with a fixed random seed, so a given map looks the same on every visit.

Why you can't compare two maps

t-SNE coordinates carry no meaning between runs. Position on the canvas is arbitrary, and the distance between two clusters says nothing. Only local neighbourhoods carry information: which terms sit next to which, and only within a single map.

Switching analytes gives you a different question, not a comparison. The stability score below each map measures how well those neighbourhoods survive re-running with a different seed. It also falls as maps get larger, so it can't rank one analyte against another either.

t-SNE will cluster noise

Give t-SNE structureless data and it still returns a picture with clean, well-separated blobs. So "the plot has clusters" is not evidence of anything. That's what the null model is for: it shuffles each dimension independently, destroying the relationships between terms while preserving every other property of the data.

Toggle it on. If you can't tell the real map from the null, the real map isn't showing you anything.

The literature isn't always about the strip

Queries search each analyte broadly rather than restricting to the urine or saliva finding. That surfaces associations a narrower search would miss, but it means several maps describe the blood version of a measurement: the glucose literature is overwhelmingly blood glucose, leukocytes is largely haematology rather than urinary leukocyte esterase.

Where that applies, it's stated on the analyte itself rather than left to this paragraph.

Most of every map is one paper's vocabulary

Between 72% and 88% of the terms in these maps appear in only a single abstract. Those points are drawn faintly and left unlabelled. They are not noise exactly. A rare term may be precisely the under-studied association worth chasing. But a term used by one paper can't distinguish a real signal from a passing mention.

What was left out

Clustering was computed and then dropped from this page. K-means on these vectors produced a median silhouette of 0.10 across 22 maps, which is barely above no structure at all, with the largest cluster routinely swallowing half the terms. Showing those groupings as findings would have been the most misleading thing here.

Spelling and lemma variants of one word are merged (haematuria into hematuria, diabete into diabetes). Distinct concepts are not: diabetes, t2dm and gdm remain separate points, which means one condition can be scattered across several. Resolving that properly needs concept linking, not string matching.