"They calibrated the light against the volunteers they could find. The volunteers they could find were the reason the numbers only worked for some of us."
A Chromatically Honest AI Agent
Why this section matters
A photoplethysmograph reads the pulse by shining light into the skin and measuring what comes back. Melanin, the pigment that darkens skin, absorbs that same light, most greedily at the green wavelengths most wearables use. So the identical device, worn identically, returns a weaker, noisier signal on darker skin. That is not an opinion or an edge case: it is optics, and it propagates straight into the numbers the device reports. In 2020 a hospital study showed that pulse oximeters, the red-and-infrared cousins of the wrist PPG, missed dangerously low blood oxygen nearly three times as often in Black patients as in white patients, and the finding reshaped an entire regulatory agenda. This section explains the physics of why skin tone biases optical sensing, why the historical calibration process baked that bias in, how to audit a pipeline for it, and what hardware, data, and algorithmic fixes actually move the needle. It is the ethical and the engineering core of the chapter at once.
This section assumes the pulse-waveform optics of Section 30.1 and the SpO2 ratio-of-ratios of Section 30.3, and it treats the PPG as a physical measurement \(x = h(s;\theta) + \eta\) whose response \(h\) and noise \(\eta\) both depend on skin optics, the sensor-model view of Chapter 2. The subgroup-auditing discipline draws on the leakage-safe evaluation of Chapter 5, the calibration machinery of Chapter 18, and the regulatory framing of Chapter 34. Signal-quality gating (Section 30.6) is the first and cheapest fairness tool, so it recurs here.
The optics: why melanin dims the signal
Melanin lives in the epidermis, the outermost skin layer, above the dermal capillary bed whose pulsing blood volume the PPG is trying to see. Light must cross the epidermis twice, on the way in and on the way back, so its intensity is attenuated by the Beer-Lambert factor \(e^{-2\,\mu_a d}\), where \(\mu_a\) is the epidermal absorption coefficient and \(d\) its thickness. Melanin dominates \(\mu_a\) across the visible band, and its absorption falls steeply with wavelength: it is strong in the green (around 530 nm, the workhorse LED of wrist wearables), weaker in the red (660 nm), and weakest in the near-infrared (940 nm). The pulsatile part of the signal, the small AC component riding on a large DC offset, carries the heartbeat. Roughly doubling epidermal melanin can cut that AC amplitude by a large factor while leaving the electronic noise floor unchanged, so the pulse-to-noise ratio collapses. The device is not broken; it is simply photon-starved.
Two engineering consequences follow directly. First, wavelength choice is a fairness choice: green maximizes pulsatile contrast on light skin but penalizes dark skin most, whereas red and infrared penetrate deeper and are far less melanin-sensitive, which is one reason SpO2 sensors use them. Second, the same missing photons that raise heart-rate error on dark skin also perturb the SpO2 ratio, because any wavelength-dependent attenuation that the calibration did not anticipate shifts the estimate. The bias is not random noise that averages out; it is a systematic offset tied to a protected characteristic, and averaging over a mostly light-skinned population simply hides it.
Calibration is where the bias entered, not the physics
Pulse oximeters do not compute oxygen saturation from first principles. They read the ratio of pulsatile absorbances at two wavelengths, \(R=(\mathrm{AC}/\mathrm{DC})_{660}/(\mathrm{AC}/\mathrm{DC})_{940}\), and map \(R\) to SpO2 through an empirical curve fitted on human volunteers desaturated under controlled conditions. If that calibration cohort was overwhelmingly light-skinned, as most historical cohorts were, the fitted curve encodes the optics of light skin and mispredicts on skin it never saw. The device then reads high on darker skin, reporting a reassuring 94% when arterial blood gas says 88%. This is "occult hypoxemia": low oxygen hidden behind a normal-looking number. The fix is not a better clip; it is a calibration set that spans the population, plus a curve that carries honest per-subgroup uncertainty. Skin tone is a textbook case of the distribution shift of Chapter 66: the calibration distribution and the deployment distribution simply differ.
Measuring skin tone properly, and auditing the gap
You cannot fix a disparity you refuse to measure, and you cannot measure it well with a bad ruler. The Fitzpatrick scale, a six-point dermatology classification built to predict sunburn, is the most common label, but it was designed around burning propensity in lighter skin, self-report is unreliable, and its upper categories compress most darker tones together. The measurement-grade alternative is the individual typology angle (ITA), a continuous quantity derived from colorimeter readings in the CIE L\*a\*b\* color space, \(\mathrm{ITA}=\arctan\!\big((L^{*}-50)/b^{*}\big)\cdot 180/\pi\), which correlates with objectively measured melanin content. When you build or consume a wearable dataset, prefer an objective melanin or ITA reading, record it as first-class metadata, and never let skin-tone labels leak through a per-recording split (Chapter 5): a model that learns "this individual" learns their skin along the way, and the disparity then hides inside memorization.
Auditing itself is disaggregation, not a single scalar. Compute your metric (heart-rate mean absolute error, occult-hypoxemia rate, AFib sensitivity) separately within each skin-tone stratum, report the worst-group value alongside the average, and treat the largest between-group gap as a headline number rather than a footnote. An aggregate that looks excellent can hide a group for whom the device barely works, because the well-served majority dominates the mean. The code below simulates this audit on an SpO2-style pipeline and shows how a globally modest bias decomposes into a benign light-skin residual and a clinically serious dark-skin offset.
import numpy as np
rng = np.random.default_rng(0)
n = 6000
# Skin-tone group: 0 = light, 1 = intermediate, 2 = dark
group = rng.choice([0, 1, 2], size=n, p=[0.55, 0.30, 0.15])
true_spo2 = rng.uniform(82, 99, size=n) # arterial ground truth
# Device reads high on darker skin: a group-dependent positive bias
bias_by_group = np.array([0.2, 1.1, 3.3]) # percentage points
noise = rng.normal(0, 1.2, size=n)
device_spo2 = true_spo2 + bias_by_group[group] + noise
def occult_rate(true_s, dev_s):
# 'Occult hypoxemia': truly hypoxemic (<= 88) but device reassures (>= 92)
hypoxemic = true_s <= 88
return np.mean(dev_s[hypoxemic] >= 92) if hypoxemic.any() else float("nan")
names = ["light", "intermediate", "dark"]
print(f"{'group':13s}{'mean bias':>10s}{'occult %':>10s}")
for g in (0, 1, 2):
m = group == g
print(f"{names[g]:13s}{device_spo2[m].mean()-true_spo2[m].mean():10.2f}"
f"{100*occult_rate(true_spo2[m], device_spo2[m]):10.1f}")
overall = 100 * occult_rate(true_spo2, device_spo2)
print(f"\nOverall occult rate: {overall:.1f}% "
f"; the dark-skin row is what that patient experiences")
Mitigation: hardware, data, and the calibration you keep
The fixes span the stack. In hardware, longer wavelengths (red and infrared rather than green alone), higher LED drive current with adaptive gain, multiple emitter-detector spacings, and denser diode arrays all recover photons on dark skin; a transmittance fingertip site sees more pulsatile signal than a reflectance wrist site. In data, the calibration and validation cohorts must span the full range of ITA, which historically they did not, and the split must be leakage-safe so a diverse-looking dataset cannot pass a per-subject shortcut. In algorithms, signal-quality gating (Section 30.6) is the honest first move: if the pulse-to-noise ratio is too low to trust, the device should abstain rather than emit a confident wrong number, and abstention rate then itself becomes a fairness metric you must equalize. Calibrated uncertainty (Chapter 18) lets the model widen its interval on hard-to-read skin instead of staying falsely narrow, and group-conditional conformal prediction can guarantee coverage within each stratum rather than only on average.
The pulse oximeter that reassured the wrong patients
During the COVID-19 pandemic, home and hospital pulse oximeters became triage instruments: an SpO2 threshold decided who got supplemental oxygen, antivirals, and a bed. A large retrospective study across intensive-care units found that oximeters overestimated true arterial saturation more often in Black than in white patients, so Black patients with genuinely low oxygen were more likely to read as fine and were therefore identified late for treatment they qualified for. The device had not failed a bench test; it passed its historical accuracy spec, which had been fitted and validated on a cohort that underrepresented darker skin. The consequence pushed the FDA to overhaul its pulse-oximeter guidance, requiring premarket studies to enroll participants across the full range of skin pigmentation and to report accuracy by pigmentation subgroup. The lesson generalizes to every optical wearable: a metric that is not disaggregated is a metric that can be biased and still look clean.
Right tool: disaggregated metrics in a few lines
Hand-rolling per-group means, worst-group selection, and bootstrap confidence intervals for a fairness audit runs to roughly 60 to 80 lines and is easy to get subtly wrong. Fairlearn's MetricFrame does it in about five: pass your metric function, the true and predicted labels, and a sensitive_features=skin_tone column, then read .by_group, .group_min(), and .difference(). The library handles the grouping, the per-stratum aggregation, and the worst-group and gap summaries, so your code states the fairness question instead of re-implementing the bookkeeping. It composes with any scikit-learn-style metric, including the occult-hypoxemia rate above wrapped as a callable.
Exercise
Extend the audit code with a signal-quality gate: draw a per-sample pulse-to-noise ratio whose mean falls with darker skin, and let the device abstain (emit no reading) when the ratio is below a threshold. Report, per group, the abstention rate and the occult-hypoxemia rate among the readings that survive. Then answer: does gating equalize the error, and at what cost in coverage for the dark-skin group? Discuss why "we simply refuse to answer more often for one group" is itself a fairness problem that a single accuracy number would never surface.
Self-check
- Why does green-light PPG show a larger skin-tone disparity than infrared, and what does that imply about the wavelengths you would choose for an equity-first wearable?
- A vendor reports a 1.5% overall SpO2 error and calls the device fair. What single reframing of that number would you demand before believing the claim?
- Explain how a per-recording (rather than per-subject) train-test split can make a skin-tone bias disappear from your metrics while leaving it fully present in deployment.
Lab 30
build a PPG heart-rate/AFib pipeline with signal-quality gating; audit performance across subgroups.
Bibliography
Pulse oximetry bias and clinical consequences
The landmark retrospective showing occult hypoxemia occurred roughly three times more often in Black than white patients; it launched the modern regulatory reckoning.
Links oximeter overestimation directly to delayed recognition of treatment eligibility during COVID-19, making the harm concrete and downstream.
Controlled desaturation study establishing that pigmentation-related bias grows precisely where it matters most, at low true saturation.
A current synthesis of the optics, the evidence, and the proposed hardware and calibration remedies.
Wearable heart rate and skin tone
Quantifies how skin tone, motion, and device interact to degrade consumer wrist heart-rate accuracy, the wearable analogue of the oximeter story.
Early multi-device benchmark noting skin-tone and body-mass effects on optical heart-rate error.
Broad review of wrist PPG physiology, artifact sources, and the fairness and validation gaps that remain.
Skin classification and regulation
The origin of the six-point scale, useful mainly to understand why it is a poor pigmentation ruler for optical sensing.
The regulatory response requiring pigmentation-diverse cohorts and subgroup accuracy reporting for oximeter clearance.
What's Next
In Chapter 31, we leave the pulsing capillary bed for the electrical storm of the brain. EEG, neural signals, and brain-computer interfaces bring their own version of the fairness-and-calibration problem, where hair, electrode contact, and inter-subject variability play the role melanin plays here, and where a signal even fainter than the PPG's must be pulled from noise before any inference is trusted.