[Scientific] Ideas for Improving Intensity Factor for Running

For cycling Intensity, we use Normalized Power (NP), not average power. The reason for this is that harder efforts are not linearly harder than easier efforts based on watts, but metabolically exponentially harder. However, running IF on Intervals uses Grade Adjusted Pace, but not an effort-adjusted normalized pace that accounts for the metabolically increased effort of going faster. This is obviously problematic, and the equivalent of using average power instead of NP for cycling.

There are several implementations to solve this out there, such as Normalized Graded Pace (NGP) that Training Peaks uses to calculate Running Training Stress Score (rTSS). I haven’t found a formula for NGP, but imagine it can be approximated extremely well by implementing the Normalized Power equation of sum of (30 second average powers^4)^0.25, but with 30second average Grade Adjusted Pace instead of power.

I was able to track down the formula for Gravity Ordered Velocity Stress Score (GOVSS) which is implemented by Golden Cheetah, and which incorporates xPace together with grade adjustment. xPace is defined as constant Pace which, on flat surface, gives same Lactate Iso Power. You can see how xPace is much closer in definition (assuming the implementation is correct of course) to Normalized Power but for running.
GOVSS was defined by Philip Skiba in 2006 (and based on the acknowledgements, seemingly with Andy Coggan’s help). Further studies validated that rTSS calculated from GOVSS outperforms TRIMP and other methods for estimated run performance. Golden Cheetah’s Github for implementation of xPace and GOVSS here. I actually wouldn’t be surprised if TP uses GOVSS for NGP.

Here’s the type of workout where it will really matter - interval training. This is a 5x1200 + 4x400 - I’m accumulating over 20 minutes at VO2 max or faster, but that’s being washed out by active recovery for an IF of a paltry 0.78 and a load of 64. If this used a more NP-like approach, the load would probably be closer to 75.

Here’s another example workout: 8x400 + 8x200. I accumulated 13 minutes in Z5 (of 5) and the load is obviously being under-estimated.

As someone who competes in triathlons, crit races, and foot races, it’s very difficult to have a clear sense for my fitness progression and weekly TSS as I balance cycling and running training, and running workouts are undercounted. I think there would be a huge benefit to all the triathletes here (I assume there are more mainly-triathletes than mainly-runners) to implement improvements to run-specific TSS.

4 Likes

Can’t attest to any of the metrics proposed here as I’ve only been using Intervals, but I agree that harder workouts (like intervals or long tempo runs) feel like they have their load score underestimated.

Thanks for all the links. The code implementation in particular is very helpful!

I’d like to point out that, on the Settings page, the Pace Training Load setting points to this post which suggests that Intervals uses NGP to calculate Load. Additionally, the Intensity tooltip says “For activities without power intensity is derived from the training load and duration.”, so Intervals might be using NGP for IF as well.

Interested to see what others thoughts on this are. @Luisma_Gallego_Soy_P particularly seems to be one of the more active coaches for running specific topics.

Interesting, there appears to be some inconsistency because on the tooltip for the GAP setting, it reads “Intervals.icu uses the running GAP model from Strava. GAP is used to estimate training load from pace.” Also, if you click on load within a workout, the pop-up reads "Intervals.icu can also estimate training load using heart rate and gradient adjusted pace. This insinuates that NGP isn’t implemented and GAP is used instead, and this is confirmed by further investigation.

For example, Sauce for Strava shows the GAP for a recent threshold workout the same way that Intervals has it:
image
Intervals:
image

With regards to why these paces are different: Strava has a hidden pace of 7:39 for this workout that is based off of total elapsed time instead of moving time (I had my watch paused for about 5 minutes while doing drills), and workout GAP is based off of the total elapsed time it seems. However, Intervals is taking the moving time pace of 7:29 but the elapsed time GAP of 7:24, which is inconsistent. I manually calculated the moving time GAP to be closer to be 7:15 (using the individual lap GAPs on Strava).

IF would be threshold time in seconds / GAP in seconds, and 417/444 yields 93.9 which is close to what Intervals shows (though I can’t explain why Intervals wouldn’t show 94 here instead of 93).

Load is basically IF^2*duration in hours * 100 = 102.9 which matches precisely with the 103 displayed. However, this actually seems to uncover further inconsistency, the ‘duration’ used here is moving time, however the GAP used to calculated IF is the ‘elapsed time GAP’ as I described earlier whereas ‘moving time GAP’ was several seconds faster. The overall impact in load for this workout is only 4 or so, so not a big deal, but that’s mostly a function of my rather short drill session. If I had taken say 10 minutes for drills, my load would have dropped further adding additional discrepancy.

Again, this would be most apparent for intervals workouts where the variability (like we calculate for cycling workouts) would be very high.

1 Like

How you consider using power meter for running as well? Stryd is the name that comes up more often.
That way you can talk the same TSS number whether your cycling or running.

There are more and more options for running power like wrist power, footpod,…
But I can understand that not everyone is willing to upgrade gear.
Coros has something called ‘Effort Pace’. The chart follows the one from the wrist power but there are some differences. I have no idea what calculation is behind and I’m not really using it at this time.

@herlas I have, but don’t see the need to drop $250 on a problem that’s solvable mathematically with existing data. Intervals has already implemented a half-measure with Grade Adjusted Pace (against which you can argue, have you considered using a power meter instead?), so why not implement the full measure of GOVSS?

@MedTechCD interesting! It looks like it tracks quite closely to my eye, particularly if you cutoff the first few and last few seconds of the chart so you can see the pace variation more clearly. Based on internet search it looks like something similar to GOVSS/NGP, but haven’t seen the formula for it. But imo supports the notion of implementing.

1 Like

As soon as I select the Effort Pace chart, the scaling becomes fixed. No matter what part I select.

Hi, the effort pace on coros, is close to the GAP on strava (meaning grade adjusted pace). Its your pace but slightly modified when you are running on hilly terrain. You pace = gap or effort pace when running on a flat course. The purpose of it was to help trail runners to understand and use their pace data when running uphill or downhill to get equivalence. I hope it helps but still not solving the main issue of this topic.

-Marie

Coros clearly states that effort pace is different from GAP. And I know perfectly well what GAP is. Effort pace may be close to Strava GAP but it’s not the same. I can see that in Intervals, because Intervals uses the Strava model for GAP.
I mentioned this in a former post where I included some sources. And I also mentioned that not knowing what it exactly is, is a red flag for me. That’s why I’m not using it.
But GOVVS/NGP came up in this thread and those are entirely new to me. So I just wanted to see if maybe these metrics are related. I’m always curious to see if something is valid/usable when alternatives pop up.
Here’s the post I made on the subject: (DCRainmakers comments aren’t very positive)

@david could you chime in to clarify how Intervals is currently handling this?

I missed this thread before. Intervals.icu calculates training load from pace using this formula using GAP:

https://forum.slowtwitch.com/forum/Slowtwitch_Forums_C1/Triathlon_Forum_F1/Running_TSS_formula_clarification_P5374893/

Here is the actual code:

private void calcRun() {
    tss = 1;
    double mps;
    if (gap != null) {
        mps = gap.doubleValue();
    } else {
        if (moving_time <= 0) return;;
        mps = (double)distance / moving_time;
    }
    intensity = mps / threshold_pace;
    tss = (int)((moving_time * mps * intensity) * 100.0 / (threshold_pace * 3600) + 0.5);
}
1 Like

Thanks for replying. This seems to confirm the use of GAP, whereas one of the normalized pace calculations from above would be more consistent with the use of NP for cycling.

4 Likes