Anpheros Research · Health Pattern Engine

Health is a time series.
We read it with rules you can check.

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

A snapshot hides the change.

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

Four questions, four methods.

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

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).

baseline_deviation · 1.1.0

Is this week unusual for this person?

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

Is a symptom recorded more often?

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

Does it come back on a rhythm?

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

Built to stay quiet.

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

Weekly symptom recurrence100%
Resting heart rate step84%
Blood pressure slope67%
Symptom frequency ×324%

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

What it refuses to say.

  • a diagnosisFindings describe the record. They never name a condition or suggest a treatment change.
  • a causeA change after a new medication is not evidence that the medication caused it, and every finding says so.
  • an AI's opinionNo AI model analyses the data. Every number comes from fixed statistical rules.
  • clinically reviewedThe thresholds for a meaningful change were set with AI assistance and have not yet been reviewed by a clinician. Every finding says this in a field of its own.
  • the time of dayThe person's local time is not in the record yet, so time-of-day patterns are not computed.

05 · Reproducibility

Same data. Same answer. Same id.

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

Three ways in.

Health Pattern Engine 0.2.1 · beta. Real records are analysed only with each patient's separate consent.