Elevate: Possibly wrong TSB zones in PMC/Fitness Trend if using HR instead of FTP

Created on 21 Feb 2017  ·  49Comments  ·  Source: thomaschampagne/elevate

Ever since you added the Training Stress Balance zones recommended by Joe Friel over at TrainingPeaks they seemed a bit off to me, especially compared to his charts. Then I reasoned that it might be because of yours using TRIMP if no power meter is available. The problem is that Training Stress Score, calculated with power, is significantly smaller and therefore the zones are in a faulty ratio. In the picture below you can see my excel chart. The one at the bottom where I estimated my TSS looks much more like I really felt after the workouts.
Please notice that in my calculations I have divided my actual TRIMP by 1,67. I do not think however that this number is perfect for estimating a TSS. I just wanted to give a slightly exaggerated example on how the zones would look closer to reality.

I hope there are no errors in my calculations, I just wanted to inform you of this oddity.
Also I want to thank you again for your marvelous extension!

trimptss

enhancement watch

Most helpful comment

@TehFinal @shutema @jayti74 @Dan4GitHub @igarciaolaizola

I finished support of Default LTHR, Cycling LTHR & Running LTHR before sleeping. Here is a new build including this : v6.0.3_stable_2018-03-30-11-22.zip

I finally kept Option A: Cycling LTHR = Running LTHR = Default LTHR when empty.

Indeed after analysis of a history backup from a pro cyclist of FDJ team: The HRSS and PSS values on most of his activities were pretty close using ONLY Default LTHR = RestHR + 0.85 x (MaxHR - RestHR).

Note: He rides with an HRM and real power meter.

If i used Cycling LTHR = RestHR + 0.75 x (MaxHR - RestHR) HRSS scores were to different from his PSS scores.

Like a said earlier Explaining this change/improvement to users is a BIG challenge. So i rewrote some helpers;

I'm french, so feel free to fix my english or sentence confusion.. with pull request on listed files (You can edit them directly in github).

Thanks for your help!

All 49 comments

@TehFinal Nice investigation ! Thanks for this feedback.

I can say you right. I experiment same ratio difference between TRIMP or Cycling Power. On strava premium fitness it seems to be the same (about you?)

I don't have the real answer to this at the moment. We had to find people able to find the response. Did you do the test inside Golden Cheetah (free)? Training Peaks? WKO?

Thanks !!

Tom

Sadly I don't own a powermeter to do some advanced testing, all I did was finding a clue and tweaking some numbers in Excel to give me a better picture of the difference between the two methods. I will try contacting Joe Friel, maybe he can shed some light on this topic.

Hi folks,
for me it looks also, that the calculated ride TRIMP (without cycling power meter data) might be too hight. The factor in the Multisports Fitness Trend table varies roughly between 1.7 and 3 (mostly TRIMP is two times higher than the power meter based PSS).

Do you like to get sample files containing power meter and HRM data?

@thomaschampagne: Great multisports fitness tool!!

Interesting to hear from someone with accurate data! This means that one can estimate the fitness zones to be between 1.7 and 3 times higher than by calculating it with TSS. After contacting mister Friel I came to the conclusion that TRIMP is, after all, just not precise enough to be used in the PMC (thanks to fluctuating heartrate).

Thx for the investigation. What could be the solution? Create custom horrizontal zones ? Other?

Since a direct conversion from TRIMP to TSS isn't possible the best solution would probably be to deactivate them if the chart gets calculated with TRIMP.

Seems to be a solution ;) We could find/calculate new zones limits values
if only trimp is activated.

To sum up Zones will be inactive if trimp and cycling power are both
present in chart.

What do you think?

On Fri, Apr 14, 2017, 11:04 TehFinal notifications@github.com wrote:

Since a direct conversion from TRIMP to TSS isn't possible the best
solution would probably be to deactivate them if the chart gets calculated
with TRIMP.


You are receiving this because you were mentioned.

Reply to this email directly, view it on GitHub
https://github.com/thomaschampagne/stravistix/issues/341#issuecomment-294120918,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AAJRpaLMhHcAQjmVHq6-4Lb61_AxiBqBks5rvzalgaJpZM4MHx_z
.

>

Thomas Champagne
http://thomaschampagne.github.io

