Skip to content

Rounding and heaping of estimated blood loss

Recorded estimated blood loss is a mixture of 5 rounding modes (preferred small values, 500 mL, 100 mL, 50 mL, 10 mL (base)); the model gives the true value's distribution for each record.

Date 2026-10-18
Status current
Methods Rounding, heaping and value resolution
Variables Estimated blood loss

Background

  • Estimated blood loss (intraop_ebl) is a hand-entered EMR total.
  • It behaves differently from urine output in two ways: the rounding grain grows with the size of the estimate, and 50 mL looks like a default for "minimal" loss.
  • Blood loss is itself an estimate. Nothing is measured to the millilitre, so the "true" value is what a careful estimator would have said, and rounding absorbs estimation coarseness as well as charting preference.

Data

  • 3,987 non-missing values (2,401 missing, 38%) and 11 zeros. The maximum is 30,100 mL, and 214 values are above 1,000 mL.
  • 17 positive values are not multiples of 5 (e.g. 2, 12, 472 mL). Only 26 (0.7%) are odd multiples of 5, so the resolution is overridden to 10 mL.
  • Cases with a recorded blood loss are longer (median 3.6 h, against 2.0 h when missing). Blood loss and urine output are both missing in 1,659 cases.
  • The fit uses 3,933 positive values on the 10 mL grid.

Method

  • Heaping was screened by magnitude: the share of values whose coarsest anchor is 10, 50, 100, 500 or 1,000 mL, in seven recorded ranges.
  • All candidate models use a log-spline latent with K = 6.
  • Relative modes (leading digit, half, tenth) were compared with absolute modes (500, 100, 50 mL on a 10 mL base), both with propensities that vary with log volume.
  • A preferred-value set {10, 20, 30, 50} below 75 mL was added and tested.
  • A separate nominal 50 mL component below a threshold T was tested on top (best T = 200 mL).
  • The model was refitted without the 30,100 mL value to check its influence.

Results

Spike histogram of recorded values with model predictions overlaid; spikes on round numbers.
Every recorded value (blue lines) against what the fitted model predicts (orange dots): its rounding rules applied to its true-value density. Heaps on round numbers are the rounding modes.
  • The grain scales with magnitude. Below 50 mL, 95% of values are multiples of 10. From 100 mL the dominant step is 100 mL, and above 500 mL the 500 and 1,000 mL anchors appear.
  • 50 mL holds 795 records, 20% of all values, and the 50–99 mL band is 91% exactly 50. Meanwhile 40 mL has only 14 records against 155 at 30 mL.
  • Neighbours of anchors are almost empty: the multiples of 10 from 60 to 90 mL total 75 records against 627 at 100 mL.
  • Absolute modes beat relative modes decisively (AIC lower by more than 2,500). Relative modes cannot produce the 50 mL steps that dominate 100–999 mL.
  • Below 75 mL, about 40% of estimates go to the nearest of 10, 20, 30 or 50 mL, skipping 40. This captures both the 50 mL heap and the missing 40s.
  • Representative posteriors: a recorded 30 mL has 95% interval 25.5–39.5 mL; 50 mL, 26.5–73.5; 300 mL, 254.5–344.5; 1,000 mL, 779.5–1,188.5.
  • Since vitaldb-resolution v0.6.0 (18 October; model version 2): anaesthesia duration is a covariate of the latent volume (BIC better by 1,751). Department on the rounding propensities made the fit worse (BIC +51) and is not used. Rounding to the nearest anchor beats floor rounding by BIC.

Discussion

  • Relative precision of this kind is typical of a visual estimate, so every mode's propensity has to depend on magnitude, not just one.
  • A nominal "minimal loss" 50 mL component adds little once the preferred-value set is in (BIC within 4). The working model omits it.
  • The 30,100 mL value does not distort the fit. Without it, the latent median (137 mL) and all propensities are unchanged to two decimal places; only the latent 99th percentile moves (3,636 to 3,549 mL).
  • The preferred-value set introduced a new mode type ("set") to the engine.

Limitations

  • Some misfit remains, mostly too few 70–80 mL and too many 90 mL predictions.
  • Capture windows are much wider than for urine output, because anchor neighbours are nearly empty.
  • The 30,100 mL value is kept and flagged.

Model

Model file: …/models/intraop_ebl.model.json. Read from the pinned snapshot of vitaldb-resolution at commit bb03ddfc8a (2026-10-18).

How a true value becomes the recorded one. The rules are tried in order: a record not taken by an earlier rule is taken by this one with the probability shown (where its condition holds); the last rule takes the rest. Shares of all records depend on the conditions and the true value, so the model must be evaluated for them; the probabilities below are the fitted ones.

Order Rule Rounds to Probability if reached Applies when
1 preferred small values nearest 42.1 % true value below 75
2 500 mL 500 mL (nearest) 1.9 % varies with the value (shown at 150)
3 100 mL 100 mL (nearest) 23.8 % varies with the value (shown at 150)
4 50 mL 50 mL (nearest) 87.7 % varies with the value (shown at 150)
5 10 mL (base) 10 mL (nearest) the rest always
Recorded resolution 1 (modelled at 10)
True-value density log_spline
Fitted on 3,882 records (VitalDB clinical_data.csv (intraop_ebl), positive values on the 10 mL grid with a usable anaesthesia duration)
BIC 22,390
Fitted 2026-10-18
  • Only 0.7% of values are odd multiples of 5 and 17 are off any 5 mL grid; working resolution 10 mL.

Worked examples

Example Side Status Summary
Intraoperative fluid balance as a distribution value draft Fluids in minus fluids out, each a heaped charted volume, as a distribution per case: the recording alone makes a balance uncertain by about ±60 mL, and by ±190 mL when the blood loss was written as a round 500 mL.

Code

Tags: generated, vitaldb-resolution