Bone-marrow cell populations

A patient's bone marrow is measured one cell at a time. The quantity to report is the fraction of cells in each of six populations. This page reduces every cell to one of 8 categories chosen from the estimation problem, freezes the categories, and asks how well the fractions of patients the categories never saw can be recovered from 8 integer counts.

1. The cells and a patient's composition​

Flow cytometry passes cells one by one through a laser and records, for each cell, a forward-scatter and a side-scatter intensity and one fluorescence intensity per marker channel: twelve numbers per cell here. In the FlowCyt benchmark an expert has labelled every cell of thirty bone-marrow aspirates as one of six populations: T cells, B cells, monocytes, mast cells, the CD34-positive progenitors (HSPCs), and everything else. The clinical quantity is the composition, the fraction of a patient's cells in each population, and the differences between patients are what a report is about.

Cell-population composition of every patientOne stacked bar per patient, split into the five target populations at their true fractions; the dominant remaining compartment is left out. Held-out patients are marked; reference patients are not.Case 1Case 1 — T cells: 12.2%Case 1 — B cells: 2.2%Case 1 — monocytes: 2.3%Case 1 — mast cells: 0.0%Case 1 — HSPCs: 0.7%Case 2Case 2 — T cells: 2.9%Case 2 — B cells: 1.1%Case 2 — monocytes: 2.2%Case 2 — mast cells: 0.0%Case 2 — HSPCs: 1.8%Case 3Case 3 — T cells: 8.5%Case 3 — B cells: 2.3%Case 3 — monocytes: 1.5%Case 3 — mast cells: 0.0%Case 3 — HSPCs: 2.2%Case 4Case 4 — T cells: 7.2%Case 4 — B cells: 1.2%Case 4 — monocytes: 2.7%Case 4 — mast cells: 0.0%Case 4 — HSPCs: 1.1%▸ Case 5Case 5 — T cells: 5.2%Case 5 — B cells: 1.0%Case 5 — monocytes: 2.7%Case 5 — mast cells: 0.0%Case 5 — HSPCs: 1.8%▸ Case 6Case 6 — T cells: 2.7%Case 6 — B cells: 0.5%Case 6 — monocytes: 3.1%Case 6 — mast cells: 0.0%Case 6 — HSPCs: 1.4%Case 7Case 7 — T cells: 6.3%Case 7 — B cells: 0.8%Case 7 — monocytes: 0.5%Case 7 — mast cells: 0.0%Case 7 — HSPCs: 0.8%▸ Case 8Case 8 — T cells: 3.1%Case 8 — B cells: 1.1%Case 8 — monocytes: 0.3%Case 8 — mast cells: 0.0%Case 8 — HSPCs: 0.4%▸ Case 9Case 9 — T cells: 2.7%Case 9 — B cells: 0.0%Case 9 — monocytes: 0.9%Case 9 — mast cells: 0.0%Case 9 — HSPCs: 1.8%Case 10Case 10 — T cells: 12.9%Case 10 — B cells: 9.0%Case 10 — monocytes: 0.7%Case 10 — mast cells: 0.0%Case 10 — HSPCs: 0.1%▸ Case 11Case 11 — T cells: 2.9%Case 11 — B cells: 0.5%Case 11 — monocytes: 3.4%Case 11 — mast cells: 0.0%Case 11 — HSPCs: 1.6%Case 12Case 12 — T cells: 3.9%Case 12 — B cells: 0.3%Case 12 — monocytes: 1.0%Case 12 — mast cells: 0.0%Case 12 — HSPCs: 0.1%Case 13Case 13 — T cells: 5.5%Case 13 — B cells: 0.9%Case 13 — monocytes: 2.0%Case 13 — mast cells: 0.1%Case 13 — HSPCs: 0.6%Case 14Case 14 — T cells: 5.0%Case 14 — B cells: 1.3%Case 14 — monocytes: 0.6%Case 14 — mast cells: 0.0%Case 14 — HSPCs: 0.4%▸ Case 15Case 15 — T cells: 9.3%Case 15 — B cells: 1.3%Case 15 — monocytes: 1.2%Case 15 — mast cells: 0.0%Case 15 — HSPCs: 0.5%Case 16Case 16 — T cells: 17.3%Case 16 — B cells: 5.0%Case 16 — monocytes: 1.9%Case 16 — mast cells: 0.0%Case 16 — HSPCs: 0.9%Case 17Case 17 — T cells: 3.8%Case 17 — B cells: 4.0%Case 17 — monocytes: 2.1%Case 17 — mast cells: 0.0%Case 17 — HSPCs: 1.1%Case 18Case 18 — T cells: 6.3%Case 18 — B cells: 0.7%Case 18 — monocytes: 1.3%Case 18 — mast cells: 0.0%Case 18 — HSPCs: 0.8%Case 19Case 19 — T cells: 3.0%Case 19 — B cells: 0.8%Case 19 — monocytes: 0.6%Case 19 — mast cells: 0.0%Case 19 — HSPCs: 0.2%▸ Case 20Case 20 — T cells: 7.6%Case 20 — B cells: 0.6%Case 20 — monocytes: 0.9%Case 20 — mast cells: 0.0%Case 20 — HSPCs: 0.8%Case 21Case 21 — T cells: 5.6%Case 21 — B cells: 1.4%Case 21 — monocytes: 0.8%Case 21 — mast cells: 0.0%Case 21 — HSPCs: 0.9%Case 22Case 22 — T cells: 4.7%Case 22 — B cells: 1.6%Case 22 — monocytes: 0.6%Case 22 — mast cells: 0.0%Case 22 — HSPCs: 0.6%▸ Case 23Case 23 — T cells: 5.7%Case 23 — B cells: 1.5%Case 23 — monocytes: 0.9%Case 23 — mast cells: 0.1%Case 23 — HSPCs: 0.9%Case 24Case 24 — T cells: 11.1%Case 24 — B cells: 0.6%Case 24 — monocytes: 1.1%Case 24 — mast cells: 0.0%Case 24 — HSPCs: 0.6%Case 25Case 25 — T cells: 3.7%Case 25 — B cells: 0.1%Case 25 — monocytes: 1.1%Case 25 — mast cells: 0.0%Case 25 — HSPCs: 0.4%Case 26Case 26 — T cells: 13.6%Case 26 — B cells: 0.3%Case 26 — monocytes: 5.2%Case 26 — mast cells: 0.1%Case 26 — HSPCs: 2.0%Case 27Case 27 — T cells: 3.9%Case 27 — B cells: 5.4%Case 27 — monocytes: 1.0%Case 27 — mast cells: 0.0%Case 27 — HSPCs: 0.4%▸ Case 28Case 28 — T cells: 3.0%Case 28 — B cells: 0.0%Case 28 — monocytes: 1.3%Case 28 — mast cells: 0.0%Case 28 — HSPCs: 0.8%Case 29Case 29 — T cells: 5.0%Case 29 — B cells: 0.3%Case 29 — monocytes: 0.6%Case 29 — mast cells: 0.0%Case 29 — HSPCs: 0.5%▸ Case 30Case 30 — T cells: 9.2%Case 30 — B cells: 0.1%Case 30 — monocytes: 0.6%Case 30 — mast cells: 0.0%Case 30 — HSPCs: 2.3%
  • T cells
  • B cells
  • monocytes
  • mast cells
  • HSPCs