Maybe a deeper look into the STRAVA freshness chart could help. STRAVA premium has an option for showing a mixed chart, basing on both data types, HR and power meter. It would be interesting, how STRAVA is mixing the two.

For me the mixed chart is very important, because I've got three bikes but only one is equipped with a power meter.

If you like to get some sample files, containing power meter and HR data, just contact me.

I have premium and strava has same results with same ratio between Trimp
and Tss score than stravistix. But strava FF doesn't have training zones.

On Fri, Apr 14, 2017, 21:58 Dan4GitHub notifications@github.com wrote:

Maybe a deeper look into the STRAVA freshness chart could help. STRAVA
premium has an option for showing a mixed chart, basing on both data types,
HR and power meter. It would be interesting, how STRAVA is mixing the two.

For me the mixed chart is very important, because I've got three bikes but
only one is equipped with a power meter.

If you like to get some sample files, containing power meter and HR data,
just contact me.


You are receiving this because you were mentioned.

Reply to this email directly, view it on GitHub
https://github.com/thomaschampagne/stravistix/issues/341#issuecomment-294224797,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AAJRpenj9Tz2qeExK3H2k8hDhqrWs533ks5rv8_fgaJpZM4MHx_z
.

>

Thomas Champagne
http://thomaschampagne.github.io

@thomaschampagne I think that is a good solution, although people have to keep in mind that TRIMP just isn't as accurate as TSS because if you are sick or it is cold/hot outside your heartrate in relation to power might be completely off (compared to riding under normal conditions).

For me personally, the zones work fairly well when relying solely on TRIMP. I'm tired when I end up in the overtraining zone after a ride and I have great legs when I start my ride in the freshness zone. However, I also see the problem in mixing up TRIMP and TSS without scaling since TSS is much lower.

I support the idea of scaling down TRIMP with a customizable factor. Initially, that should be set to the TRIMP value of one hour at FTHR (or 85% HRR as suggested by @TehFinal) divided by 100. The zones should also be customizable since they are more a rule of thumb than strict science according to Joe Friel.

Please don't get rid of the zones. Even slightly inaccurate zones provide a better understanding of the Fitness-Fatigue-Model's application than no zones at all. It's a crucial feature that Strava's fitness model is missing.

I think that there is a relatively simple solution to this problem. It is necessary to scale the TRIMP to an equivalent to the PSS, or TSS (as TrainingPeaks calls it).

By definition, a one hour effort at FTP gives a PSS (or TSS) of 100.

With one additional piece of information – the Heart Rate at FTP – we can calculate the TRIMP for one hour at the FTP heart rate. (There are a number of ways to estimate the heart rate at FTP with only a heart rate monitor, a stopwatch and a lot of sweat.)

Calculate TRIMP for one hour at FTP heart rate as follows:

  1. %HRR@FTP = (Heart Rate at FTP – Min HR)/ (Max HR - Min HR)
  2. 1hr FTP TRIMP = %HRR@FTP x 0.64 x EXP(1.92 x %HRR@FTP)*60 (using factor for males; for 60 minutes)

Example – my values:

  1. Max HR: 185
  2. Min HR: 60
  3. HR at FTP: 163
  4. %HRR@FTP = (163-60)/(185-60) = 82.4%
  5. 1hr FTP TRIMP = 82.4% x 0.64 x EXP(1.92 x 82.4%) * 60 = 153.94

Then it is easy to scale the exercise TRIMP to a hrPSS/ hrTSS value:
hrPSS = Exercise TRIMP/ 1hr FTP TRIMP *100

Example:

  1. TRIMP for my session on 12 August 2017 from StravistIX: 333
  2. hrPSS = 333/153.04 x 100 = 216.32

Note that an hrPSS is always going to be less accurate than a calculation based on a power meter, something that is also made clear in TrainingPeaks. But I do believe that an hrTSS is better than a TRIMP, as it is comparable between different athletes, conceptually easier to understand and takes account of changes in fitness levels that alter the FTP heart rate.

Thank you for the instructions, shutema. I think I will implement this into my Excel sheet!

Its a pleasure TehFinal. Let me know how it works for you.

