Wednesday, May 1, 2019

Polar OH-1 accuracy on the forehead

Recently, the Polar OH1 optical heart rate sensor was given a firmware upgrade and marketing change.  It is now Ant+ as well as BTLE capable which is a nice addition if you want to transmit data to both your Garmin watch and Ant equipped android phone (something I do).  In a prior review, the accuracy of the Polar unit was not up to the same quality as the Moov Sweat forehead sensor.  However, the placement of the Polar for that comparison was not on the forehead, but on the arm.  Continued usage of the Moov device has continued to impress me with it's accuracy compared to the Hexoskin shirt (single lead EKG).  The recent firmware change and marketing information now say that the Polar can be used on the forehead (for swimming).  Since the forehead is not prone to either motion artifact nor decreasing blood perfusion as is the arm location, the accuracy should theoretically be better.
Here is the new advertisement from Polar's website:
They show a swimmer using the OH1 under a goggle clip.


I decided to take a look at the heart rate tracking of the Polar OH1 vs the Hexoskin, giving it a second chance to redeem itself.

The test session:
Typical 30+ mile cycling ride with 2 HIT intervals, the first a VO2 peak 4 min, the second a Wingate 60.  Hexoskin shirt with PolarOH1 on the forehead.



  • On initial glance - Looking at the whole ride, there does seems to be reasonable agreement between both units.
Does this hold up under detailed scrutiny?
Let's look at the net difference at each time point.  What I have done here is simply subtract the Polar from the Hexoskin value, so we get an idea of how many BPM the Polar is off from the gold standard at each second of measurement (yes, the values were perfectly synchronized):


During the beginning of the intense intervals, the Polar lags (negative BPM) and throughout the ride is off about 5-10 BPM at times.  It seems like the Polar reads higher than the Hexoskin except for early interval times.

4 min VO2 peak session:
As discussed in a prior post, the VO2 peak power (Maximal Aerobic Power) can be estimated by a 3-5 minute, all out session.  It is important that we reach a near maximal heart rate (toward the end of the interval) as an indicator of reaching peak VO2.  Can the Polar unit do this accurately?:


Net difference at each time point:



  • There is a lag in the Polar heart rate in the beginning of up to 20 BPM.
  • However by 60 seconds, it's within 3 BPM of the Hexoskin.
  • The last 2 minutes are pretty much spot on, +- 2-3 BPM.
  • Recovery values are still close, 0-6 BPM.

Verification of the Hexoskin:
The great thing about the Hexoskin is the ability to look at the raw data, to make sure the tracing is of high quality.

Early interval:

Late interval:
Both tracings are of superb quality, as good as a resting EKG at your physicians office!


Wingate 60:
This is the most demanding of any heart rate monitoring device.  There is severe unpredictable motion, blood flow redistribution away from the arms and non essential areas making both optical and even electrical sensors show artifact.

Here is the actigraph from the Hexoskin:

The smooth lines become increasingly chaotic over the first several seconds of the all out effort.  This leads to motion artifact issues in optical heart rate monitoring. 


The comparison tracings of HR:


Net difference:
Unfortunately, the Polar misses the boat.  In a similar fashion to the 4 min tracing, it does not catch the first minute or so of activity.  This leads to an error of up to 50 BPM.
Also in the same vein as the 4 minute comparison, it then does pretty well with near perfect accuracy later on.

Hexoskin verification:
Despite my body twisting all over the place with max effort, a remarkably good signal.
I did yellow in either an aberrant beat or more likely an artifact.


Moderate power climb:
This was a segment at the end of the ride of neither all out nor high intensity.  This gives an idea of how the Polar will track for the majority of moderate training intensity.
Net difference:


  • There was some lag (again) at the beginning of the segment where the Polar is under reading the Hexoskin.  The mid and end of the power interval are very closely matched.
  • There is also some over reading at the beginning and the end (non powered coasting).

Comfort:  
The Polar is thicker than the Moov Sweat unit and if worn under a helmet for any length of time leads to significant discomfort as well as an indentation of the scalp where it was placed.