▸ marks the ten held-out patients, frozen before any fitting.

Each bar is one patient's composition over the five target populations, drawn at their true fractions; the dominant remaining compartment, about nine tenths of every patient, is left out so the variation is visible. The spread between patients is the thing being measured, and it is much wider than any of the estimation errors below.

The cohort was split once, before anything was fitted, into twenty reference patients the categories are built from and 10 held-out patients that nothing downstream has seen. Every number on this page that is called held out was computed on those 10 patients.

2. Why compress the cells​

A patient's cells can be fitted directly, cell by cell, and the result section below does exactly that as the reference. The reason to reduce them to a handful of integer counts is that counts are what can be archived, transmitted, audited and compared across instruments: a category rule plus 8 integers is a summary a laboratory can publish, whereas a hundred thousand continuous classifier outputs is not. The cost of the compression is the question.

There is a floor on how few categories can work. Six fractions that sum to one have 5 free coordinates, and a fixed number of cells spread over BB categories gives only B−1B - 1 independent counts. Five categories therefore cannot identify the composition, whatever they are: with 4 independent counts for 5 unknowns the fit has a flat direction. The bin-budget section shows that this is exactly what happens.

3. From marker channels to a score​

FS INT intensity distribution by cell populationBinned intensity densities for FS INT, one outline per shown population.
FS INT
SS INT intensity distribution by cell populationBinned intensity densities for SS INT, one outline per shown population.
SS INT
FL1 INT_CD14-FITC intensity distribution by cell populationBinned intensity densities for FL1 INT_CD14-FITC, one outline per shown population.
FL1 INT_CD14-FITC
FL2 INT_CD19-PE intensity distribution by cell populationBinned intensity densities for FL2 INT_CD19-PE, one outline per shown population.
FL2 INT_CD19-PE
FL3 INT_CD13-ECD intensity distribution by cell populationBinned intensity densities for FL3 INT_CD13-ECD, one outline per shown population.
FL3 INT_CD13-ECD
FL4 INT_CD33-PC5.5 intensity distribution by cell populationBinned intensity densities for FL4 INT_CD33-PC5.5, one outline per shown population.
FL4 INT_CD33-PC5.5
FL5 INT_CD34-PC7 intensity distribution by cell populationBinned intensity densities for FL5 INT_CD34-PC7, one outline per shown population.
FL5 INT_CD34-PC7
FL6 INT_CD117-APC intensity distribution by cell populationBinned intensity densities for FL6 INT_CD117-APC, one outline per shown population.
FL6 INT_CD117-APC
FL7 INT_CD7-APC700 intensity distribution by cell populationBinned intensity densities for FL7 INT_CD7-APC700, one outline per shown population.
FL7 INT_CD7-APC700
FL8 INT_CD16-APC750 intensity distribution by cell populationBinned intensity densities for FL8 INT_CD16-APC750, one outline per shown population.
FL8 INT_CD16-APC750
FL9 INT_HLA-PB intensity distribution by cell populationBinned intensity densities for FL9 INT_HLA-PB, one outline per shown population.
FL9 INT_HLA-PB
FL10 INT_CD45-KO intensity distribution by cell populationBinned intensity densities for FL10 INT_CD45-KO, one outline per shown population.
FL10 INT_CD45-KO
  • T cells
  • B cells
  • monocytes
  • mast cells
  • HSPCs

