Body fat formulas for your AccuMeasure body fat calipers

by Rudd-O published 2017/01/18 15:41:00 GMT+0, last modified 2017-04-13T09:59:50+00:00
This is a set of formulas that you can use to convert the measurements of your AccuMeasure calipers to body fat percentage. Follow the instructions, then plug the number on the appropriate formula. You'll get quite the accurate measurement of your body fat, with none of the hassle of looking up numbers on a table.

The x in the formulas represent what you measured with your AccuMeasure in millimeters, when you follow the instructions correctly, and they are derived from the table that ships with the device.  Plug the measurement (fractional values are okay) into the formulas.  The output of the formula is a percentage number (as in 0—100, not 0—1).  The maximum error (discrepancy) between these formulas and the values in the AccuMeasure table is less than 1%.

Tips:

  1. Use these formulas on your favorite spreadsheet to track your body fat daily.  That way you don't have to do math or look stuff up.  The example spreadsheet formula is next to the mathematical one in the tables below.
  2. Always measure yourself right after you wake up.  Never change the time you measure relative to when you wake up — you'll get erratic measurements.
  3. Always measure in exactly the same way you did the previous day.  Pinch the same abdominal area, clip the same fold.  Day-to-day repeatability of the measurements is more important than absolute accuracy.

Men's formulas

Age bracket Mathematical
x is mm, y is body fat %
Excel / LibreOffice / spreadsheet
A1 is cell containing mm, output is body fat %
18—20 y = -0.016558 x² + 1.338304 x + -1.613505 =-0.016558 * (A1 * A1) + 1.338304 * (A1) + -1.613505
21—25 y = -0.017450 x² + 1.375824 x + -0.898402 =-0.017450 * (A1 * A1) + 1.375824 * (A1) + -0.898402
26—30 y = -0.017355 x² + 1.372444 x + 0.181479 =-0.017355 * (A1 * A1) + 1.372444 * (A1) + 0.181479
31—35 y = -0.017569 x² + 1.381746 x + 1.179773 =-0.017569 * (A1 * A1) + 1.381746 * (A1) + 1.179773
36—40 y = -0.017623 x² + 1.383619 x + 2.233607 =-0.017623 * (A1 * A1) + 1.383619 * (A1) + 2.233607
41—45 y = -0.017754 x² + 1.388621 x + 3.280957 =-0.017754 * (A1 * A1) + 1.388621 * (A1) + 3.280957
46—50 y = -0.017754 x² + 1.388621 x + 3.280957 =-0.017687 * (A1 * A1) + 1.386841 * (A1) + 4.319327
51—55 y = -0.017610 x² + 1.382021 x + 5.445419 =-0.017610 * (A1 * A1) + 1.382021 * (A1) + 5.445419
56+ y = -0.017394 x² + 1.374599 x + 6.552526 =-0.017394 * (A1 * A1) + 1.374599 * (A1) + 6.552526

Women's formulas

Unfortunately, I haven't generated the formulas for women yet.

Homework: Check out the charts at the AccuMeasure web site, use the workbench code below to generate them, and send the changes to me!

LibreOffice macro formula for your spreadsheet

Function bodyfat(measuremm As String, age As String)
        Dim measuremm_d as Double
        Dim age_d as Double
        measuremm_d = Val(measuremm)
        age_d = Val(age)
        If age_d >= 18 and age_d <= 20 Then
                bodyfat = (-0.016558 * (measuremm_d * measuremm_d)) + (1.338304 * measuremm_d) + -1.613505
        Elseif age_d >= 21 and age_d <= 25 Then
                bodyfat = (-0.017450 * (measuremm_d * measuremm_d)) + (1.375824 * measuremm_d) + -0.898402
        Elseif age_d >= 26 and age_d <= 30 Then
                bodyfat = (-0.017355 * (measuremm_d * measuremm_d)) + (1.372444 * measuremm_d) + 0.181479
        Elseif age_d >= 31 and age_d <= 35 Then
                bodyfat = (-0.017569 * (measuremm_d * measuremm_d)) + (1.381746 * measuremm_d) + 1.179773
        Elseif age_d >= 36 and age_d <= 40 Then
                bodyfat = (-0.017623 * (measuremm_d * measuremm_d)) + (1.383619 * measuremm_d) + 2.233607
        Elseif age_d >= 41 and age_d <= 45 Then
                bodyfat = (-0.017754 * (measuremm_d * measuremm_d)) + (1.388621 * measuremm_d) + 3.280957
        Elseif age_d >= 46 and age_d <= 50 Then
                bodyfat = (-0.017687 * (measuremm_d * measuremm_d)) + (1.386841 * measuremm_d) + 4.319327
        Elseif age_d >= 51 and age_d <= 55 Then
                bodyfat = (-0.017610 * (measuremm_d * measuremm_d)) + (1.382021 * measuremm_d) + 5.445419
        Elseif age_d >= 56 Then
                bodyfat = (-0.017394 * (measuremm_d * measuremm_d)) + (1.374599 * measuremm_d) + 6.552526
        End If
