The data dictionary

Every finding on this site rests on a handful of numbers: some straight off the watch, some worked out afterwards. This explains what each one means in plain language, with the exact variable name and the technical details a fold away. It's for anyone curious, not just researchers.

A curated view: the ~30 entries here are the ones worth meeting. The full, exhaustive dictionary (every column, every engineered variant) is the backbone in the repository: the complete data dictionary →

It describes the variables, never the values. Where the day-notes are involved, we name which symptoms occur and in what combinations, never their timing or how often, and the notes themselves stay private.


What I felt

The body's own report, how each day felt, and the bad days. This is the ground truth the watch is tested against.

what I felt

Felt-state score

How each day felt, scored 1 to 10 by hand. In four years it never once rose above 6.

The ground truth the whole site tests the watch against, the answer key, not a watch reading.

Technical name & details
variable
gevoelscore
unit
1–10 (in practice 1–6 dense, 7–10 never reached)
source
Daily self-log
computed
Entered by hand each day; no transformation.
caveat
Daily scoring began Sept 2022, about five months after onset, so the line can't cover the pre-illness or acute period.
definition

Crash

Two or more days in a row at a felt-state of 3 or below. The sustained, post-exertional kind of bad stretch the guide is about.

Technical name & details
variable
is_crash (crash_v2)
source
Derived from the daily score
computed
A run of ≥2 consecutive days with score ≤3, merging runs within 3 days of each other. 29 crash episodes across the four years.
caveat
Identical to the earlier crash_v1; every episode also showed a slow-recovery tail, which validated the definition.
definition

Dip

A single bad day (score 3 or below) sitting between two ordinary ones, a transient rough day, not a sustained crash.

These grew more common as the sustained crashes grew rarer, part of how the kind of crash changed.

Technical name & details
variable
is_dip (crash_v2)
source
Derived from the daily score
computed
An isolated day ≤3 whose neighbours both score ≥4. 79 across the four years.
what I felt

Kind of load (cognitive / physical / emotional)

On days clear enough to tell, what the demanding part was, thinking, the body, or feeling.

Technical name & details
variable
cog_load · phy_load · emo_load
unit
1–3 (mild / moderate / severe)
source
Hand triage of calendar events + day-notes
computed
Assigned from the day's context where a signal was found.
caveat
A blank does not mean zero load; it means no signal was found that day. Present only where the day was reviewed.
what I felt

What the notes recorded

On days I wrote a note, the notes were sorted into the symptoms they mentioned (headache, fatigue, brainfog, sore throat, fever and a few more) and the day's overall tone (more positive, more negative, mixed).

It lets the written record become something countable, without ever publishing what the note said.

Technical name & details
variable
cat_symptoom_* · cat_sub_* · day_dominant_polarity
source
Categorisation of the day-note text, hand-checked for quality
computed
Each clause is tagged for symptom family, sub-type, and tone, then rolled up to the day. The automatic tagging was quality-reviewed by hand on a stratified sample, and the rules refined where it misfired.
caveat
Privacy: this site shows which symptoms occur and in what combinations, never their timing or how often. The raw note itself stays private and is never shown.

What the watch saw

What the Garmin Forerunner 245 records straight off the wrist, before anyone interprets it.

Garmin signal

Heart rate

Your pulse, in a few forms: the resting rate (the headline number, measured overnight), where it sat during the day, and the day's peak.

Technical name & details
variable
resting_hr (primary) · hr_median_waking · max_hr
unit
beats per minute
source
Garmin, resting HR is computed during sleep and attributed to the wake-up day
computed
Passed through from Garmin; the waking median and peak come from the all-day record.
Garmin signal

Overnight sleep-stress

Garmin's stress level (0–100) averaged across the night's sleep, a read on how switched-on the body stayed while it should have been resting.

Technical name & details
variable
stress_mean_sleep
unit
Garmin stress, 0–100
source
Garmin, recomputed from the raw sleep-window samples
computed
Mean of the stress samples inside the detected sleep window, on nights with enough valid samples.
Garmin signal

All-day stress