Every channel, drawn as a density per population, with the dominant compartment hidden so the rest are visible at all. The horizontal axis is the robust arcsinh (cofactor 150), the study's own transform: on a linear intensity axis every panel collapses into one spike against the origin. The two scatter channels separate the broad compartments, CD34 is what makes the smallest compartment visible, and CD45, the pan-leukocyte backbone, is where everything overlaps. No single channel separates the populations. What separates them is the joint distribution of all twelve, and that is what the score captures.

ScoreQuant works with the score of a cell: the derivative of the log likelihood of the cell with respect to the parameters being estimated, one coordinate per parameter. For a mixture of six populations with fractions θ\theta and the last population absorbed as the simplex reference, the score has five coordinates, and each is a function of the ratios between the population densities at the cell. Nobody has those densities, so they are estimated: a classifier cross-fitted across the reference patients gives each cell a calibrated posterior over the populations, dividing by the training proportions turns posteriors into density ratios, and the mixture parameterization turns ratios into the score.

  • T cells
  • B cells
  • monocytes
  • mast cells
  • HSPCs

Two of the boxes in that chain are deliberately not ScoreQuant: the classifier is not, and the mixture likelihood that finally turns counts into fractions is not. What the library receives is a table of score rows with their weights, declared as an estimated ratio rather than an exact score, so nothing downstream can describe the result in exact-Fisher language. The classifier, its calibration and its cross-fitting protocol are on the score-model page (opens in a new tab) of the reference study.