I would like to show you my data:
1st screenshot with TRIMP
bildschirmfoto 2017-10-30 um 12 00 19
2nd with PSS
bildschirmfoto 2017-10-30 um 12 00 24

i'm using a powermeter since 29th september. Is there a solution to equal the pmc trimp and pss calculation in stravistix maybe on @shutema's approach? or by implementing hrTSS which scales down to be comparable to tss, like @duhlig said.

So the user has to fill up a "1hr FTP TRIMP" new setting (in athlete settings) to provide hrPSS values instead of TRIMP values when PSS toggle is on?

No, the user should enter a "Threshold Heart Rate" in the athlete settings. The system can then calculate the 1hr FTP TRIMP.

i think we should do some research before. i tried different approaches with my data of the last 10 rides > 1hour. i attached the result.

TrainingPeaks hrTSS shows the best performance. Maybe we can find out how they calculate hrTSS it's not fixed. the quotient varies from 1.1 to 1.9 in this case. i also tried @shutema (1hr FTP Trimp quotient) and @duhlig approach (quotient 1,65)
bildschirmfoto 2017-10-30 um 15 24 24
tss_hrTss_trimp.xlsx

Thanks for the data @jayti74, interesting comparison.

Meanwhile, I even went down to a conversion factor of 1,43 (=80%HRR with 180 max, 43 min). That seemed to fit better with my own perceived exhaustion in comparison to the model. However, I also think that getting the exact value down for everyone is neither easily possible nor necessary for various reasons:

  1. The differences between a conversion factor of 1,4 - 1,7 (~80-85%HRR) in the model are minor. They only stretch the peak zones (overtraining, freshness) while the important zones (optimal, neutral) are hit regardless of the conversion factor.
  2. TRIMP and therefore hrPSS are inaccurate to describe the workload. Heartrate varies much more than power with outside conditions, exhaustion (both on long rides and in hard training blocks), excitement and more. A single conversion value will hardly ever work.
  3. FTHR is different from person to person. Not only the absolute value but also the relative value (%HRR). Also, I guess for most people the max HR is an educated guess, too.

Thus, I agree with @shutema. Let the user set his FTHR and calculate the conversion factor from that. Default it to some value between 80-85%HRR if max and min HR are known. Users that sometimes train with and sometimes without power will be able to experiment with their FTHR setting such that hrPSS ~ PSS.

Hi jayti74
By definition, 1 hour at FTP gives a TSS of 100, so dividing the TRIMP by the 1hr FTP TRIMP and multiplying by 100 is conceptually the correct approach.

There are a number of different methods of calculation of TRIMP. If the training peaks hrTSS provides a better approximation to power meter based TSS, then training peaks must use a more accurate TRIMP calculation.

However, 10 samples from a single athlete may not be a large enough sample size to determine which TRIMP calculation is the most accurate.

Also note that no matter how good we get a TRIMP calculation, it is never going to get close to the accuracy of a power meter at calculating TSS.

Hi @duhlig and @shutema,

thank you for your replies. I think that's the right way to go. Users should set their FTHR, also known as LTHR (Friel), the conversion factor should be calculated and applied to TRIMP, where no TSS is available.

I advocate all the mentioned points. My average conversion factor from about 30 rides is also about 1,4 :P . I know what the definition of TRIMP is and that @shutema approach is absolutely correct, just wondered how TP calculates hrTSS, which seems more or less accurate. That 10 samples from a single person are not accurate is obvious. I just wanted to show what i found out quickly about the different approaches for my data.

I appreciate that @thomaschampagne added this to Milestone 5.13. Thanks in advance.

@TehFinal @shutema @jayti74 @Dan4GitHub I will dive into that in upcoming days. Do you know where i can find the hrTSS formula?

I will test both solutions on my side:

  • hrPSS from @shutema
  • hrTSS (need formula)

Cheers,

Tom

After some search all I could find was this link:
https://www.trainingpeaks.com/blog/power-training-levels/

In table 1 heartrate and power zones are being compared. In zone 4, which is Lactate Threshold and 91-105% around your FTP your heartrate should be around 95-105% of your functional threshold heartrate.
You can get your threshold heartrate relatively precisely by doing an FTP test but as we can see above the variations add together and could be off for up to 10% (e.g. your lower end Lactate Threshold zone might be at 91% of your FTP yet your threshold heartrate could be at 105% - if I'm interpreting the table correctly and I'm not too sure about that).