The same 0–100 stress score, averaged across the whole 24 hours rather than just sleep.

Technical name & details
variable
all_day_stress_avg
unit
Garmin stress, 0–100
source
Garmin daily summary
computed
24-hour mean. Waking-only and sleep-only versions also exist.
caveat
This is one of the channels the medication provably shifts, read it alongside the citalopram dose proxy.
Garmin signal

Body battery

Garmin's energy gauge, 0–100, charging with rest and sleep, draining with stress and activity. Recorded here as the day's floor and peak.

Technical name & details
variable
bb_lowest · bb_highest
unit
Body Battery units, 0–100
source
Garmin daily summary
computed
Daily minimum and maximum of the gauge.
caveat
Garmin only stores daily summary values; there is no minute-by-minute Body Battery in the export.
Garmin signal

Morning body battery

The energy gauge the moment you wake, the “battery left” you start the day with.

It's the raw signal behind the strangest finding: after overdoing it, a suspiciously high morning reading can precede a crash.

Technical name & details
variable
bb_sleep_end_value
unit
Body Battery units, 0–100
source
Garmin daily summary (sleep-end value)
computed
The gauge's value at the end of the sleep window.
caveat
Only exists from Sept 2024, Garmin began emitting the sleep-end value late on this watch, so earlier crashes can't use it directly.
used in
the swing →
Garmin signal

Steps & activity

How much you moved, daily step count, the minutes Garmin rates as moderate or vigorous, and the calories burned.

Technical name & details
variable
total_steps · moderate_min · vigorous_min · total_calories
unit
steps / minutes / kcal
source
Garmin daily summary
computed
Daily totals straight from the watch.
Garmin signal

Sleep, duration, stages, bedtime

How long and how well you slept: total time, deep vs light sleep, and what time you went to bed.

Technical name & details
variable
sleep_duration_min · sleep_deep_min / sleep_light_min · sleep_start_gmt
unit
minutes / clock time
source
Garmin sleep record
computed
From the detected sleep window; bedtime consistency is a rolling spread of start times.
caveat
This watch produces no REM stage, everything that isn't deep or awake is counted as light.
Garmin signal

Respiration

Breathing rate, in breaths per minute, measured across sleep and across the day.

Technical name & details
variable
respiration_avg_sleep
unit
breaths per minute
source
Garmin
computed
Mean over the sleep window; waking and 24-hour versions also exist.
Garmin signal

Blood oxygen (SpO₂)

The percentage of oxygen in the blood, measured overnight when the watch's Pulse Ox mode is on.

Technical name & details
variable
spo2_avg_sleep
unit
percent
source
Garmin (Pulse Ox)
computed
Mean over the sleep window.
caveat
The guide deprioritises this as easily unreliable; included for completeness. Coverage is partial, Pulse Ox wasn't always enabled.
Garmin signal

HRV, not on this watch

Heart-rate variability, the signal the guide trusts most. The Forerunner 245 has no sensor for it, so it simply isn't here.

Rather than fake it, the research reads it sideways, through the night-to-night variability of sleep stress (see the next group).

Technical name & details
variable
— (no column)
source
Not available on this device
computed
HRV Status needs a newer Garmin sensor (Elevate v4). On this 2019 watch the data simply isn't recorded.
caveat
This is a hardware limit, not a gap in the export, the guide's HRV patterns are tested through a proxy or not at all.

What we worked out

Measures built from the raw signals. Several exist because the obvious version would test the guide dishonestly, each foldout says how, and why it exists.

derived measure

Overnight stress variability

How much the sleep-stress level jittered from one night to the next. With no HRV sensor, this is the principled stand-in for it.

So far, the signal that held up best; it told the run-up to a crash apart in both the early body and the recent one. Modest, and still being tested.