4. The reference patients and the call​

The code on this page runs the whole chain on a committed fixture-scale table: 7,038 reference cells the rule is fitted on, 3,518 further reference cells kept apart to calibrate the categories, and 10,240 cells of the 10 held-out patients. The numbers displayed on the page come from the full study on 600,000 cells, and the closing section says what the fixture-scale run gives instead.

import numpy as np

import scorequant as sq
from examples.cell_population import fit_binned_mixture, fit_unbinned_mixture
from examples.cell_population.likelihood import estimate_bin_templates

table = np.load("examples/data/flowcyt_walkthrough.npz")
parameters = tuple(str(name) for name in table["schema"])
theta0 = table["theta0"]

reference = sq.ScoreSample(
table["partition_scores"].astype(float),
table["partition_weights"],
schema=sq.ScoreSchema(parameters),
provenance=sq.ScoreProvenance(
kind="estimated_ratio",
description="patient-cross-fitted calibrated FlowCyt mixture score",
),
)
assert reference.provenance.exact_fisher is False

The weights make the reference measure: every reference patient counts equally within a population, and the populations are weighted by the reference composition, so no single patient's abundance sets the categories. The call takes the source, a bin budget, a criterion and the configuration of the solver that criterion selects.

quantizer = sq.fit_quantizer(
reference,
n_bins=8,
criterion=sq.DOptimality(),
config=sq.SoftVoronoiConfig(seed=2026, initializer_restarts=4, max_steps=160),
)
assert quantizer.n_bins == 8
assert quantizer.information_kind == "supplied_score_surrogate"

DOptimality treats every population fraction as equally worth keeping: it maximises the determinant of the information the 8 labels carry about the five fractions, which is the same as minimising the volume of their joint uncertainty ellipsoid. The soft Voronoi solver relaxes the hard assignment into a temperature-annealed soft one, optimises the cell centres, and hardens at the end. The result is a rule: a function from a cell's five score coordinates to a category, which is what makes it applicable to patients it never saw. This is the distinction the whole page rests on. A partition of the reference rows would label those rows and stop; fit_quantizer returns something that labels the next patient.

5. What the eight categories are​

A five-dimensional partition cannot be drawn, but it can be described without projecting it: for each category, the probability that a cell landing there belongs to each population, at the reference composition.

Reference population composition of each learned bin, as probabilities that sum to one across a row.
BinT cellsB cellsmonocytesmast cellsHSPCsother
bin 60.940.000.000.000.000.06
bin 10.010.860.010.000.010.11
bin 40.160.330.170.030.190.12
bin 20.150.310.150.080.180.13
bin 50.010.030.840.000.010.10
bin 30.020.040.020.000.780.14
bin 00.000.000.000.000.001.00
bin 70.060.120.060.010.310.45
Each row is one of the 8 learned categories; each entry is the probability that a cell in that category belongs to the column population, at the reference composition.

Six of the 8 categories act as gates: each is dominated by one population, including one for the rare progenitors and one for the mast cells, which is the category a single marker could not have found. The remaining two are mixed. They are not a failure of the fit. A gate per population would spend six categories and identify the composition only through the gates' purities; the mixed categories are where the classifier is uncertain, and keeping them as their own counts is what lets the fit separate the populations along the directions the gates confuse. The criterion chose them because they carry information about the fractions, not because they look like anything on a two-channel plot.

6. Applying the frozen rule to held-out patients​