Summary:
  • The Polar OH1 placed in the forehead location still does not have the tracking accuracy of the Moov sweat.
  • There is significant lag behind the gold standard Hexoskin (1 lead EKG) during intense and even moderate intervals.  This does not occur with the Moov device.
  • However, it is now Ant+ capable and will work with more than 1 recording device simultaneously.  You could record HR to both an Ant+ smartphone and a Garmin watch.
  • It seems to achieve near gold standard accuracy after 60 seconds of a HIT interval, making it acceptable for VO2 peak testing
  • Comfort under a bike helmet is a major issue for the Polar.
  • But, if near EKG accurate heart rate for an entire ride session is important to your physiologic monitoring, it is probably not the device for you.

In the next post, a review of Firstbeat technology for VO2 max determination will be discussed, including why accurate heart rate (even at submaximal intensity) is essential for accurate measurement.  Firstbeat is responsible for the VO2 metrics of Garmin products, including the new Marq line of watches.

Tuesday, April 23, 2019

Sensor value comparison, BSX, Hex, Moxy

Published studies have evaluated the accuracy of the 3 main muscle O2 sensors, but how do they compare in side by side?  If you only have one brand of sensor, this may not be important, however if you have been using a BSX unit and switch to the Hex, will your historic values hold up?  In addition, let's say all 3 are "accurate" in tracking O2 changes, but you want to buy the one with the best dynamic range.  Which one has that property?

I personally have 3 BSX and 1 Hex sensors and was also able to get some data comparing a Moxy to the Hex. This post will be about some observations on all three.  Several issues to consider when making comparisons are the following:
  • Location of each device - The baseline and range of O2 sat will of course be different between muscle groups.  However, the location within the same muscle will also yield different values.  The proximal vs distal site of the quadriceps should be different.  Therefore if we are using two sensors on the RF for example, they may not have the same dynamic range simply because of this factor.
  • Left vs Right legs - Some individuals have leg strength and/or O2 saturation asymmetry.  In my case, my L RF has a much higher dynamic range of saturation values despite having near 50/50 percent power equality.  So, a direct left vs right comparison will not be valid.
  • Light interference -  I noticed that on some occasions the BSX strobe LED caused artifacts in the Hex readings.  The fix is to place them at least a few cm apart, but then you are getting the proximal vs distal difference effect again. 
What I have done in the cycling interval tracings below is a proximal/distal placement on one day to get a general idea of pattern, then moving the Hex to exactly where the BSX was on the L RF on a different day but doing a similar interval (Wingate 60).  The near exact placement location and similar power interval should give us a good idea on dynamic range difference.

Proximal BSX, distal Hex on the L RF - 350 watt x 3 min with a cool down:
The sensors are on the same rectus femoris but one on top of the other.  Pattern should be matched on the time scale.

O2 sat

Total Hb:

HHb:

  • The pattern of O2 saturation, deoxy hemoglobin appear very similar.
  • Dynamic range of the Hex is markedly less, but this could be related to distal position.
  • There may be a slight difference in THb.

Wingate 60 at 500 watts:
Same day, placement

O2 sat 

 Total Hb

HHb

  • The pattern of O2 saturation, deoxy hemoglobin appear very similar.
  • Dynamic range of the Hex is markedly less (55 vs 20%), but this could be related to distal position.
  • The difference in THb is minimal in this max interval session.


Different day, but now the Hex is in the same spot as the BSX sensor was in the tracings above.  
Perhaps the dynamic range will be better?

Wingate 60 at 500w with cool down - Hex only - O2 sat:

 THb:

HHb:


  • The pattern and dynamic range of O2 sat and HHb are now a bit closer to the BSX unit.
  • It seems that location does make a big difference in this regards.  
  • On the R RF (not shown) the BSX O2 sat dropped from a baseline of 70 to about 50%.  
  • The total Hb pattern resembles the BSX (in the same location) closely.



Data line up: What I have done here is to take the day of left RF sensor data from the BSX and match it in time to the different day of Hex left RF data (same spot).  The interval was within 1-2% of the same power average and I show both power curves:
 

Summary of same location, same power profile:

                                Net range
BSX  70 to 15%            55%
Hex   64 to 30%            34%

  • Even with the same placement, the Hex has a more limited dynamic range than the BSX.
  • In my case, a distal vs proximal placement as well as left vs right leg location does impact the result but not the pattern of saturation, total Hb change.

How does the Hex do on a weight training session?
This is a comparison between the Hex and BSX on my L tricep doing body weight dips.  The length of the active interval is about 30-40 seconds.

Hex:
 

BSX:
 

 Summary of same location, same power profile:

                                Net range