Eventually we hate to accept that there is some natural variance using heartrate. Even if your threshold heartrate is set hundred percent correctly, if on that particular day you have been drinking too less or a coffee, some alcohol or are hungry or who knows what, your heartrate will be off.

To conclude, your data might be precise but inaccurate. In my opinion, @shutema 's approach is suited best.

@TehFinal Thanks ! I finally found a hrTSS formula on this link

To sum up, this suunto app do this:

LTHR = 0.86 * MAX_HR; // OR Use custom LTHR/FTHR
hrTSS = ((DURATION * (AVG_HR - USER_REST_HR) * ((AVG_HR - USER_REST_HR) / (LTHR - USER_REST_HR))) / ((LTHR - USER_REST_HR) * 3600)) * 100;

To conclude, your data might be precise but inaccurate.

You're speaking about hrTSS?

Btw, i will follow your advices and start with @shutema 's approach (hrPSS) referenced by him here: https://github.com/thomaschampagne/stravistix/issues/341#issuecomment-322047898 and ask the user to enter a LTHR/FTHR in athlete settings

I will write some specifications in your top comment. I have to make clear on some points like:

  1. Do we keep PMC chart based on TRIMP only? Or only hrPSS?
  2. If training zones are enabled, then only PSS and/or hrPSS can work together.
  3. PSS has priority on hrPSS? (my answer is yes)
  4. Any others cases?

Also in future i will add estimated PSS, and rTSS (running TSS) in that fitness trend for people having no sensors at all (e.g. smartphones only).

Open to any discussions to push that for real :) :)

Thanks :)

What would be the advantage of using the suunto formular over just scaling TRIMP down?

As in
hrTSS = TRIMP / ScalingFactor
ScalingFactor = 60 * HRR@LTHR * 0,64*EXP(1,92*HRR@LTHR)/100 // TRIMP for 1hr @LTHR (for men)
HRR@LTHR // Hearth Rate Reserve at Lactate Treshold Hearth Rate, e.g. 0,83

Do we keep PMC chart based on TRIMP only? Or only hrPSS?

Preferably both through a switch. Different users will have different preferences.

If training zones are enabled, then only PSS and/or hrPSS can work together.

Agreed.

PSS has priority on hrPSS? (my answer is yes)

Most definately.

Any others cases?

Would it be possible to allow users to make custom TSS entries for days when the headunit crashed or similar? Most often an educated guess about the TSS is better than a zero record screwing the PMC up for 2 months at least.

Hi Thomas
Recently you added a field for estimated Power Stress Score. This field agrees exactly to the Training Peaks calculation of hrTSS (on all the rides I have compared). Would it not be better to use that field in the fitness trend chart, rather than calculating hrTSS from the TRIMP?

@shutema I could but estimated Power Stress Score will work only for cycling

I will dive into this weekend.

What i'm supposed to ask in athlete settings? FTHR or LTHR ?

My current understanding about this is:

  • FTHR is determined over 60 minute of test.

  • LTHR is determined over 30 minutes of test according the below joe friel's post: https://www.trainingpeaks.com/blog/joe-friel-s-quick-guide-to-setting-zones/

    To find your LTHR do a 30-minute time trial all by yourself (no training partners and not in a race). Again, it should be done as if it was a race for the entire 30 minutes. But at 10 minutes into the test, click the lap button on your heart rate monitor. When done, look to see what your average heart rate was for the last 20 minutes. That number is an approximation of your LTHR.

I would ask for LTHR. it should be very close to fthr under raceconditions and there is less psychological stress while testing. Which will result in doing the test at all. I never managed to do a one hour all out test.

Am 15.03.2018 um 14:41 schrieb Thomas Champagne notifications@github.com:

I will dive into this weekend.

What i'm supposed to ask in athlete settings? FTHR or LTHR ?

My current understanding about this is:

FTHR is determined over 60 minute of test.

LTHR is determined over 30 minutes of test according this joe friel: https://www.trainingpeaks.com/blog/joe-friel-s-quick-guide-to-setting-zones/