Technical name & details
variable
stress_stdev_sleep (+ night-to-night spread)
unit
Garmin stress units
source
Derived from sleep-stress
computed
Variability of the sleep-window stress, read as a proxy for the autonomic recovery HRV would normally show. During sleep the movement, heart-rate and breathing inputs to Garmin’s stress score go quiet, leaving it close to a pure HRV signal, which is the basis for using it this way.
caveat
It is a proxy, and labelled as one. Garmin’s stress score is computed by the Firstbeat algorithm from the same beat-to-beat (R-R) timing that HRV comes from; an independent peer-reviewed study validated it against gold-standard ECG. So the variability tracks what HRV would, noisily, not in HRV’s literal units.
derived measure

Sustained heart-rate elevation

Whether the daytime heart rate stayed up for a long, unbroken stretch, the mark of real overexertion, as opposed to a brief spike.

The guide is specific that it's the *sustained* elevation that matters. So the measure had to be built to catch that, and only that.

Technical name & details
variable
hr_sustained_elevated_flag · hr_daytime_baseline_lagged
unit
minutes above a personal threshold
source
Derived from the all-day heart-rate trace
computed
Flags a day when the heart rate ran 20+ bpm above your own recent daytime normal for a continuous run of 30 minutes or more.
caveat
Why it was rebuilt: the obvious version (resting HR + 15) flagged the average day; it separated nothing. The reference had to be your *daytime* normal, not your sleeping rate, and the test had to be *sustained*, not a momentary peak.
derived measure

Stress that won't settle

After the day's stress peak, how long until it falls back to a resting level, and whether it ever does. The wall-of-orange pattern, measured.

When stress never comes back down to rest at all, that's not missing data; that failure to recover is the signal the guide names.

Technical name & details
variable
stress_post_peak_time_to_rest_min
unit
minutes (or “no return”)
source
Derived from the all-day stress trace
computed
Minutes from the daily peak until stress drops below Garmin's rest threshold of 25.
caveat
The honesty hinge: a blank means “never returned to rest that day” (the wall-of-orange-positive case) not a coverage gap. The usual missing-data reading is inverted here, on purpose.
derived measure

Rest-stress, sitting still

Minutes where stress was elevated *while the body was barely moving*, true arousal at rest, with movement filtered out.

Stress that rises because you're walking isn't the same as stress that won't switch off while you sit. This counts only the second kind.

Technical name & details
variable
stress_low_motion_min_count_S60_Mlow
unit
minutes per day
source
Derived from per-minute stress + motion
computed
Counts minutes where stress is in the elevated band (≥60) and the watch classes motion as low.
caveat
The motion filter is the point, without it, ordinary activity would be mistaken for sympathetic arousal at rest. This refinement is ours, on top of the guide's pattern.
derived measure

The U-dip (within-day stress dip)

A count of moments where stress briefly dips then springs back higher, the orthostatic (POTS) pattern Wiggers describes and treats with electrolytes. Present in my data and time-varying, not a crash predictor.

Technical name & details
variable
u_dip_count
unit
events per day
source
Derived from the per-minute stress trace
computed
Counts dip events: a sustained-stress window, a drop of ≥25 points, then a rebound above the starting level.
caveat
Named for the orthostatic (POTS) pattern, but not a POTS reading. POTS is defined by a heart-rate jump on standing, and this watch has no posture sensor to see it. The dip itself is a brief calming blip, the opposite direction to the sustained drop in heart-rate variability that marks POTS, so this is a match to the pattern Wiggers reads as orthostatic and treats with electrolytes, not something the watch diagnosed, and not anything I managed.
used in
the U-dip →
derived measure

Lead-up exertion load

How hard the recent days were, rated against your own normal, and how many of the last few days counted as a push.

The cost of overdoing it arrives days later, so this looks at the run-up to a day, not the day itself.

Technical name & details
variable
exertion_class_lagged · push_burden_7d_lagged · effective_exertion_slope_28d
unit
class (none…very heavy) / count / trend
source
Derived from steps, intensity and heart-rate peaks
computed
A day is ranked against a baseline window ending 30 days earlier; “push burden” counts the heavy days in the last 7.
derived measure

Compared to your recent normal

Most signals here are read not as raw numbers but as how far today sits from your own recent baseline, above or below what's normal *for you, lately*.

It's what makes a number mean something for one body, and it's where a naive version goes wrong.