BSX  66 to 1%             65%
Hex   60 to 7%             53%

  • The BSX has a higher min to max range.
  • Start and stop changes are blunted in the Hex due to the time averaging algorithm they employ.
  • Although the Hex has a smaller dynamic range, it is still ample and one could argue that avoiding near zero values is an advantage.  

Moxy vs Hex
Although I don't own a Moxy sensor, I am using data from my friend the XCSkier who does.
The following tracings are from a session of cross country skiing, Moxy on the R RF and the Hex on the L RF.  Although mirror image location was the same, we can't directly compare legs based only this data.  If we had 2 Moxy's or 2 of the same brand that were documented to match, that would be a different situation.  But we can get an idea of trends and will look at range anyway.

Up and down hill.
O2 sat:
  • Both the Moxy and Hex track in a very similar fashion.  This is certainly good to see if you are considering a switch from one to the other.
  • The range of the Moxy is larger than the Hex, but since they are on different legs, it is hard to say if this is based on location or sensor design.

Total Hemoglobin:

  • The tracking of total hemoglobin in a short time frame is not as evenly matched.  Whether this is from the smoothing algorithm on the Hex is unclear.

To better examine the total Hb change, I decided to look for reperfusion changes during a segment of low heart rate, hoping this corresponded to coasting:

Here is the Moxy O2 sat and total Hb.  
I circled in blue where heart rate drops (light gray) and the total Hb, O2 sat markedly rise.
 

The Hex during the same segment:
  • The first circled area exhibits the same behavior with rapid O2 sat increase and total Hb.
  • However, the base of the total Hb tracing is broader, possibly from smoothing.
  • On the second marked area there is still agreement, but not as much.  My guess is this is also related to the smoothing done on the Hex.


Summary:
  • BSX, Moxy and Hex sensors all track O2 saturation and total hemoglobin in an overall similar fashion.
  • The dynamic range of the Hex is less than the BSX and probably less than the Moxy.  This can be troublesome in a muscle location that already has a marginal resting to nadir value range.
  • There is a substantial smoothing algorithm employed in the Hex that can mask sharp change in data values.  In my opinion, this should be an optional feature and potentially interfere with interpretation of the sensor's data.  I would personally rather have it off and if I needed smoothing, just design that into the spreadsheet after data extraction.
  • Different legs can have very different saturation ranges despite identical location, it can't be assumed they will match unless tested.
  • As long as these factors are considered, all three devices should be interchangeable for desaturation patterns, making them all useful for MLSS measurement in long intervals.

Sunday, April 14, 2019

Data Presentation and Analysis - Plotting

The next step once we have a solid spreadsheet of our data is to graph and analyze it.  If you have a background in stats or engineering, your knowledge base is vastly superior to mine so ignore this post.  This is intended as a simple, no cost way of data presentation for users with little or no data manipulation background.

A graphing web app by the name of Plot.ly is my personal favorite.  If you like to use a dedicated graphics or data package that may work even better.

You will need to sign up for a free account, then we are ready to begin.

Time, Power, Heart rate graph for the entire session:
The first step is to import the spreadsheet we just created.  Click the Import button to the right (in red):


You will get this dialog:

 Upload the spreadsheet (takes a few seconds).  You will then have this:

As you can see, all our data is there with the headers on top.  To plot a single column, click "+ Trace" (next to red arrow above).

The following will appear:
 We want to select the line graph (above red arrow).

The next step is to tell the app what X and Y values to graph.  The X has a pull down list, select "Time" and the Y should be the "power".  In the future, the X is usually Time (the same value on the list, time is the same for all sensors), and the Y will be each sensor data range we want to graph.
Notice we now have a graph in purple of watts.

Let's add heart rate to the curve.  Click the "+Trace" again to add another sensor series:
The X axis is again the time, the Y is heart rate.  However, we can have a separate scaling on the Y (a second Y axis).  If you click the "+" button next to the Y axis, a second range is created (far right side).

Here is the final result so far:
Not very pretty or readable but we can clean this up:
First, lets add text to the axis labels, title and trace labels (top R).  The trace labels list can also be moved around.  To change the labels just click on them and type some appropriate text.

To boost the font size, press the "Style" button on the left side of the screen:
Here I darkened the font color and changed the size so we can read it.

Although it is possible to zoom and analyze the plot, I prefer to copy out a section of the original master spreadsheet and load it independently.   The web app is just not robust enough to handle over 100,000 data points.

