A heuristic for feeling fine
|Related tools||Oura Ring|
|Builds on project(s)|
|Has inspired||Projects (0)|
This is an on-going self-research project about using a number of physiological parameters to create a personal heuristic for whether I'm feeling fine or under the weather. It so far is mainly focused on using data from an Oura Ring and makes use of around 4 years of historic data (from November 2018 to December 2022).
Background[edit | edit source]
Over the years of using my Oura Ring I have settled into the habit of opening up the app in the morning to check my "readiness" metrics, which are mainly calculated based on the resting heart rate, heart rate variability (HRV), body temperature and respiratory rate. Despite all of these metrics being influenced by how "well" one sleeps (including body temperature), I have found these to more interesting than the predicted sleep stages, sleep timings etc. A big reason for finding those metrics more interesting is that I felt that they can be quite a good predictor of how well or crummy I will feel for the upcoming day or days by looking at whether they deviate from my expected baseline or not, similar to how Quantified Flu allows one to look at outliers.
Generally having my body temperature and resting heart rate going up and my HRV and respiratory rate going down seems to signal some kind of disturbance. Disturbances can be caused by a number of things:
- Coming down with an infection
- Being jet lagged
- Drinking alcohol in the evening
- Acute stress
As I know my own context (i.e. what I did the day before) many times I can rule out many of the factors (e.g. being on vacation, without jet lag and no drinks? might be an infection coming). Over the years I feel like I've created some mental heuristics of what the "normal" range of values is I would expect and at which deviations I should at least think a bit about whether there might be something going on. For example, a rise in body temperature by 0.4 ºC or a nightly resting heart rate of over 60 bpm are borderline and to me feels like something is going on.
Questions & Methods[edit | edit source]
While those mental heuristics are nice for having an intuition, they are a bit limited as it's hard to update my own expectations of what is normal and it's nearly impossible to make a prediction that's not based on looking at individual metrics. That's why I wondered: Can I come up with a rule of thumb that can be put into code for making a better heuristic?
Given that my own mental approach was just looking at "abnormal deviations from my expectation" I decided to just go with the more statistical concept of looking at standard deviation (σ), which measures the degree to which individuals within the sample differ from the sample mean. By looking at the standard deviation for those values, I can establish what the "normal" range for each of the four metrics of interest (resting heart rate, heart rate variability, body temperature) would be.
|Resting heart rate||56 bpm||51 – 60 bpm||47 – 64 bpm|
|Heart rate variability||40 ms||30 – 49 ms||21 – 59 ms|
|Body temperature deviation||0.0 ºC||-0.22 – 0.22 ºC||-0.44 – 0.44 ºC|
|Respiratory rate||14.4 /min||13.6 – 15.1 /min||12.7 – 16.1 /min|
Assuming a normal distribution, 68%, of all data for each of the metrics will be within the range of σ, and 95% within the 2σ range. Looking at the table above we can see that my intuition that a 0.4 ºC degree deviation of my body temperature is indeed quite significant, as it's just at the upper border of the 2σ range. In contrast, my assumption that a resting heart rate of 60 bpm would be "unusual" turns out less right, as it's just at the border of the 1σ range, meaning those are still quite common. And seeing those numbers also lets me have a rough idea of what to think of as "unsual" values for the HRV & respiratory rate, where before I didn't really have any good intuition for.
Extraordinary days[edit | edit source]
Having those ranges of what are outliers now maybe also allows looking into how to make a prediction that's not just based on an individual metric but the collective of the four metrics I think might work for this. A simple idea I had (and which will probably make mathematicians cringe and tell me off), was to "score" each day by how much each of the four metrics is an outlier. Each metric would contribute either 0 (within 1σ), 1 (value is >1σ but <2σ) or 2 (value is >2σ) to the total summed score, which can range from 0-8 given the 4 metrics.
Calculating the scores for all 1,484 days I used the Oura Ring for and visualizing it as a histogram gives the image on the right. As one would expect, the vast majority of days have a score of 0, meaning all metrics are within the first standard deviation. But (as also expected), it shows that there's a small number of days that are clear outliers where scores go up to 8, and the upper limit of the 2σ the resulting distribution is a score of 3, with 123 days scores at least as large (and the 3σ boundary being a score of 4 or larger, with 61 days falling within that).
Are those scores and their boundaries useful?[edit | edit source]
Okay, so for now we've just played around with numbers, but do those scores actually mean anything? So, I went ahead and extracted all the dates with a score of 3 or higher and did some spot checks against my calendars, emails, Slack and other chat histories to see if those days were indeed days during which I probably felt not great for some reason.
And overall it worked quite well! For many of the days that I extracted that way I could find that I was either sick (coming down with a cold, having COVID, etc) or having done international trips and being jet lagged. For other days there wasn't any clear indicator in my historic records on whether I was indeed feeling not great that day, but it's hard to know if that is evidence of absence or absence of evidence. But: Once I looked at only days of score 4 or higher it seemed that the rate of finding evidence grew quite a bit.
Conclusions[edit | edit source]
Overall, this "scoring" approach seems to work in principle, even if I might have to tweak the cutoff/boundary values a bit. But what good is that score? To actually make use of it, I went ahead and updated the little script that populates my website footer, to display the overall values for the current day. Which means I can now sync my Oura ring in the morning and then check my website to see what the predicted day looks like: Will I feel fine (score <3), maybe a bit under the weather (score between 3-4) and likely a bit under the weather (score >4). Time will tell if this is more useful than my own mental heuristics.