To find your LTHR do a 30-minute time trial all by yourself (no training partners and not in a race). Again, it should be done as if it was a race for the entire 30 minutes. But at 10 minutes into the test, click the lap button on your heart rate monitor. When done, look to see what your average heart rate was for the last 20 minutes. That number is an approximation of your LTHR.


You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub, or mute the thread.

I would also ask for LTHR and mention Joe Friel's protocol. Another one you might want to mention is the 2x8min protocol of Carmichael & Rutberg who establish LTHR at ~95% of the higher of the two 8 minute efforts (see: CTS Field Test). Although Allen & Coggan mention FTHR in _Training and Racing with a Powermeter_ there is no exact protocol how to establish it, not even an exact definition for the duration of FTHR. In reality the difference between the two numbers should be negligible for establishing hrPSS.

You can have a look how they calculate TRIMP(100) at GoldenCheetah in order to align TRIMP values with TSS/BikeScore
https://github.com/GoldenCheetah/GoldenCheetah/blob/master/src/Metrics/TRIMPPoints.cpp#L117
https://github.com/GoldenCheetah/GoldenCheetah/wiki/UG_Glossary

@igarciaolaizola Thanks for your links i will read that.

@TehFinal @shutema @jayti74 @Dan4GitHub @igarciaolaizola

I started development on branch: https://github.com/thomaschampagne/stravistix/tree/feature/341

If you want, i will notify you once something is ready to be tested (with dedicated builds)

@thomaschampagne Have you thought about having different LTHR values for different sports?
BTW I'll be very interested in testing this :)

@igarciaolaizola Could me provide infos about this?

3 LTRH?

  • 1 Default?
  • 1 Overrride cycling?
  • 1 Overrride running?

ty