The rule is frozen. It is applied to the calibration cells, whose expert labels give each category's probability under each population, P(bin∣population)P(\text{bin} \mid \text{population}); and to the held-out cells, whose predicted categories are counted per patient. The count vector and the calibration table are the whole input to the mixture fit. The held-out labels are used only afterwards, to score the estimate.

template_bins = quantizer.predict_scores(table["template_scores"].astype(float))
templates = estimate_bin_templates(
table["template_labels"], template_bins, table["template_patients"], n_bins=8
)

held_out_scores = table["held_out_scores"].astype(float)
held_out_patients = table["held_out_patients"]
held_out_bins = quantizer.predict_scores(held_out_scores)

patients = np.unique(held_out_patients)
counts = np.array([np.bincount(held_out_bins[held_out_patients == p], minlength=8) for p in patients])
binned = np.array([fit_binned_mixture(row, templates).fractions for row in counts])
unbinned = np.array(
[
fit_unbinned_mixture(table["held_out_ratios"][held_out_patients == p].astype(float)).fractions
for p in patients
]
)
expert = np.array(
[
np.bincount(table["held_out_labels"][held_out_patients == p], minlength=6)
/ np.count_nonzero(held_out_patients == p)
for p in patients
]
)
assert counts.shape == (len(patients), 8)
assert binned.shape == unbinned.shape == expert.shape

The unbinned fit is the reference the compression is measured against: the same classifier's continuous ratios, straight into the mixture likelihood, with no compression at all. The macro RMSE below is the root-mean-square error of the fitted fractions over the 10 held-out patients, averaged over the five target populations.

def macro_rmse(estimate):
per_population = np.sqrt(np.mean((estimate - expert) ** 2, axis=0))
return float(np.mean(per_population[:5]))


binned_rmse = macro_rmse(binned)
unbinned_rmse = macro_rmse(unbinned)

7. The result​