Technical name & details
variable
*_lagged_lcera_z (and the rank variants)
unit
standard-deviation-equivalents from a rolling median
source
Derived
computed
Today is scored against a 60-day window that ends 30 days ago, restricted to the Long COVID era.
caveat
Why it's built this way: a plain trailing average lets a long push slowly become its own yardstick, so sustained overexertion stops looking like overexertion. The lag, and the illness-era restriction, keep the baseline honest.
derived measure

Personal step threshold

Whether a day went over *your* step target, rather than over some fixed number of steps.

The guide is explicit that step limits are personal and drift over time, so “too much” is measured against your own moving goal.

Technical name & details
variable
daily_step_goal · steps_above_goal_flag
unit
steps / true-false
source
Garmin adaptive goal + derived flag
computed
Flags days where steps met or beat Garmin's adaptive personal target.
caveat
Deliberately not a universal cutoff, the guide warns against copying someone else's number.
derived measure

Body-battery overnight gain

How much the energy gauge actually recharged across the night, morning battery minus evening battery.

Technical name & details
variable
bb_overnight_gain
unit
Body Battery units
source
Derived (morning minus evening body battery)
computed
bb_sleep_end_value − bb_sleep_start_value: positive is a net charge overnight, negative a drain.
caveat
A computed score, not a raw reading, and limited to the dates where both ends exist (from Sept 2024).
used in
the swing →
derived measure

Citalopram dose proxy

An estimate of how much of the medication was in the bloodstream on any given day, built from the documented dose changes.

The drug provably moves several of these signals. Modelling its level lets a test try to separate “the body changed” from “the drug changed the reading.”

Technical name & details
variable
dose_plasma_mg
unit
mg (steady-state plasma estimate)
source
Derived from the documented dose-step dates
computed
A pharmacokinetic smoothing of the six dose changes, using citalopram's ~35-hour half-life.

How we read time

How the four years get sliced, by illness chapter and by lived recovery phase.

time axis

Pre-illness / acute / Long COVID

Which broad phase a day falls in: healthy before the infection, the acute infection itself, or Long COVID after.

Technical name & details
variable
lc_phase
source
Derived from the calendar
computed
Pre-corona before 21 Mar 2022; the infection window through early April; Long COVID from 4 Apr 2022 onward (the onset I mark).
time axis

The recovery phases

A finer six-part slicing of the timeline, from the healthy baseline through the pacing-habit years to the medication period.

Technical name & details
variable
recovery_phase
source
Derived from the calendar
computed
Six phases marking the meaningful transitions: onset, the pacing practice forming, the habit settling, and the medication starting.

How we read it

The few words the findings rest on, what “it showed up” actually means.

yardstick

Discrimination (percentage points)

How much better a signal separated the run-up to a crash from ordinary days, measured in percentage points above chance.

A bigger number means the signal told the two kinds of day apart more reliably. It is the main yardstick behind the findings.

Technical name & details
computed
The gap, in percentage points, between how often a signal fired before crashes versus before matched ordinary days. Above zero = some real separation; near zero = none.
yardstick

Pre-registration

Locking the question, the data slice, and the bar for “this counts” *before* running the test, and having it checked in a fresh session first.

It's the discipline against fooling yourself, the thing that makes one person reading their own data trustworthy rather than just suggestive.

Technical name & details
computed
Each hypothesis has a locked spec written before the test runs; changing the spec afterward creates a new, separately-named version.
yardstick

Crash-drop sensitivity

Re-running a result with the crash days removed, to check the finding isn't just a handful of bad weeks doing all the work.

A relationship that only exists because of the crashes is a different, weaker claim than one that holds on ordinary days too.

Technical name & details
computed
A standing rule: every correlation reports a second version with crash days dropped, so a crash-driven result can't hide as a general one.

Beyond these, the research uses finer-grained measures still: individual stress-bout recovery dynamics, and around a hundred engineered exertion variants, kept out of this view to stay readable. They live, fully documented, in the complete data dictionary. The method that turns these variables into findings is back in the workings.

Open full page ↗