Monday, October 6, 2014

Lost without your powermeter

Not everyone has a powermeter on all their bikes. During winter time you probably ride a bike which is less expensive than your race bike or you do some cyclo-X training without a powermeter. However, since we all love to fill our PMC (Performance Manager Chart) to track our training load we need TSS* (A.Coggan) for our rides. But because we don’t have a powermeter on all our bikes we must have an alternative to derive our TSS.

There are some measures available in terms of training strain like TRIMPS (Bannister, 1974) or RPE (Rate of Perceived Exertion)  (Borg 1970,1998). However these measures do not relate to TSS (and no wonder because TSS is based on power). There is also a table from triathlete guru trainer Joe Friel (see Table below) in which he converts from RPE/HRs to TSS. You can also use your own experience if you do the same rides under same conditions which you registered before.

I decided to look at some of my own data to see whether I could come to a reasonable estimate. I do not register RPE (something I will start doing for next season) so I used some other data for some small analyses to derive a TSS. I used TRIMPS, TRIMP zonal score and average HR which are calculated per ride in Golden Cheetah (GC). I used average HR just as a possible extra (explanatory) variable. I did not change the weights in the zones in GC to calculate the TRIMP zonal score. The idea behind this zonal score is that when you get into higher heart rate zones there is a higher weight applied in the TRIMPS formula.
My objective was to see whether I could use the above metrics (and which was best) to relate to actual TSS. I was also interested to see how Joe Friels table matched with actual TSS. In this way I could determine which metric (method) better related to TSS. This last exercise turned out to be some more difficult than I expected. You can easily export your aggregate ride metrics data from GC, but to calculate the estimated ‘Joe Friels’ TSS (from now TSS_Friel). I had to export all my raw data files and append them. I used a macro for this task which I found on the internet (, because the problem is not appending (you could use a DOS statement for that), but to include a ride name to be able to aggregate the data per ride after derivering the TSS_Friel for each record.

I exported my metrics data (TRIMPS, etc.) and uploaded it to SAS. I cleaned the data files in which my HR monitor was off, rides with no powerdata (so no TSS to estimate), etc. I also had a few rides with TSS above 300. Since I do not do rides in winter times with TSS above 300 I excluded those data, because if I don’t do those rides it’s no use of trying to predict them. The calculated TSS_Friel were later merged to the GC aggregate file. Below some statistics w.r.t the rides.

Basically on average I do quite some rides of around 1.5 hours. My average HR is around 145 (OBLA HR is around 155) and most of the time HR is between 138-150 (89%-97% of OBLA HR).  In terms of TSS on average 111. Mind these are just averages and as such does not say that much of how TSS is generated.
Below the Pearson correlations (all significant p<0.01) between the metrics with TSS:
Average HR is least correlated with TSS (as expected of course). TRIMPS and the TSS_Friel derived metric are most correlated with TSS. In itself a correlation does not say much, only that there seems to be a relation between the two. To get a better visual sight on the relation of the metrics with TSS I ran some scatterplots depicted in the figure below  (I also included a regression spline for visual sake). I have looked at all the measures, but only two the two best related TRIMPS and TSS_Friel.
You see that the relation between TRIMPS / TSS_Friel is not linear with the actual TSS score so a linear equation is not a good idea. The R2 of TRIMPS and TSS_Friel under the above models are 0.8 and 0.83. You also see some outlier points going towards the top right corner. In the figure below you see the scatterplots of the error terms.  
The spread of the error terms seems a little larger for the TRIMPS model than for the TSS_Friel model, but both models show heteroskedasticity. Again the Friel model just a tiny better. In terms of total model error the judgement is 335 vs 376 in favor of TSS_Friel.
I also ran a model with the TRIMPS and average HR: R2 goes to 0.84 and error to 305. Statisticians would say “be parsimonious in parameters’’, because now we have 3 + 3 + 1 intercept in the model. Since I also want to keep it simple for myself I will agree on that one. In the figure below you see both model plotted in terms of model predicted TSS and actual TSS. The left one is the TSS_Friel and the right one TRIMPS.
On the whole the TSS_Friel table seems a good alternative way to estimate my TSS when not riding on your ‘powermeterbike’. In all fairness TRIMPS is not really (practically) that much worse. For my rides (so for my ‘domain’’) I however will choose to use the TRIMPS. The reason is a practical one. Because for the TSS_Friel I have to first export my ride and convert on a record level with the Friel table. This is a bit too much work and so if I impute the TRIMPS (which is automatically calculated in GC) in the equation (which I put in Excel) I immediately have my  estimatedTSS.
Of course TSS and TRIMPS won’t align and that’s not strange because they are two different things. As you get in better form your HR for producing the same wattage will go down (and vice versa for less form). Since TRIMPS is based upon heart rate is it also more variable due to extraneous influences like temperature, stress, etc. It will also give you less "credit" for supramaximal efforts (there is a ceiling effect due to maximal HR). This last remark, however can be counteracted by placing more weighting on the zonal scores (which I let on default in GC). TSS is based on power and as such more responsive.
Hopefully it gives some inspiration for your own data and this kind of estimate is good enough for you too. If you do not use have HR data (anymore) try to use RPE scores and multiply those scores by the time of your ride and see what the relation is with TSS. Maybe try some other data transformations to tweak the relation with TSS. If you are a Strava Premium Member try to use the Sufferscore to model. Maybe that gives an acceptable result too.
*TSS is a registered trademark from Trainingpeaks

No comments:

Post a Comment