Held-out macro RMSE, from the counts
0.001929
Error in the recovered population fractions from the eight counts, averaged over the five target populations and the held-out patients. The quantity this page estimates.
Held-out macro RMSE, unbinned
0.001728
The same estimate with no compression: the continuous classifier ratios straight into the mixture fit. The floor the counts are measured against.
Held-out D-efficiency
0.9846
Geometric mean of the eigenvalues of the binned information relative to the unbinned information on the held-out cells: the fraction of the score's information the eight labels keep.
Information kind
supplied_score_surrogate
What the library calls this result. The scores were estimated by a classifier, so it is a surrogate and never exact Fisher information.
The full study on 600,000 cells, at 8 categories. Every number is measured on the 10 held-out patients.
Estimated against expert population fractions for the held-out patientsLog-log scatter of the fitted fraction of each population against the expert composition, one mark per held-out patient and population. Filled marks are the estimates from the bin counts; hollow marks are the unbinned classifier-ratio estimates. The diagonal is perfect agreement.Case 5, T cells: expert 0.0522, from counts 0.0486Case 5, T cells: expert 0.0522, unbinned 0.0519Case 5, B cells: expert 0.0098, from counts 0.0085Case 5, B cells: expert 0.0098, unbinned 0.0095Case 5, monocytes: expert 0.0273, from counts 0.0285Case 5, monocytes: expert 0.0273, unbinned 0.0278Case 5, mast cells: expert 0.0001, from counts 0.0000Case 5, mast cells: expert 0.0001, unbinned 0.0001Case 5, HSPCs: expert 0.0181, from counts 0.0189Case 5, HSPCs: expert 0.0181, unbinned 0.0178Case 6, T cells: expert 0.0274, from counts 0.0232Case 6, T cells: expert 0.0274, unbinned 0.0269Case 6, B cells: expert 0.0049, from counts 0.0056Case 6, B cells: expert 0.0049, unbinned 0.0064Case 6, monocytes: expert 0.0307, from counts 0.0284Case 6, monocytes: expert 0.0307, unbinned 0.0277Case 6, mast cells: expert 0.0001, from counts 0.0000Case 6, mast cells: expert 0.0001, unbinned 0.0001Case 6, HSPCs: expert 0.0144, from counts 0.0144Case 6, HSPCs: expert 0.0144, unbinned 0.0136Case 8, T cells: expert 0.0306, from counts 0.0268Case 8, T cells: expert 0.0306, unbinned 0.0288Case 8, B cells: expert 0.0109, from counts 0.0104Case 8, B cells: expert 0.0109, unbinned 0.0106Case 8, monocytes: expert 0.0031, from counts 0.0009Case 8, monocytes: expert 0.0031, unbinned 0.0026Case 8, mast cells: expert 0.0001, from counts 0.0000Case 8, mast cells: expert 0.0001, unbinned 0.0000Case 8, HSPCs: expert 0.0040, from counts 0.0027Case 8, HSPCs: expert 0.0040, unbinned 0.0033Case 9, T cells: expert 0.0269, from counts 0.0226Case 9, T cells: expert 0.0269, unbinned 0.0225Case 9, B cells: expert 0.0003, from counts 0.0000Case 9, B cells: expert 0.0003, unbinned 0.0000Case 9, monocytes: expert 0.0088, from counts 0.0088Case 9, monocytes: expert 0.0088, unbinned 0.0091Case 9, mast cells: expert 0.0001, from counts 0.0000Case 9, mast cells: expert 0.0001, unbinned 0.0000Case 9, HSPCs: expert 0.0175, from counts 0.0148Case 9, HSPCs: expert 0.0175, unbinned 0.0137Case 11, T cells: expert 0.0285, from counts 0.0250Case 11, T cells: expert 0.0285, unbinned 0.0262Case 11, B cells: expert 0.0053, from counts 0.0037Case 11, B cells: expert 0.0053, unbinned 0.0050Case 11, monocytes: expert 0.0340, from counts 0.0370Case 11, monocytes: expert 0.0340, unbinned 0.0348Case 11, mast cells: expert 0.0001, from counts 0.0000Case 11, mast cells: expert 0.0001, unbinned 0.0000Case 11, HSPCs: expert 0.0158, from counts 0.0116Case 11, HSPCs: expert 0.0158, unbinned 0.0111Case 15, T cells: expert 0.0934, from counts 0.0948Case 15, T cells: expert 0.0934, unbinned 0.0956Case 15, B cells: expert 0.0134, from counts 0.0114Case 15, B cells: expert 0.0134, unbinned 0.0120Case 15, monocytes: expert 0.0123, from counts 0.0118Case 15, monocytes: expert 0.0123, unbinned 0.0122Case 15, mast cells: expert 0.0001, from counts 0.0000Case 15, mast cells: expert 0.0001, unbinned 0.0000Case 15, HSPCs: expert 0.0046, from counts 0.0032Case 15, HSPCs: expert 0.0046, unbinned 0.0038Case 20, T cells: expert 0.0757, from counts 0.0710Case 20, T cells: expert 0.0757, unbinned 0.0715Case 20, B cells: expert 0.0062, from counts 0.0048Case 20, B cells: expert 0.0062, unbinned 0.0051Case 20, monocytes: expert 0.0086, from counts 0.0080Case 20, monocytes: expert 0.0086, unbinned 0.0087Case 20, mast cells: expert 0.0001, from counts 0.0000Case 20, mast cells: expert 0.0001, unbinned 0.0000Case 20, HSPCs: expert 0.0078, from counts 0.0094Case 20, HSPCs: expert 0.0078, unbinned 0.0092Case 23, T cells: expert 0.0570, from counts 0.0541Case 23, T cells: expert 0.0570, unbinned 0.0567Case 23, B cells: expert 0.0154, from counts 0.0161Case 23, B cells: expert 0.0154, unbinned 0.0157Case 23, monocytes: expert 0.0086, from counts 0.0070Case 23, monocytes: expert 0.0086, unbinned 0.0081Case 23, mast cells: expert 0.0015, from counts 0.0007Case 23, mast cells: expert 0.0015, unbinned 0.0014Case 23, HSPCs: expert 0.0089, from counts 0.0083Case 23, HSPCs: expert 0.0089, unbinned 0.0084Case 28, T cells: expert 0.0303, from counts 0.0303Case 28, T cells: expert 0.0303, unbinned 0.0307Case 28, B cells: expert 0.0001, from counts 0.0000Case 28, B cells: expert 0.0001, unbinned 0.0000Case 28, monocytes: expert 0.0132, from counts 0.0137Case 28, monocytes: expert 0.0132, unbinned 0.0138Case 28, mast cells: expert 0.0001, from counts 0.0000Case 28, mast cells: expert 0.0001, unbinned 0.0001Case 28, HSPCs: expert 0.0084, from counts 0.0037Case 28, HSPCs: expert 0.0084, unbinned 0.0038Case 30, T cells: expert 0.0918, from counts 0.0831Case 30, T cells: expert 0.0918, unbinned 0.0810Case 30, B cells: expert 0.0008, from counts 0.0000Case 30, B cells: expert 0.0008, unbinned 0.0010Case 30, monocytes: expert 0.0058, from counts 0.0046Case 30, monocytes: expert 0.0058, unbinned 0.0049Case 30, mast cells: expert 0.0001, from counts 0.0000Case 30, mast cells: expert 0.0001, unbinned 0.0000Case 30, HSPCs: expert 0.0227, from counts 0.0223Case 30, HSPCs: expert 0.0227, unbinned 0.0202
  • T cells
  • B cells
  • monocytes
  • mast cells
  • HSPCs
