How Spor finds patterns
Spor compares how often a symptom follows a specific ingredient against how often the symptom appears otherwise. When the difference is clear enough, that ingredient is surfaced as a candidate for further conversation — never as a diagnosis. Below: the short version for everyone, and a thorough walkthrough for clinicians, with candid notes on strengths and weaknesses.
The short version — for everyone
Every time you log a symptom, Spor looks back at what you took in during the hours before. For each ingredient it compares two numbers:
- How often does the symptom follow meals that contained the ingredient?
- How often does the symptom follow meals that didn't contain the ingredient?
If the first is clearly higher than the second, that's a pattern worth bringing to your clinician. Spor shows the ratio between those two numbers, never a "probability of allergy" or a "certainty" score. It's a starting point for a conversation, not a conclusion.
We keep the raw counts visible ("7 of 14 meals") and avoid percentages by themselves, because percentages on small numbers mislead easily — 100 % across four events is not the same as 100 % across forty.
The math — for clinicians
For each ingredient we compute relative risk (RR):
RR = P(symptom | ingredient) / P(symptom | no ingredient)
The numerator is the share of intake events containing the ingredient that were followed by a symptom within the reaction window. The denominator is the share of intake events without the ingredient that were followed by a symptom in the same window. RR = 1 means no difference, RR = 2 means the symptom follows the ingredient twice as often as otherwise.
Reaction window
The patient sets a reaction window — default 24 hours. A symptom is linked to every intake event that occurred within that window before symptom onset. The window is per profile, so children, adults and medication trackers can use different windows within the same app.
Minimum thresholds
An ingredient is considered only if:
- It appears in at least 5 intake events.
- At least 3 symptom events have been logged in the period.
These floors prevent small-number noise from looking like a real pattern.
Common-ingredient guard
Ingredients present in more than 80 % of all events are excluded from the analysis. They're too ubiquitous to distinguish symptomatic from asymptomatic days. Salt, water, and wheat in a Western diet are typical examples.
Confounder adjustment
When logging a symptom the patient can flag known confounders: poor sleep, stress, acute illness, travel, or menstruation. Symptoms with at least one such flag get half weight in the counting — enough to remain visible, enough to reduce the risk of attributing an association to the ingredient when the real driver is something else.
Association strength bands
RR values are classified in four bands:
- Insufficient — RR < 1.2
- Weak — RR 1.2 – 1.5 (shown only in the diary appendix, not in the main table)
- Moderate — RR 1.5 – 2.5
- Strong — RR ≥ 2.5
Cut-offs are set more conservatively than in typical epidemiological literature, where RR ≥ 3 is often considered strong. We use lower thresholds because self-reported data is noisier than data from controlled studies.
Strengths
- Familiar epidemiological method. Relative risk is well-known to clinicians and easy to interpret. Spor doesn't polish the number or present it stripped of context.
- Counts, not percentages. All figures show as "X of Y events" so readers can judge the thinness of the evidence for themselves.
- Confounder-aware. Symptoms logged with interfering factors are automatically down-weighted.
- Conservative thresholds. Because self-reported data is noisier, a pattern surfaces earlier than in classical literature — but never without a minimum of observations.
- Open-source-style transparency. Every threshold and formula is described here and on the method page of every exported PDF report. No black boxes.
Weaknesses and limitations
We're candid about the real limits of the method. The following should always accompany any interpretation of Spor's output:
- Association, not causation. A strong RR shows two events co-occurring. It does not prove the ingredient causes the symptom.
- Self-reported data. Both intake and symptoms are logged by the patient. Missed or late entries can hide or misroute patterns.
- Correlated ingredients. Bread contains wheat, gluten and yeast. Milk contains both lactose and whey protein. When these co-occur in the diet, an association alone cannot isolate the actual driver.
- The reaction window is a heuristic. Real reaction times range from minutes (IgE-mediated) to days (delayed immune responses). The 24-hour default fits many, but not all, presentations.
- Immediate vs. delayed reactions. Spor does not distinguish between reactions that came moments after intake and those that came near the end of the window. Timing can be read from the diary timeline by the clinician.
- Rare severe symptoms. Severe reactions are by definition rare. With few events it's statistically hard to separate signal from chance — even though the clinical stakes are highest.
- No control for other exposures. The analysis only sees ingredients and logged confounders. Environmental exposures (pollen, pets, medications not logged) are not captured.
- No multiple-testing correction. RR is computed for many ingredients at once. With enough ingredients and few observations, some associations will arise by chance — particularly in the "weak" band.
What Spor does not do
Spor does not diagnose, does not recommend treatment and does not replace clinical advice. The app is hypothesis-generating, not confirmatory. A strong pattern in Spor is a starting point for further evaluation — for example structured elimination-and-reintroduction trials under clinician guidance, or clinically ordered allergy testing.
Thresholds, formulas and adjustments are also described on the method page of the exported PDF report, so patient and clinician can see the same numbers and rules alongside the data. See also Veileder — sources behind the symptom vocabulary for the origin of each clinical label.