Go back to openoffice, open the original sheet and find the segment of interest.  For the above, I wanted the 5000 to 6000 second range:
I will then click to first box of interest on the far left, scroll down to the end of range I want and shift click on the far right (last data series) to select the whole list of values


Then control C to copy.


Go to menu, open a new sheet, then paste into the second row:


You can then go back to the original sheet to copy the first row title headers and paste into the new sheet:

Save it with an appropriate name, go back to the Plot.ly app and import it.

Now we will do a full graph of SmO2, power, heart rate and ventilation for this training interval.

What I have done here is to get back to where we were above with power/HR over time and added Ventilation (using the second Y axis for HR, far right side):



Let's now look at a couple of SmO2 fields (RF and Costal HHb):
The same Y axis was used for watts and ventilation and the right Y axis for HHb.

Here I dimmed out the Watts for a better look (using the Style tab on the far left toolbar.

Some more color changes to put Ventilation in the background (in yellow).
This is good for a final.  

To save the image as a jpeg, press the export button (red arrow below):


Here is the final:
  • At this point if you are satisfied, a screen shot copy, or export as jpeg can get a high res image.  One could also save this in the web app (the blue button on the far left).




Curve fitting:
The web app has some primitive curve fitting which is nice if you want a line drawn through your data objectively.
  • Why would you need to do so?  For example - looking for MLSS on a long interval.  Using either SmO2 (RF/costal) or Ventilation rate over a > 5 minute constant power interval can be used to determine this.  Having an accurate regression line with slope may help determine which power level causes a take off in slope.
Under Analysis (left menus), choose "Curve fitting" and select a Trace (I did Ventilation) on the top drop down.  You can only curve fit a data series if it is using the left Y axis.
Enable advanced to get the calculation range to show (X min and X max range of values).


We need to populate the X min max fields (both the calculation and display range).  If you hover over the line trace data you will see the X values on the curve as well:
Put in a 0 placeholder in the M and X fields.
I put in 5600 to 5800 seconds for the Ranges.  Make sure the "matching data" box is in blue.

Then press the Run button
You should have a curve fit line just through the range of data selected:

I took the liberty of running curve fits for both costal and RF HHb.

Averages:
Both the Hexoskin web app as well as Garmin do not allow for easy calculation of average values.  
  • For example, let's say you were looking at your long MLSS power interval again and wanted to know at what average SmO2 or Vent rate this was attained.  Even though you may know the power figure, there is no way of getting the corresponding Vent rate average from the Hexoskin site, or the SmO2 average from Garmin.
Although I'm not going to be getting into spreadsheet calculation detail, lets at least see how to get an average for a range.   We are going to get the average power and vent rate for the second interval on the sheet.
Here is a section of the sheet (the end of the range I want to average) we will work on.
To start, I created a blank column next to the "power", column C.  Next to the last value we want to average is the box we will use for the Function.  It really does not matter where you put it, but this looks convenient.


While in that black box, click the Function button again.
We have a new one to try now, "Average", double click it and the following will appear:


Press the circled red box to bring up another range entry input box.  

Although we can just put the range in here directly, it's easy to just shift-click the first and last values to get our range.




Here is what you will see after clicking back into the sheet on the last value (215 watts) in cell B647:




Then scroll up the sheet to find the first value (226watts-B287), then shift-click into that value (make sure it is in the B column):

The range is put in properly.  If this is correct, now press the enter key to put it away and you are back to this:

You could have typed it in manually as you now see.  Press the OK and you have your result:


I went back to cycling analytics web site and double checked the average:
Looks good!


I repeated the process with the Vent rate with the results.  We now have an average ventilation vs power for a given interval:


Summary:
There are many other interesting metrics to explore including, running averages, comparing line slopes and of course multiple sensor value combos in one graph.
For now I think this is enough to get started, especially if this is all new to you.  To the data scientists out there, my apologies for oversimplification, omissions but to the untrained folks out there (like me) this will get you up and running.  As old Dr McCoy said on Start Trek many times, "I'm a doctor not a ......"
Although sites like Garmin, cycling analytics, Hexoskin, Humon and Golden Cheetah will present data, they don't combine all sensors of interest, nor provide the flexibility that a plain old spreadsheet with appropriate graphing does.  However, for monitoring metrics over time, providing meaningful peak values, tracking training loads and such, these sites are essential.  I encourage athletes to use a data repository you are comfortable with, as well as learning to extract the individual sensor info for more in depth analysis.