LTHR for cycling and running can be enough (I've never seen LTHR values for swimming) and having two different values is important since they normally differ a lot.
LTHR can be calculated through a lactate lab test or estimated with a field time trial. In my case I use the following estimation for field trials: 0.95 x Average HR from a 20' test. I have taken this estimation from Joe Friel's book "The Triathlete’s Training Bible 4th ed".

These were my last tests values:

  • Run: January Lactate Lab test LTHR value: 172bpm
  • Run: February Field LTHR estimation: 161bpm
  • Bike: February Field LTHR estimation: 141bpm

There is a difference of 20bpm between my Run an Bike field tests.

A default value could be another option, but I don't know how it could be estimated. Maybe with a derived value from min/max HR.

@igarciaolaizola Thanks for the note. I will implement running and cycling LTHR. I currently have only 1 LTHR on the feature branch. And i currently ask user to set it along that note:

The LTHR is the point, above which, increased blood acidification occurs in your body. Above this threshold your endurance performance will rapidly decrease.
To find your LTHR do a 30 minutes Time Trial alone. Perform this TT like if it was a race. At 10 minutes elapsed into the test, start measuring your heart rate until the end. When done, check your average heart rate on these last 20 minutes. This value is your LTHR.

I think i need to have a default for other sport than cycling or running. How this is handled on training peaks? Golden Cheateah?

@TehFinal @shutema @jayti74 @Dan4GitHub @igarciaolaizola

So here's is a preview build with functional implementation of HRSS/TRIMP switching mode.

v6.0.2_stable_2018-03-17-18-04.a7b593f1.zip

Just focus on radios button to switch between "heart rate stress score" and "training impulse".

And forget UI & inputs possibilities/constraints, ... helpers, ... it's not ready yet

Note: You can set your LTHR in athlete settings.

@thomaschampagne Golden Cheetah has plenty of different metrics but some of them don't apply for all sports. TRIMP(100) shows a non-zero value only for Run and Bike activities (since you can only add LTHR values for these sports). There are also different PMC charts (depending on base metrics).

If you want a default LTHR value you can use a percentage of your heart rate reserve (Max HR - Rest HR).
LTHR = RestHR + 0.85 x (MaxHR - RestHR)
However, I am not sure if 85% is the best value for the formula.

@igarciaolaizola So for a default LTHR i have to replace:

LTHR = 0.86 x MaxHR (currently coded with that)

by

LTHR = RestHR + 0.85 x (MaxHR - RestHR)

?

@thomaschampagne Yes, but it is only a suggestion! In case you want to search for references this is called the Karvonen formula.

@TehFinal @shutema @jayti74 @Dan4GitHub @igarciaolaizola A new test build is available here:

v6.0.3_stable_2018-03-24-15-09.zip

i had time to look into the latest test build. i have to say that i really like what i am seeing there. thanks @thomaschampagne. the values for HRSS are now pretty close to PSS. they differ a bit from trainingpeaks hrTSS but are sometimes closer to TSS than the values from tp. good job. after my bike including my powermeter was stolen two weeks ago this feature is more welcome than ever 💃

In case of the estimated LTHR @igarciaolaizola 's LTHR = RestHR + 0.85 x (MaxHR - RestHR) works much better for me. it's only 2bpm off my measured lthr. if i use LTHR = 0.86 x MaxHR i am 8bpm off from my measurements. i don't know how this correlates with measurements of other people.

there is one thing i noticed. after triggering the "Use cycling power meter whean available" radios button the values in the upper right don't change for today. i have to put the mouse over the graph to show the latestnumbers.

PS: i can only talk for cycling...

@TehFinal @shutema @jayti74 @Dan4GitHub @igarciaolaizola

Here is my last test build before dropping it on stravistix club: v6.0.3_stable_2018-03-29-16-48.zip

Explaining this change/improvement to users is a BIG challenge. So i rewrote some helpers;

I'm french, so feel free to fix my english or sentence confusion.. with pull request on listed files (You can edit them directly in github).

If you have history with cycling power data and heart rate data. A backup is very welcome so i can do some test on my side (i don't have a power meter).

Thanks for your help!

@thomaschampagne great job! The PMC chart looks much better now.
However, triathlon users without a power metter (like me) will still need to choose between introducing running LTHR or cycling LTHR. One way cycling scores will be very low and the other way running scores too high.

@igarciaolaizola I will implement it asap

Do you confirm we should have

  • Default LTHR
  • Cycling LTHR
  • Running LTHR

?

@thomaschampagne In my opinion that will be good enough. Cycling and running are the most common sports measured by heart rate and having a default LTHR will also be helpful for corner cases (people practicing other different sports, kayaking or rowing for example).

@igarciaolaizola One more...

At this point if no defined LTHR then Default LTHR = RestHR + 0.85 x (MaxHR - RestHR)

But what's the default values of Cycling LTHR? Running LTHR?

  • Option A
    Cycling LTHR = Running LTHR = Default LTHR ?

  • Option B
    Cycling LTHR = RestHR + ??? x (MaxHR - RestHR)
    Running LTHR = RestHR + ??? x (MaxHR - RestHR)

Which factor behind ??? ? Any idea?

For Option B I will maintain a 0.85 factor for running and a lower factor for cycling, 0.75 maybe. This 0.10 lower will decrease around 15 bpm the cycling LTHR (I think the difference between Running LTHR and Cycling LTHR is around 10-20 bpm)

@TehFinal @shutema @jayti74 @Dan4GitHub @igarciaolaizola

I finished support of Default LTHR, Cycling LTHR & Running LTHR before sleeping. Here is a new build including this : v6.0.3_stable_2018-03-30-11-22.zip

I finally kept Option A: Cycling LTHR = Running LTHR = Default LTHR when empty.

Indeed after analysis of a history backup from a pro cyclist of FDJ team: The HRSS and PSS values on most of his activities were pretty close using ONLY Default LTHR = RestHR + 0.85 x (MaxHR - RestHR).

Note: He rides with an HRM and real power meter.

If i used Cycling LTHR = RestHR + 0.75 x (MaxHR - RestHR) HRSS scores were to different from his PSS scores.

Like a said earlier Explaining this change/improvement to users is a BIG challenge. So i rewrote some helpers;

I'm french, so feel free to fix my english or sentence confusion.. with pull request on listed files (You can edit them directly in github).

Thanks for your help!

Was this page helpful?
0 / 5 - 0 ratings

Related issues

rex4539 picture rex4539  ·  4Comments

puzanart picture puzanart  ·  5Comments

owenhenley picture owenhenley  ·  7Comments

TRIWOLF79 picture TRIWOLF79  ·  17Comments

charleswolf picture charleswolf  ·  7Comments