Filled: fitted from the eight counts. Hollow: fitted from the unbinned classifier ratios. An estimate of exactly zero is drawn on the lower edge.

Every held-out patient and every target population sits on the diagonal at every abundance, from the mast cells near one part in ten thousand to the T cells near one in ten, and the filled marks from the 8 counts sit where the hollow unbinned marks sit. Compression costs, as it must: the information carried by a label is never more than the information carried by the thing it replaced, and the binned error is above the unbinned one. The finding is the size of the cost. The two errors are of the same order, and both are far below the spread between patients in the first chart, so replacing a patient's cells with 8 integers does not change what the report says.

The exact finite-D solver, run on the same reference rows and compiled into its Voronoi rule, reaches 0.002094 on the same patients with a D-efficiency of 0.9853: slightly worse on the error, slightly better on the information. The two disagree in opposite directions because the downstream fit is a fixed-total multinomial likelihood on the counts, not the local Fisher quadratic the criterion optimises, so any sentence about this study has to say which method produced the number in it. Both are on the solver-comparison page (opens in a new tab).

8. Why it works: the retained information​

The D-efficiency is the explanation, not the headline. The 8 labels keep 0.9846 of the information the estimated score carries about the five fractions, on cells the rule never saw; the criterion optimised that quantity on the reference cells, and it transferred. A high retained information is a local, quadratic statement about the likelihood near the reference composition, and the held-out patients differ from the reference composition, so the retention does not guarantee the estimation error; it makes it unsurprising.

What the retention measures is how much of the estimated score the labels keep, a number that stays high whether or not the estimate itself is good. The density-ratio page measures the gap between those two things on a problem where the exact score is known; the unbinned row of the table above is this page's own check, because a poor estimate would have shown up there first.

9. What simpler reductions retain​

Every method below sees the same reference cells, gets the same budget, is frozen the same way and is scored the same way: fit the fractions from the counts on the held-out patients, and measure the result against the expert composition.

