Hi,
The topic of TSS keeps coming back. Various disadvantages of it were highlighted. I think it’s a shame we are still using it as it’s just so obviously bad it hurts the eyes and removes any kind of faith one can have in tools based on it. Glaring example is comparing two following workouts:
1)10m at 100% FTP, 10minutes at 0W, 10minutes at 100% FTP
2)20m at 100% FTP
The first one can easily happen on hill repeats, the other needs a higher hill. 1) is obviously easier than 2) and yet produces higherr TSS score (according to very own Intervals.icu calculator). 41 vs 33 you get 24% more TSS by introducing rest between intervals. No wonder various training protocols like 6min work, 6 min rest repeated 6 times keep popping up
Now I understand there is huge ecosystem, tools and expectations - people want TSS so one can’t change it!
The solution to this could be user defined functions or even hard-coded ones user could choose instead of TSS for their fitness table.
There are many proposed ways to improve over TSS. The most obvious one is to smooth the power function (say by calculating running 15 seconds average) then square it, then calculate the integral (area below the curve) of it. This way no matter how long you rest between work periods the result is the same because integral of 0 squared is 0 no matter how long the interval. This keeps original spirit of TSS (effort as % of FTP squared) but removes its most glaring weakness.
I am sure others proposed other improvement based on actual physiology and considerations like if 2 hours at 70% of FTP is equal to 1 hour at 100% FTP. I don’t know much about physiology but I understand mathematics better than sport physiologists (apparently).
Ok, so we can’t change TSS for masses but we can have alternatives for people who care. Maybe even let them define their own or if not that hard code some reasonable alternatives? I understand it’s a lot of work but it’s work in the area that matters a lot (measuring training stress).
EDIT:
Thanks to all the useful replies and linked resources in this thread I think I now understand both the idea and the math mistake behind Coggan’s TSS function.
Training load function that keeps original Coggan’s idea while fixing his math below:
//create a custom field and copy-paste the code to use the new training load function
{
watts = streams.get("fixed_watts").data
w30 = icu.stats.calcMovingAvg(watts, 30)
//tss - training load for the whole activity
//local_tss - training load for a chosen interval
tss = 0
local_tss = 0
//integrating is done in a simple way, implementing the trapezoidal integration doesn't
//change the results in practice (in my exprience)
for (let i = 0; i < w30.length; i++) {
p = w30[i] / icu.sportSettings.ftp
//Coggan's data suggested using 4th power here,
//other data points to 4.3 or 4.5
w = p**4.3
tss += w
if (i >= interval.start_index && i < interval.end_index) {
local_tss += w
}
}
tss = tss / 36
local_tss = local_tss / 36
//comment out the following line if you don't want to see the activity.load overwritten by the new function
activity.icu_training_load = tss
local_tss
}