Strava Suffer Score decoded
Strava recently debuted its "Suffer Score", which attempts to quantify in one way how hard an activity was. Suffer score, they claim, is based on heartrate: ride further or harder and suffer score is higher.
Suffer score is a good move for Strava. Strava's market segment is informal competition. Other web sites have logged how far people ride, and where, but Strava really locked into the demand for competition: competition via social networking. To date these rankings have been based primarily on speed over "segments": routes defined by users, for example on roads or trails, typically up climbs. They then added contests for volume: most miles ridden in a week and most feet climbed, for example. But with Suffer Score, they combine the two: a metric combining both quantity and quantity.
Why's this important? Of course not everyone can climb fast enough to compete for KOMs on popular climbs. But a heartrate-based metric levels the playing field to a large extent. Anyone who's been riding regularly for long enough can go out with the goal of generating an "epic" suffer score for the day.
Suffer score is an obvious correlary with the Coggan "training stress score" (TSS). TSS is an attempt to quantify the training stress of a ride: it's effect on fatigue and its stimulus for physiological adaptation. That both of these can be captured with the same simple metric is far from obvious, but TSS is a blunt instrument, and its popularity among hardcore power meter fans proves people find it useful.
But Strava's focus isn't on hard-core training junkies. It's on the typical Mission Cycling or SF2G rider: people who like to ride, and when they ride like to ride quickly, and as a consequence of this quick riding tend to acquire fitness. However, the goal of every ride is still the joy of the ride, not strictly to improve fitness. So "suffer score" is a "don't take me quite so seriously" number by which long-hard-rides can be compared. "Pain is good", it suggests, not only for it's "training stress".
The big question, however, is how Suffer Score is calculated? To test this, I used a Perl script to generate ride data at constant heartrate. My "rides" consoisted of perfect 1 km radius circules in the Bonneville Salt Flats ridden at a perfect 10 meters per second. Each ride had a different heart rate, perfectly constant, or a different duration.
First I tried using the GPX file format for this purpose, but Strava wouldn't digest the heartrate numbers. So I switched to TCX. This worked nicely.
Here's one of my rides:
From a few tests, I was able to guess the following formula was used for Suffer Score:
Suffer score = K1 t1 + K2 t2 + K3 t3 + K4 t4 + K5 t5
where:
t1 = time in hours in zone 1
t2 = time in hours in zone 2
t3 = time in hours in zone 3
t4 = time in hours in zone 4
t5 = time in hours in zone 5
With coefficient roughly equal to the following (may be off by 1/hr):
K1 = 12/hr
K2 = 24/hr
K3 = 45/hr
K4 = 100/hr
K5 = 120/hr
I like this approach, although I'd be tempted to increase K5, for example to 200. Time in Z5 is very, very painful. Of course this depends on having a good number for maximum heart rate, which may not be the case. In fact a geometric progression would have worked well here: 12, 24, 48, 96, 192. I think this would have helped the criticism I've been reading that it's too endurance-focused.
Suffer score is a good move for Strava. Strava's market segment is informal competition. Other web sites have logged how far people ride, and where, but Strava really locked into the demand for competition: competition via social networking. To date these rankings have been based primarily on speed over "segments": routes defined by users, for example on roads or trails, typically up climbs. They then added contests for volume: most miles ridden in a week and most feet climbed, for example. But with Suffer Score, they combine the two: a metric combining both quantity and quantity.
Why's this important? Of course not everyone can climb fast enough to compete for KOMs on popular climbs. But a heartrate-based metric levels the playing field to a large extent. Anyone who's been riding regularly for long enough can go out with the goal of generating an "epic" suffer score for the day.
Suffer score is an obvious correlary with the Coggan "training stress score" (TSS). TSS is an attempt to quantify the training stress of a ride: it's effect on fatigue and its stimulus for physiological adaptation. That both of these can be captured with the same simple metric is far from obvious, but TSS is a blunt instrument, and its popularity among hardcore power meter fans proves people find it useful.
But Strava's focus isn't on hard-core training junkies. It's on the typical Mission Cycling or SF2G rider: people who like to ride, and when they ride like to ride quickly, and as a consequence of this quick riding tend to acquire fitness. However, the goal of every ride is still the joy of the ride, not strictly to improve fitness. So "suffer score" is a "don't take me quite so seriously" number by which long-hard-rides can be compared. "Pain is good", it suggests, not only for it's "training stress".
The big question, however, is how Suffer Score is calculated? To test this, I used a Perl script to generate ride data at constant heartrate. My "rides" consoisted of perfect 1 km radius circules in the Bonneville Salt Flats ridden at a perfect 10 meters per second. Each ride had a different heart rate, perfectly constant, or a different duration.
First I tried using the GPX file format for this purpose, but Strava wouldn't digest the heartrate numbers. So I switched to TCX. This worked nicely.
Here's one of my rides:
From a few tests, I was able to guess the following formula was used for Suffer Score:
Suffer score = K1 t1 + K2 t2 + K3 t3 + K4 t4 + K5 t5
where:
t1 = time in hours in zone 1
t2 = time in hours in zone 2
t3 = time in hours in zone 3
t4 = time in hours in zone 4
t5 = time in hours in zone 5
With coefficient roughly equal to the following (may be off by 1/hr):
K1 = 12/hr
K2 = 24/hr
K3 = 45/hr
K4 = 100/hr
K5 = 120/hr
I like this approach, although I'd be tempted to increase K5, for example to 200. Time in Z5 is very, very painful. Of course this depends on having a good number for maximum heart rate, which may not be the case. In fact a geometric progression would have worked well here: 12, 24, 48, 96, 192. I think this would have helped the criticism I've been reading that it's too endurance-focused.
Comments
To be fair, then did mention TRIMP in the support forum. So they're not practicing active deception (benign neglect if anything). Not sure about the TSS descriptions.
I still need to check the formula against time gaps in the ride to see if they're doing any time averaging. So far I checked linearity only against rides of constant HR. Spent too much time debugging my ride data generation script.
I won't judge your coding, I just want to save myself time from doing fun experiments like these on my own with Strava.
I completely agree with giving zone 5 a much higher score, and I like the idea of the geometric progression, so that's how I included it in my personal workout analyzer script:
k1...k5 is 12.5, 25, 50, 100, 200
while the categories are
leisurely 0-49
moderate 50-99
tough 100-199
very hard 200-399
mind-blowing 400-
It is really a pity that there are basically no Strava users in Europe... :(
Why can't Strava just give us a TSS and IF score. And ideally all the analysis you get in WKO+ for a "super premium" membership fee?
There's currently very little you get from Strava premium. Most people I know pay cos they think they should rather than for what Strava provides. If they want to drive premium membership then they need to be looking to add significant functionality for the growing numbers of club cyclists. To my mind these are the people who will pay...if you just enjoy riding your bike then why go premium?
My ideal product would be trainer road, something akin to WKO+ all integrated with Strava.
Its funny the comment about no one being on Strava in Europe. It seems to be hitting a tipping point here in the UK.
GoldenCheetah has some Strava integration. I've not followed it, but I suspect it does what you want. Try that out...
Strava has a simple API which makes it easy for apps to upload or download rides to Strava accounts. This makes it fairly easy to implement alternative front-ends. It will become simpler when version 3 of the API comes out within the next few months.
For example, I'd like to do an app to extract critical power curves from Strava rides. It's easy to do for one ride, harder if you want some sort of global curve. But GoldenCheetah already offers this capability.
Thanks for the great write-up!
Any ideas about the Out and Back issues? I have emailed the company and there seems to be no fix in sight. Instead, people cut the course short and get outragous speeds. We really have about 80km or good riding in Ho Chi Minh City where we can really just let it out. So, this error is a bit of a shame!
thanks!
On the out-and-back problem I have spoken to Strava in person about that and I expect it will be solved eventually. The problem is that the matching between the start and end point is relatively loose. So if you do an out-and-back, and match the start and finish (the same point), then if you have visited 80% of the points in between (80% of the route, cutting short 20%), then it might match you. What they need to do is to add in special checkpoints which must be matched in addition to the start and finish. For an out-and-back that would be the turn-around point. I had expected they would have done this by now but I think their priorities have been elsewhere, for example on handling the enormous number of new users.
I recently ran a 10 km race and it gave me credit for the 10 km race segment using only 8 km of my data: after 8 km I passed close to the finish line and it concluded I had matched the segment. So my time for that segment was extremely good... same problem.
where:
t1 = time in hours in zone 1
t2 = time in hours in zone 2
t3 = time in hours in zone 3
t4 = time in hours in zone 4
t5 = time in hours in zone 5
With coefficient roughly equal to the following (may be off by 1/hr):
K1 = 12/hr
K2 = 24/hr
K3 = 45/hr
K4 = 100/hr
K5 = 120/hr
ok... but hr means the total of hours spent in the exercise??
so if k1= 12/hr
and hr means the time spent in the zone and then i multiply for t1 that is time spent in zone 1... the in the final i have just 12+24+... because the hr cut t and just leave the score for each zone??
I know that some of my cal is not correct, but what??? pls give an example!
K1 t1 + K2 t2 + K3 t3 + K4 t4 + K5 t5
where:
t1 = time in hours in zone 1
t2 = time in hours in zone 2
t3 = time in hours in zone 3
t4 = time in hours in zone 4
t5 = time in hours in zone 5
With coefficient roughly equal to the following (may be off by 1/hr):
K1 = 12/hr
K2 = 24/hr
I agree with thehomme and yourself: time spent in z2 should have less incidence on suffer score and time spent in z4 and z5 should be even higher.
Some fairly easy endurance long runs get higher SSS than tempo runs and hill repeats.
the results are very close to strava em endomondo
http://www.ihpva.org/HParchive/PDF/hp48-1999.pdf
calories =(((2,706*total weight in kg*Velocity kph*%elevation)+(1,247*10^(-2)*Cda*(velocity kph+wind kph)^2*velocity kph)+(2,706*Crr*total weight in kg*velocity kph))/0,95)*3.90265912226099*time hrs *2
Watts = Callories* 1000 / 3600
crr for mtb = 0,0046
Cda = 1 * 0.0293 * (Height in mts ^ 0.725) * (Pweight kg ^ 0.425) + 0.0604 + 0.2645
But the training score, fitness, and fatigue are very similar to CTL, TSB, and ATL from TrainingPeaks. Those parameter names are trademarked. GoldenCheetah has similar metrics. The issue is you need to use a power meter every ride. I didn't use one during the Berkeley Hills Road Race, a considerable physical stress, and so that shows up as a total rest day in my metrics. It takes months to flush that omission from my scores.
At GoldenCheetah I proposed an algorithm that a regression could be done on distance and climbing of existing rides to estimate these scores for riders without power data. Strava could also use estimated power. Anything is better than assigning zero score to a ride without power meter data, assuming there's no data from car or train rides, for example, contaminating these.
I am confused. If T1 is equal to the number of hours in zone 1 and HR is equal to the number of hours in zone 1, then T1 = HR.
So, for axample (and examples are sorely needed), if I walk 30 minutes in zone 1 then T1 = .5 and K1 = 12/.5 so T1 * K1 = 12
If I were to specify time in minutes instead of hours then I'd need to multiply by a unit conversion factor, for example (1 hour / 60 minutes).
This is common in physics. For example, if I have a velocity (units distance/time) and multiply it by a time (units time) the times cancel and I'm left with distance, which is what I want for riding a particular speed for a particular time. When I put the multiplier in units 1/hr, you're guaranteed to get the correct result.
It's always important to keep track of units. Suffer score, in order to be simple to understand, is presented without units: you can't say "my suffer score was 100 hours" or "my suffer score was just over 4 days" or "6000 minutes".... it's just 100.
Nice interesting article!
Your decoded SS formula seems to work well for bike rides (http://www.strava.com/activities/213873617/heartrate)
But I'd say Strava calculates SS differently for running, see for example this workout:
http://www.strava.com/activities/215099305/heartrate
Only 25 minutes in Z4 and 15 in Z3 got me SS of 130.
Could You please also try to decode running SS?
I'm also pretty sure I have zones set about right. I'm estimating my 1 hour max HR(FTP HR) to about 161 in it is in the middle of Strava's Z4(156-167), and getting into Z5(>167) is very hard (on bike I've been there only few times). Getting over 170 for me is "suffer as hell" :)
It doesn't really matter whether You were running or cycling or doing something else - You got Your "pump" (Your heart that is) working hard. In this regard different activities could potentially be compared in terms of how much stress they caused to You heart.
Unfortunately Strava obviously doesn't have the same view on SS, because it is a lot harder (in terms of heart stress) to get high SS in cycling then it is in running.
Some kind of normalized SS would be much more informative if You could (provided You have Your zones set correctly) only get SS of maximum around 100 in one hour - that would correlate with FTP power/Lactate Treshold.
You could get Your heart working harder for shorter time, of course, or maintain hours of less stress, but getting over 100 in an hour would mean, You got Your zones set too low...
In fact according to my experiences getting SS for Cycling over 100 in an hour is almost impossible for me, but for running i can get over 250 in less then an hour...
I would like to be able to train and go for a run and do static exercises (e.g. Squat Jumps) and then continue running. However, currently my heart rate for the period of time spent doing squat jumps is not contributing to my suffer score :(
Any ideas?
Sorry to come so late to this conversation, but I just noticed that my Strava suffer scores for long rides seem way higher than other riders I know on similar rides, and in searching for info, I found your blog.
My first thought about your analysis is that since heart rate is being averaged into five groups, the algorithm sure throws away a lot of information. Imagine a similar algorithm with an increasing number of zones. Loosely speaking, "in the limit" as the number of zones gets bigger, all we are really doing here is counting heart beats.
So why not just count heart beats, maybe with some clever transformations? For example, if you ride for an hour and your average heart rate is 150 bpm, your heart beat 9,000 times. If your resting heart rate is 60 bpm, that's 3,600 beats per hour, and you could subtract that to arrive at a figure of 5,400 excess beats per hour.
Better still, just count the gaps between heartbeats, since over any give time interval, the number of gaps is just one less than the number of beats. Beats are more or less instantaneous, while gaps vary--higher pulse rates mean shorter gaps.
You could even construct a stress score that counts gaps, and weights the shorter gaps more heavily (with some sort of continuous transformation). If your resting heart rate is 60 bpm, than the gap between beats is one second, and you could assign a weight of zero to any gap one second or longer. Of course, if you are dead, by definition your stress score would be zero. Just kidding.
All fancy math aside, the point I'm trying to make is that the Strava suffer score, underneath it all, is about counting heart beats, and just what you can do with that sort of information opens up some interesting questions.
Zone 1 - 30
Zone 2 - 60
Zone 3 - 120
Zone 4 - 240
Zone 5 - 480
Let me know if you think its right!