Held-out D-efficiency at 8 bins, compared across 5 binning methodsHigher is better. The ScoreQuant row is drawn in the accent colour.Grid on two marker PCs0.0223One score direction0.0378k-means on the markers0.0704Soft Voronoi0.9846D exchange0.985300.2000.4000.6000.8001Held-out D-efficiency at 8 bins
Held-out D-efficiency at 8 bins, compared across 5 binning methods
MethodHeld-out D-efficiency at 8 bins
Grid on two marker PCs0.0223
One score direction0.0378
k-means on the markers0.0704
Soft Voronoi (ScoreQuant)0.9846
D exchange (ScoreQuant)0.9853
Three ordinary reductions against the two information-optimal ones, at the same bin budget on the same held-out cells.

A rectangular grid on the two leading principal components of the marker channels is a two-dimensional gate with straight edges. Clustering the twelve-dimensional marker vectors groups cells that look alike and counts the groups. Cutting a single score direction into intervals keeps the classifier output but summarises it in one dimension. All three land an order of magnitude away on estimation error as well, at every budget:

Held-out macro RMSE against bin budget, by binning methodLower is better. ScoreQuant methods are drawn solid and coloured; convenience baselines are dashed and grey. The horizontal line is the unbinned classifier-ratio estimate.Unbinned classifier ratio
  • D exchange (compiled)
  • k-means on raw markers
  • One score direction
  • Normalized trace (k-means)
  • Soft Voronoi
  • Two-dimensional grid
  • Unbinned classifier ratio

10. The bin budget​

Held-out D-efficiency against bin budget, by binning methodHigher is better, on a linear axis from zero to one. ScoreQuant methods are drawn solid and coloured; convenience baselines are dashed and grey.
  • D exchange (compiled)
  • k-means on raw markers
  • One score direction
  • Normalized trace (k-means)
  • Soft Voronoi
  • Two-dimensional grid

Five bins fail, as the second section said they must: the held-out D-efficiency is 0.3911 and the macro RMSE 0.030002, because 4 independent counts cannot resolve 5 fractions and the fit has a flat direction. Eight is the knee: 0.9846 retained and 0.001929 error. Ten bins retain 0.9903 and reach 0.002023; thirty retain 0.9984 and reach 0.002600. More categories keep more of the local information, and the fraction estimates get no better, because the calibration table has more entries to estimate from the same reference cells and the smallest categories run empty on some patients. The simpler reductions do improve with more bins, the grid from 0.083325 at eight to 0.062011 at thirty, and remain an order of magnitude away.

11. Limits, and how to reproduce this​

The fixture-scale run is not the full study. The code on this page, run on the committed table, gives a held-out macro RMSE of 0.0090 from the counts against 0.0016 unbinned, with a held-out D-efficiency of 0.9774. The information retention is close to the full study's; the estimation error is several times worse, because the calibration table P(bin∣population)P(\text{bin} \mid \text{population}) is estimated from 3,518 cells instead of hundreds of thousands, and at that size the calibration, not the categories, limits the fit. The full study's numbers, the ones displayed above, come from 600,000 cells drawn from the complete benchmark.

The score is a surrogate. The classifier's ratios are estimated, so the result is recorded as supplied_score_surrogate, never as exact Fisher information.

Aiming at one fraction does not help here. The study also asked for the categories that best resolve the progenitor fraction alone, with the rest of the composition profiled out. On the committed fixture the plain D partition already retains 0.9954 of that profiled information against a certified ceiling of 0.9997, so there was almost nothing left for a profiled criterion to win. That negative result is on the profiled-criterion page (opens in a new tab).

The data. The benchmark is © Bini, Nassajian Mojarrad, Liarou, Matthes, Marchand-Maillet (CHIL 2024), licensed CC-BY-NC-SA-4.0, and lives in its source repository; this repository does not redistribute it. What is committed is a small deterministic fixture, the fixture-scale walkthrough table this page runs on, and the evidence file of the full study. The acquisition protocol, the per-patient estimates, the solver comparison and the uncertainty audit are in the FlowCyt case study (opens in a new tab).

JAX_ENABLE_X64=1 MPLBACKEND=Agg uv run python -m examples.cell_population --full
uv run python website/scripts/generate_showcase.py --force