trend · 1.1.0
Is it going up or down?
Theil–Sen slope with a Mann–Kendall test on one value per day. Dense watch data is reduced to weekly medians. The test is corrected when neighbouring days resemble each other (Yue–Wang).
Explore the app
About Anpheros
Anpheros Research · Health Pattern Engine
A medical record is usually read one value at a time. The things that matter most, like a slow decline, a week that is not like the others or a symptom that keeps coming back, only show up over months. Anpheros finds them with fixed, versioned statistics, and every finding carries the data behind it.
Fig. 0 · Synthetic patient, 180 days of systolic blood pressure. Dots: daily values. Line: Theil–Sen trend.
01 · The problem
What a record usually shows
128 mmHg
Latest systolic reading. Normal-looking, and silent about where it is heading.
What the engine reports
−7.7 mmHg / 6 months
Synthetic patient with a decline of 8 mmHg planted over six months. The slope is recovered with its period, its uncertainty and the readings it rests on.
AI models are now asked to read medical records. Given a handful of numbers, a model guesses the trend. We think the trend should be computed, not guessed, and then handed to the model with its evidence.
02 · Method
Each question has one statistical method, chosen for small, irregular, personal data. Each method carries a version number, so its results can be reproduced.
trend · 1.1.0
Theil–Sen slope with a Mann–Kendall test on one value per day. Dense watch data is reduced to weekly medians. The test is corrected when neighbouring days resemble each other (Yue–Wang).
baseline_deviation · 1.1.0
The last 7 days are compared with days 8–60, using Mann–Whitney or a difference of means adjusted for AR(1) autocorrelation. The comparison is against the person's own normal, not a population average.
event_rate_change
Symptom days over the days the person logged anything: the last 30 days against the 90 before, with an exact test. A day without an entry is not counted as a day without the symptom.
recurrence
The intervals between episode starts are tested against a Monte Carlo simulation of episodes placed at random. The simulation is seeded from the data's own fingerprint, so the same record always gives the same p-value.
The rule for "supported"
q < 0.05 and |change| ≥ threshold
All tests in one run are corrected together with Benjamini–Hochberg. A finding is statistically supported only when the corrected q-value is small and the change is big enough to matter for that measurement. Everything else is reported as a description, labelled weak or not tested.
03 · Validation
A pattern engine that finds something in everyone is worse than none. We tested it on synthetic patients with nothing planted, and on others with known patterns of known size.
0%
of 600 runs on synthetic records with no pattern produced any supported finding. Target: at most 5%.
0%
was the false alarm rate of our first baseline test on watch data. Neighbouring days look alike, and the test did not know that. We corrected for autocorrelation before anything shipped.
0 ms
for a full run over a typical year of one person's record. A heavy five-year record takes 236 ms.
Fig. 1 · Sensitivity: share of planted patterns found as supported, effect at twice the threshold
The symptom frequency detector is the weakest: it catches a tripling about one time in four. The engine reports a miss as "weak" or "not tested", never as "no change".
04 · Limits
05 · Reproducibility
A finding's id comes from its data, its method version and its configuration. If the record changes, the id changes, and the old id answers that the data has changed. A finding is recomputed on request, never stored, and each one links to the readings it rests on.
"type": "trend",
"summary_text": "Systolic blood pressure fell by about 7.7 mmHg over 180 days.",
"strength": "moderate",
"statistics": { "p_value": 0.0004, "q_value": 0.0031 },
"evidence_total": 58,
"method": { "name": "trend", "version": "1.1.0" },
"engine_version": "0.2.1",
"review": { "thresholds_reviewed_by_clinician": false },
"safety": { "not_a_diagnosis": true, "causal_claim": false }
Fig. 2 · Abridged finding from a synthetic patient. The values are illustrative.
06 · Work with us
Developers
REST endpoints, four MCP tools for AI agents, a patterns section in the context API and SDKs for TypeScript and Dart. Try it in the free sandbox, with synthetic patients.
Developer guide →Researchers
We want the methods challenged. Talk to us about method review, validation scenarios, longitudinal benchmarks and joint studies.
Start a conversation →Clinicians
Each measurement has a threshold for a change worth mentioning, and none has been clinically reviewed yet. We are looking for clinicians to review them one measurement at a time.
Offer a review →Health Pattern Engine 0.2.1 · beta. Real records are analysed only with each patient's separate consent.