From watch to number.
Every finding here rests on numbers, and every number started as a sensor reading on a wrist. Between the two is a pipeline of choices: what to keep, what to average, what to measure against. Here's that path, because each step is a place a finding could be made or lost.
- 1
The watch never stops sampling
Heart rate every few seconds, motion, sleep, and an HRV-derived 'stress' index, written continuously to raw FIT files on the device. This is the firehose: hundreds of thousands of readings a day, far too much to reason about directly.
- 2
A day is collapsed to a handful of numbers
Each day's firehose is reduced to a small set of features: average and peak stress, the day's lowest Body Battery, resting heart rate, sleep-window stress. The 1,440 minutes become one row in a table: the unit every test actually runs on.
- 3
Some numbers are hand-built
A few features don't come ready-made. The overnight stress variability that stands in for HRV is custom-extracted from the raw sleep-window samples, with a minimum-samples gate so a thin, poorly-recorded night drops out rather than quietly distorting the result.
- 4
Everything is read against my own baseline
A raw value means little on its own; what matters is how far it sits from my personal normal. So signals are scored within-person, against my own recent baseline, never against a population figure. This is the 'relative, not absolute' rule, and it was learned the hard way when a population threshold mis-fit my small range. See the discipline that locks the rest.
- 5
The human side is one number a day
Against all of that sits a single hand-logged number: the daily felt-state, 1 to 10. It's the ground truth the watch is tested against, and the crashes the whole study turns on are labelled from it. See how a crash gets labelled.
What the score and the watch share
None of these steps is neutral. An average can bury a five-minute spike; a baseline can be drawn the wrong way; a gate can drop a real night. Naming the pipeline is what lets the surface stay simple without hiding the machinery underneath it.
Every variable and its derivation, in the research repo: DATA_DICTIONARY.md ↗. The plain-language version is the data dictionary.