End Function

Reinteract workbench code

These numbers were reverse-engineered with the assistance of Reinteract, an excellent mathematical analysis workbench for Python and Linux. Run this code on your Reinteract workbench to get those values.

import numpy as np
import replot as rp

def arr(seqstr):
    return np.array([ float(x) for x in seqstr.split() ])

xs = "2.5 4.5 6.5 8.5 10.5 12.5 14.5 16.5 18.5 20.5 22.5 24.5 26.5 28.5 30.5 32.5 35"
xs = arr(xs)

ys = {}
ys['1820'] = '2 3.9 6.2 8.5 10.5 12.5 14.3 16.0 17.5 18.9 20.2 21.3 22.3 23.1 23.8 24.3 24.9'
ys['2125'] = '2.5 4.9 7.3 9.5 11.6 13.6 15.4 17.0 18.6 20 21.2 22.3 23.3 24.2 24.9 25.4 25.8'
ys['2630'] = '3.5 6 8.4 10.6 12.7 14.6 16.4 18.1 19.6 21 22.3 23.4 24.4 25.2 25.9 26.5 26.9'
ys['3135'] = '4.5 7.1 9.4 11.7 13.7 15.7 17.5 19.2 20.7 22.1 23.4 24.5 25.5 26.3 27 27.5 28'
ys['3640'] = '5.6 8.1 10.5 12.7 14.8 16.8 18.6 20.2 21.8 23.2 24.4 25.6 26.5 27.4 28.1 28.6 29'
ys['4145'] = '6.7 9.2 11.5 13.8 15.9 17.8 19.6 21.3 22.8 24.7 25.5 26.6 27.6 28.4 29.1 29.7 30.1'
ys['4650'] = '7.7 10.2 12.6 14.8 16.9 18.9 20.7 22.4 23.9 25.3 26.6 27.7 28.7 29.5 30.1 30.7 31.2'
ys['5155'] = '8.8 11.3 13.7 15.9 18.0 20.0 21.8 23.4 25.0 26.4 27.6 28.7 29.7 30.6 31.2 31.8 32.2'
ys['56+  '] = '9.9 12.4 14.7 17 19.1 21 22.8 24.5 26 27.4 28.7 29.8 30.8 31.6 32.3 32.9 33.3'

itms = sorted(ys.items(), key=lambda x: x[1])
for k, v in itms:
    v = arr(v)
    coeffs = np.polyfit(xs, v, 2)
    print k, "   ",
    print "y = %f x² + %f x + %f" % tuple([float(x) for x in coeffs]), "   ",
    print "=%f * (A1 * A1) + %f * (A1) + %f" % tuple([float(x) for x in coeffs])

def gen_function():
    print "Function bodyfat(measuremm As String, age As String)"
    print "        Dim measuremm_d as Double"
    print "        Dim age_d as Double"
    print "        measuremm_d = Val(measuremm)"
    print "        age_d = Val(age)"

    itms = sorted(ys.items(), key=lambda x: x[1])
    for n, (k, v) in enumerate(itms):
        v = arr(v)
        coeffs = np.polyfit(xs, v, 2)
        iff = "Elseif" if n > 0 else "If"
        try:
            print "        %s age_d >= %s and age_d <= %s Then" % tuple([iff] + k.split(""))
        except TypeError:
            print "        Elseif age_d >= %s Then" % k.split("+")[0]
        print "                bodyfat = (%f * (measuremm_d * measuremm_d)) + (%f * measuremm_d) + %f" % tuple([float(x) for x in coeffs])
    print "        End If"
    print "End Function"

gen_function()

itms = sorted(ys.items(), key=lambda x: x[1])
for k, v in itms:
    v = arr(v)
    coeffs = np.polyfit(xs, v, 2)
    v_proof = np.polyval(coeffs, xs)
    rp.plot(xs, v, xs, v_proof)