Running pace is strongly affected by uphill and downhill gradients. It is often useful to take into account or “correct” for gradient, for example, when determining whether you gradually slowed down on a hilly course, to estimate what your time would have been if the course had been flat or when calculating running efficiency. There are several ways of correcting for gradient, but as far as I know, the most detailed analysis of how running pace is affected by grade was done by Kay (2012)
http://www.lboro.ac.uk/microsites/maths ... /11-38.pdf, who analysed the pace of elite hill runners on a variety of up- and downhill courses. This analysis resulted in an equation that predicts pace from gradient. Using the new “calculated tracks” functionality in the Custom Data Tracks plugin, I have created several tracks that use Kay’s formula. Hopefully some are useful for other runners too. I realise the formulas below look rather complex, but they can just be copied and pasted into Custom Data Tracks.
To calculate a “grade-corrected pace”, I use the following formula derived from Kay (2012):
1/(1707*1/{DataPoint.SmoothedSpeed}/(5656*{DataPoint.SmoothedGrade}/100+32209*Math.Pow({DataPoint.SmoothedGrade}/100, 2)-3211*Math.Pow({DataPoint.SmoothedGrade}/100, 3)-43635*Math.Pow({DataPoint.SmoothedGrade}/100, 4)+1707)) > 7.5 ?
7.5 :
1/(1707*1/{DataPoint.SmoothedSpeed}/(5656*{DataPoint.SmoothedGrade}/100+32209*Math.Pow({DataPoint.SmoothedGrade}/100, 2)-3211*Math.Pow({DataPoint.SmoothedGrade}/100, 3)-43635*Math.Pow({DataPoint.SmoothedGrade}/100, 4)+1707)) < 0 ?
0 :
1/(1707*1/{DataPoint.SmoothedSpeed}/(5656*{DataPoint.SmoothedGrade}/100+32209*Math.Pow({DataPoint.SmoothedGrade}/100, 2)-3211*Math.Pow({DataPoint.SmoothedGrade}/100, 3)-43635*Math.Pow({DataPoint.SmoothedGrade}/100, 4)+1707))Settings: Type: Speed/Pace, Smoothing: 19sI use a smoothing of 19 s because I have the same smoothing for my ST Speed/Pace. Kay’s (2012) formula is based on hill races by elite runners, but I find that it also does quite a good job of correcting for grade if you are not an elite runner. (It assumes that as a non-elite runner, you are, let’s say, twice as slow as an elite, regardless of the gradient.) The grade-corrected pace removes variability in pace due to up and downhills, which can be useful, for example, to check whether you slowed down over the course of a run, taking into account that you’d be slower on up than downhills.
We can also calculate a “grade difficulty index”:
{DataPoint.SmoothedGrade} > 62.5 ?
(0.1707+0.5656*62.5/100+3.2209*Math.Pow(62.5/100,2)-0.3211* Math.Pow(62.5/100,3)-4.3635*Math.Pow(62.5/100, 4))/0.1707/({Activity.AverageSpeed}/{DataPoint.SmoothedSpeed}) :
{DataPoint.SmoothedGrade} < -62.5 ?
(0.1707+0.5656*-62.5/100+3.2209*Math.Pow(-62.5/100,2)-0.3211* Math.Pow(-62.5/100,3)-4.3635*Math.Pow(-62.5/100, 4))/0.1707/({Activity.AverageSpeed}/{DataPoint.SmoothedSpeed}) :
(0.1707+0.5656*{DataPoint.SmoothedGrade}/100+3.2209*Math.Pow({DataPoint.SmoothedGrade}/100,2)-0.3211* Math.Pow({DataPoint.SmoothedGrade}/100,3)-4.3635*Math.Pow({DataPoint.SmoothedGrade}/100, 4))/0.1707/({Activity.AverageSpeed}/{DataPoint.SmoothedSpeed})Settings: Type: Custom, Smoothing: 0sThe graph for the grade difficulty index is not of any interest, but the “grade difficulty index Avg” data field that you can get under Settings, Custom Data Tracks Plugin, Custom Activity Detail pages, Data Fields is. Essentially, it tells you how hard the hills in the course were, overall. If the grade difficulty index value is 1, then the course is perfectly flat (or the difficulty of the uphills is cancelled out by the easiness of the downhills). The higher the grade difficulty value, the harder the course. For downhill courses that are not too steep, you get a value lower than 1. To make sure that Custom Data Tracks uses a sufficient number of decimal places in subsequent calculations using the grade difficulty index, I’d set the number of decimal places to at least 3 under Logbook, Properties, Custom Data Fields. Also, because subsequent formulas use the grade difficulty index, you first need to get the grade difficulty index for an activity before you can calculate the subsequent tracks. In the Activity Reports or Daily Activity view, do edit, Custom Data Tracks, Force Recalculation of Calculated Tracks.
We can also calculate a “grade-corrected distance”. This gives you an estimate of how far you would have run in the same time if the course had been completely flat, so it is a useful way of comparing the difficulty of longer flat courses with shorter hillier courses.
{Activity.CDF["Grade difficulty index Avg."]}*{Activity.Distance}/1000Settings: Type: Custom, Smoothing: 0sReplace 1000 in the formula by 1609 if you want the distance in miles rather than km. Again, the graph isn’t interesting, but you can get an average value under Settings, Custom Data Tracks Plugin, Custom Activity Detail pages, Data Fields.
And if you are interested to know what your estimated time would have been if the course had been flat, then you can calculate that too:
Math.Round(({Activity.Time}/{Activity.CDF["Grade difficulty index Avg. [Difficulty relative to 0 grade]"]})/60-0.4999999)+(({Activity.Time}/{Activity.CDF["Grade difficulty index Avg. [Difficulty relative to 0 grade]"]})%60)/100Type: Custom, Unit: min.sec, Smoothing: 0sSet the number of decimal places under Logbook, Properties, Custom Data Fields to 2. The time will then be in minutes and seconds, so 72.50 means 72 minutes and 50 seconds.
Finally, we can calculate a measure of efficiency: How far do we run per heart beat? Obviously, distance/heart beat would be affected by whether we run up or downhill, which is probably not what we want. We therefore calculate a “grade-corrected efficiency” using grade-corrected pace:
1/(1707*1/{DataPoint.SmoothedSpeed}/(5656*{DataPoint.SmoothedGrade}/100+32209*Math.Pow({DataPoint.SmoothedGrade}/100, 2)-3211*Math.Pow({DataPoint.SmoothedGrade}/100, 3)-43635*Math.Pow({DataPoint.SmoothedGrade}/100, 4)+1707)) > 7.5 ?
7.5*60/{DataPoint.HeartRate} :
1/(1707*1/{DataPoint.SmoothedSpeed}/(5656*{DataPoint.SmoothedGrade}/100+32209*Math.Pow({DataPoint.SmoothedGrade}/100, 2)-3211*Math.Pow({DataPoint.SmoothedGrade}/100, 3)-43635*Math.Pow({DataPoint.SmoothedGrade}/100, 4)+1707)) < 0 ?
0 :
1/(1707*1/{DataPoint.SmoothedSpeed}/(5656*{DataPoint.SmoothedGrade}/100+32209*Math.Pow({DataPoint.SmoothedGrade}/100, 2)-3211*Math.Pow({DataPoint.SmoothedGrade}/100, 3)-43635*Math.Pow({DataPoint.SmoothedGrade}/100, 4)+1707))*60/{DataPoint.HeartRate}
Settings: Type: Custom, Unit: m/heart beat, Smoothing: 19sYou should expect to see that your efficiency goes down when you get more tired, for example, at the end of a long run. It may also be useful to compare grade-corrected efficiency between races to get an impression of your fitness (but remember that efficiency is generally higher for short than long courses).
I have attached a document in which I describe in more detail how I derived the formulas and how to calculate some additional tracks. My maths is a bit rusty, so worth checking whether I haven’t made any errors.