This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Instant pace is not accurate and has bias towards slower than actual pace

It appears instant pace on my Fenix 6X Sapphire has a consistent bias towards a slower than actual pace, often by 0:30-1:00 min/mile. 
That makes it more difficult to pace accurately, for example during races. It seems the bias is worse on more challenging terrain, for example on trails or under tree cover.

To understand this better I wrote a python script that parses a run activity that I export in TCX format (for easier parsing because TCX is a text based format).

Here are some examples of my script output. This is from a faster paced trail run on moderate tree covered trails:

Mile 1.00: Split: 8:42, Avg Pace: 10:04
Mile 2.00: Split: 8:52, Avg Pace: 9:22
Mile 3.00: Split: 8:37, Avg Pace: 9:17
Mile 4.00: Split: 8:04, Avg Pace: 8:31
Mile 4.53: Split: 8:03, Avg Pace: 8:03
----------
Overall pace 8:30, Avg Pace: 9:08

In this example Split time is produced every mile based on elapsed time from the beginning.
Avg Pace is produced by looking at the instant speed reported each second in each sample, averaging it over all samples of that split, and then converting that average speed to pace format (in minutes per mile). Basically Avg Pace represents the averaged result of what the watch was showing me during the run.

If anyone questions that approach, it should be OK to average the speed because it is sampled at even intervals every second (it wouldn't be OK in the case of smart recording).

As you can see there is quite a bit of discrepancy, especially in the beginning, although it gets better towards the end. Overall, after averaging, the watch reported 0:38/mile slower instant pace than what I actually ran, so there is a strong bias towards slower pace.

Here is another example - this is from a mix of road and suburban trails on more open terrain:

Mile 1.00: Split: 9:07, Avg Pace: 9:22
Mile 2.00: Split: 8:04, Avg Pace: 8:09
Mile 3.00: Split: 10:49, Avg Pace: 10:43
Mile 4.00: Split: 10:35, Avg Pace: 11:30
Mile 5.00: Split: 8:23, Avg Pace: 8:18
Mile 6.00: Split: 13:05, Avg Pace: 13:39
Mile 7.00: Split: 7:58, Avg Pace: 7:56
Mile 8.00: Split: 9:08, Avg Pace: 9:34
Mile 9.00: Split: 8:11, Avg Pace: 8:44
Mile 10.00: Split: 8:43, Avg Pace: 8:46
Mile 11.00: Split: 10:08, Avg Pace: 10:13
Mile 12.00: Split: 8:22, Avg Pace: 8:32
Mile 13.00: Split: 8:29, Avg Pace: 8:30
Mile 13.76: Split: 10:02, Avg Pace: 10:00
----------
Overall pace: 9:21, Avg Pace: 9:32

Even though this is much better overall, during some miles the discrepancy between the split times and the averaged instant pace was still up to 1 min/mile.

One more example - this is from a much slower mountainous trail run on steep terrain with a good amount of walking:
Mile 1.00: Split: 9:44, Avg Pace: 10:17
Mile 2.00: Split: 11:44, Avg Pace: 12:15
Mile 3.00: Split: 14:14, Avg Pace: 14:08
Mile 4.00: Split: 29:14, Avg Pace: 27:51
Mile 5.00: Split: 17:40, Avg Pace: 20:02
Mile 6.00: Split: 12:23, Avg Pace: 12:43
Mile 7.00: Split: 12:36, Avg Pace: 13:46
Mile 8.00: Split: 11:53, Avg Pace: 12:34
Mile 9.00: Split: 14:34, Avg Pace: 15:07
Mile 10.00: Split: 24:11, Avg Pace: 23:23
Mile 11.00: Split: 8:50, Avg Pace: 8:46
Mile 12.00: Split: 12:23, Avg Pace: 13:31
Mile 13.00: Split: 10:46, Avg Pace: 11:50
Mile 14.00: Split: 16:09, Avg Pace: 16:42
Mile 15.00: Split: 17:20, Avg Pace: 17:51
Mile 16.00: Split: 13:23, Avg Pace: 13:32
Mile 16.68: Split: 11:14, Avg Pace: 12:32
----------
Overall pace: 14:40, Avg Pace: 15:15

In this case the instant pace was faster than actual in a couple of splits, mostly in very slow ones where I walked or stopped. But the overall pattern is the same - there is a clear bias towards a slower pace.

I should add that today I installed a Rolling Average Pace Garmin IQ field that averages pace over the last 100 yards. I placed that field next to Garmin's Instant Pace and watched them side by side during an easy run. One thing was clear, every time I reached a steady pace and cruised for a while to let the rolling pace stabilize, the rolling average pace was always a bit faster than Garmin's Instant pace, which confirmed the same bias that I discovered from the post-analysis of the runs with my script.

Has anyone had similar observations?

12/05/21 EDIT: I changed the title of the post since Garmin seems to have improved the pace. It is more stable and precise than before, meaning that the values are closer together, but it is still not accurate - there is still a significant bias towards slower than actual pace

  • the calculation of instant pace and lap pace are performed with different algorithms

    The lap speed is simply the lap distance divided by the lap time. The lap pace is then directly derived from the lap speed. 
    Or alternatively, the lap pace is the lap time (in minutes) devided by the lap distance (in km or miles), which is still the same as above.

  • Of course, I haven't denied this.

    Lap pace is
    speed_lap = distance_lap / time_lap
    pace_lap = 1 / speed_lap

    Rather I mean lap speed doesn't need averaging/smoothing, since it is already an average of the samples incl. the GPS position error.

    But instant pace is
    speed_inst = distance_delta / 1s = distance_delta
    pace_inst = 1 / speed_inst

    Since the watch always works with a tactrate of 1s, the instant speed is only one sample, which is exactly the distance between 2 lat/lon's incl. the GPS position error. This may be oscillating due to the GPS position error and therefore should be smoothed/filtered.

  • Garmin's instant pace is certainly not derived directly from the distance delta over one sample. Intuitively is what it should be, but distance deltas are quite noisy. Even something like 10 or 15 second rolling average is still fairly noisy. I have actually done quite a bit experimentation parsing activity files and trying to smoothen instant pace in various ways to see if I could implement a better algorithm for instant pace and perhaps program a custom CIQ field.

    There are some methods that give a bit better accuracy (i. e. closeness of values to each other). For example a moving least squares linear regression mostly takes care of the outliers, but it requires a longer interval (more samples). Meanwhile if we do that, pace starts being quite inaccurate around stops or any sharp changes in speed. It is clear that Garmin certainly mixes cadence into the formula.

    Bit whatever algorithm Garmin uses, I think it was aimed at walking speeds where the relative GPS error is even higher than when running. That is the reason instant pace is based mostly on cadence. 

  • I know everyone moans about Garmin pace but grass is not always greener in the footpod world.

    For pace, my V800 still takes a lot of beating

    Pace from footpod in image below - odd dropouts and very choppy. I ran as usual also with my Polar V800 too and I found the GPS pacing very good - I assume Polar smooth their GPS so with V800 zonelock and pace zones I prefer V800 pacing to Stryd, if you pace via alerts.

  • The latest screenshots was from a 19.5km @ ~2 hours slow run/jog on a gravel road with some twists, some hills, some open areas and also some tree cover from time to time. But not a trail. 

    The deep outliers seems to be caused by short GPS pace dropouts (poor signal) and the pace has hard to recover after the dropouts. This must be a bug in the algorithm.

    Yes, more tests and calculations is needed to get a good grip of the issues. Here is some comparisons that I have made.

    Lap Pace vs built-in Pace

     '

    Lap Pace vs Pace calculated by record.distance[m] Delta (RAW)

    Lap Pace vs Pace calculated by record.distance[m] Delta (10 seconds rolling average)

    Lap Pace vs Pace calculated by record.distance[m] Delta (30 seconds rolling average)

    Lap Pace vs Pace calculated by record.distance[m] Delta (60 seconds rolling average)

    Lap Pace vs Pace calculated by GPS semicircles (RAW)

    Lap Pace vs Pace calculated by GPS semicircles (10 seconds rolling average)

    Lap Pace vs Pace calculated by GPS semicircles (30 seconds rolling average)

    Lap Pace vs Pace calculated by GPS semicircles (60 seconds rolling average)

    And the last one is built-in Pace (blue line) vs Pace calculated by semicircles (60 seconds rolling average) (green line)

    So, it looks like the built-in Pace is something like a 60 seconds rolling average from the GPS. But with some occasional odd twists... I will look if I can figure it out later on. Maybe the watch compares GPS speed with stride length/cadence and if the difference is to big it fails over to the best plausible at the moment. And maybe also the GPS signal strength is part of that comparison. Something is clearly not working well.

  • And here is a comparison between the built-in Pace (blue line) vs Pace calculated by Cadence and Step Length (10 seconds rolling average) (dark red line)

  • @AndersB - Really interesting work. However it appears to me you are calculating pace with hindsight with the benefit of a complete activity and full GPS track. However, this subject is about instant pace, and in an instant pace scenario, you do not know what GPS position you will have in the future at that snap shot in time.

    I am not sure I am explaining myself well, but I am not sure you can post-process activities and then try to say events that happen in real time during a run should happen in a certain way. Does that make sense?

  • I'm not 100% sure that I understand you correctly but I am analysing the .FIT files which includes some data that I can use to calculate this way. For each second of an activity we have a log for record.enhanced_speed[m/s], gps_metadata.enhanced_speed[m/s], record.distance[m], GPS position (and altitude), cadence, step length etc.

    We can use all (or some of) this data to calculate "instant pace" or an averaged pace over xx seconds.

  • @AndersB am not explaining myself well - sorry

    So lets define instant pace - it's the 'real time' pace that is shown on your watch during your run, and as you know it can change very frequently - do we agree here?

    So if we are agreed on that point, I am not sure you can say that take a complete file and then go back and with the benefit of a full and complete GPS track retrospectively try to say pace was wrong. Simply because watch 'instant pace' is calculated at one moment in time, whereas you are calculating with the benefit of a full track, so it goes without saying you are going to see different results if you have a full .FIT file to process vs. data gathered in real time during the run.

    I am not at my most articulate today, sorry!

  • We are speaking of the Pace which is shown in the Pace Data Field on the watch and also the Pace diagram in Garmin Connect. Its called record.enhanced_speed[m/s] in the .FIT file which is then converted to Pace. That value is heavily smoothed/averaged and not "instant" in a real way. And sometimes also very wrong compared to real Pace. 

    Yes, I can calculate the Pace between each data point in the .FIT file (and of course also smoothed and/or averaged over time). And yes, I can prove that the Pace Data Field on the watch was wrong when the Run activity was done. Its not magic, just plain mathematics :)