Chapter 5

Chapter 5: Analytical Validation Protocol and Quality Control

Before a biomarker can be judged against disease, the assay must be judged against itself: how the specimen was handled, how low it can see, how much it scatters, whether it is right, how long the analyte survives, what "normal" looks like, and how the laboratory notices when the method drifts.

Chapter 2 treated each biomarker value as a fixed number and asked how well that number separates patients with and without a condition. That question only makes sense if the number itself is trustworthy. A sensitivity of 84 % measured with an assay whose between-run coefficient of variation is 25 % describes the assay's noise as much as the biology. Analytical validation is the step in the life cycle introduced in Chapter 1 that establishes, with its own experiments and its own acceptance criteria, that the measurement procedure produces results that are fit for the intended use. Only then does clinical validation (Chapter 6) have something stable to validate.

WIA-BIO-004 addresses analytical performance in three places: the main specification (§3.1.2 pre-analytical requirements, §3.2 measurement standards and quality control, §3.3.1 reference intervals), the quality-metrics phase annex (validation levels, analytical metrics, stability metrics and quality control), and a handful of constants in the @wia/bio-004 SDK. These sources do not always agree on numeric limits. This chapter follows the order in which a laboratory actually works—specimen, detection capability, precision, trueness and linearity, stability, reference intervals, routine QC—and closes with a single reconciliation table that names every source and states which limit this book applies and why.

5.1 The Pre-analytical Protocol

Why the specimen comes first

Much of the variation that ends up in a biomarker data set is introduced before the specimen reaches the analyser. A patient who has just eaten, a sample drawn in the evening instead of the morning, a tourniquet left on while the phlebotomist searches for a vein, plasma left on the cells for half a day, a tube thawed and refrozen several times: each of these can shift the measured concentration of some analytes by more than the analytical imprecision of a good assay. Because these effects differ between cases and controls whenever the two groups are collected under different conditions—a classic weakness of convenience case-control sets—they can manufacture or hide a diagnostic signal. The pre-analytical protocol exists to hold these factors constant, or at least to record them so that they can be analysed.

Section 3.1.2 of the specification lists eight controlled factors in two groups. At collection: fasting status where the analyte requires it, time of day (to control for circadian variation), patient position (sitting or standing), and a tourniquet time of less than one minute for blood. During processing: time to processing of less than two hours for plasma, centrifugation speed and time, storage temperature, and fewer than three freeze-thaw cycles.

Mapping each factor to data

A protocol that is followed but not recorded cannot be audited, and a factor that is not recorded cannot be used as a covariate later. The practical question is therefore where each pre-analytical factor lives in a WIA-BIO-004 record. Some have a dedicated field; several do not, and v1.0 offers no normative slot for them. The table below shows the current state.

Factor (§3.1.2)Where it is recordedComment
Fasting statuspatient.fastingStatus (§7.1); PatientSample.fastingStatus (SDK)Boolean only; the length of the fast is not captured.
Time of daydateCollectedStored in UTC. Circadian analysis needs local clock time, so keep the site time zone or the local timestamp as well.
PostureNo fieldRecord in an extension object (see below).
Tourniquet timeNo fieldRecord in seconds in an extension object.
Time to processingNot derivabledateMeasured − dateCollected is collection-to-analysis time, not collection-to-centrifugation time.
CentrifugationsampleDetails.collectionMethod / storageConditions (SDK, free text)Free text is not machine-checkable; prefer structured values.
Storage temperaturesampleDetails.storageConditions (SDK, free text)As above.
Freeze-thaw cyclesNo fieldCount explicitly; add a note to qualityFlags.other when the limit is reached.
Specimen integrityqualityFlags.hemolyzed, lipemic, icteric; SDK adds clotted, diluted, outOfRange, other[]The only pre-analytical information with first-class boolean fields.

Until a later version adds a normative structure, this book keeps the missing factors in the SDK's metadata object on BiomarkerMeasurement, under a sub-object called preAnalytical. The name is a convention of this book, not a v1.0 field; what matters is that the same names are used consistently across every site in a study. The values below are illustrative.

{
  "id": "M-000731",
  "biomarkerID": "BIO-12345",
  "value": 12.5,
  "unit": "mg/L",
  "sampleType": "blood_serum",
  "dateCollected": "2025-01-15T08:30:00Z",
  "dateMeasured": "2025-01-15T10:45:00Z",
  "qualityFlags": { "hemolyzed": false, "lipemic": false, "icteric": false, "other": [] },
  "metadata": {
    "preAnalytical": {
      "collectionLocalTime": "2025-01-15T17:30:00+09:00",
      "posture": "sitting",
      "tourniquetSeconds": 40,
      "minutesToCentrifugation": 55,
      "centrifugation": { "rcfG": 1500, "minutes": 10, "temperatureC": 20 },
      "storageTemperatureC": -80,
      "freezeThawCycles": 1
    },
    "qcRunID": "RUN-2025-01-15-02"
  }
}

Two details in this record deserve comment. First, collectionLocalTime carries the offset explicitly; a naive analysis of the UTC value alone would read this late-afternoon draw in Seoul (17:30 local time) as a morning draw at 08:30. Second, qcRunID links the patient result to the quality-control run that accepted it (section 5.7), which makes it possible to withdraw every result produced in a run that is later found to have been out of control.

Flags are information, not automatic exclusions

The quality flags record that a specimen is haemolysed, lipaemic or icteric; they do not say whether that matters. Haemolysis strongly affects some analytes (those present at high concentration inside red cells, or assays whose optical read-out is disturbed by free haemoglobin) and barely affects others. Which flags lead to rejection is therefore an assay-specific decision that belongs in the analytical validation, typically established with an interference study in which known amounts of haemoglobin, lipid emulsion or bilirubin are added to pools (the CLSI EP07 guideline describes such designs). The v1.0 SDK does not read qualityFlags at all: validateBiomarker uses every measurement it is given. Filtering is the caller's job, and the rejection list should come from the assay's own interference data.

import type { BiomarkerMeasurement, QualityFlags } from '@wia/bio-004/types';

// Flags that invalidate THIS assay, as established by its interference study.
const REJECTING_FLAGS: (keyof QualityFlags)[] = ['hemolyzed', 'clotted'];

export function usableForAnalysis(m: BiomarkerMeasurement): boolean {
  const flags: QualityFlags = m.qualityFlags ?? {};
  const freezeThaw = Number(m.metadata?.preAnalytical?.freezeThawCycles ?? 0);
  const flagged = REJECTING_FLAGS.some((k) => flags[k] === true);
  return !flagged && freezeThaw < 3;   // §3.1.2: fewer than three cycles
}

Excluded results should not disappear. The count of exclusions, by reason and by case/control group, belongs in the validation report, because differential exclusion is itself a source of bias.

5.2 Limit of Detection and Limit of Quantification

What the standard specifies

The quality-metrics annex gives the detection limit as

LOD = mean_blank + 1.645 × SD_blank     (one-sided 95 %)
LOD = mean_blank + 3     × SD_blank     (more conservative variant)

with a protocol of 20 blank samples and 20 low-positive samples near the expected LOD, and an acceptance criterion that at least 95 % of the low samples are detected (read above the limit) at the declared LOD. The factor 1.645 is the one-sided 95th percentile of the standard normal distribution: if blank results are approximately normal, only about 5 % of them will exceed mean + 1.645 SD.

Limit of blank versus limit of detection

The first formula is, in the terminology of the CLSI EP17 guideline on detection capability, the limit of blank (LoB): the highest result expected from a sample with no analyte. It is not yet a detection limit. A sample whose true concentration equals the LoB produces results scattered around the LoB, so roughly half of them fall below it and are reported as "not detected". The two-step approach closes that gap by adding the spread of low-concentration samples:

LoB = mean_blank + 1.645 × SD_blank
LoD = LoB        + 1.645 × SD_low       (SD of low-positive samples)

A worked example with illustrative numbers: 20 blank replicates have a mean of 0.020 ng/mL and an SD of 0.010 ng/mL, so LoB = 0.020 + 1.645 × 0.010 ≈ 0.036 ng/mL. Low-positive samples show an SD of 0.015 ng/mL, so LoD ≈ 0.036 + 1.645 × 0.015 ≈ 0.061 ng/mL. The annex's single-step formula would have reported 0.036 ng/mL; the "3 SD" variant gives 0.050 ng/mL. The annex's own acceptance test—95 % detection among the 20 low samples, i.e. at least 19 of 20 above the limit—is exactly what distinguishes a true LoD from a LoB, so a laboratory that follows the protocol to the end will usually be forced to the two-step value anyway. This book recommends computing both LoB and LoD, declaring the LoD, and recording the 19-of-20 verification.

The main specification additionally requires an LOD below 10 % of the lower limit of the reference range. That rule has meaning only when the lower reference limit is well above zero. For analytes whose reference interval starts at zero—the PSA example in §3.3.2 has lowerLimit: 0.0—it cannot be satisfied by any assay and should not be applied. A more useful requirement is that the LoD (and, more importantly, the LOQ) sit comfortably below the clinical decision limit that the biomarker will actually be used at.

Limit of quantification

Detection answers "is it there?"; quantification answers "how much?" with acceptable precision. The annex defines the LOQ as the lowest concentration whose CV is below 20 %, determined by measuring five to seven concentration levels spanning the low end of the range, ten replicates each, and notes that clinical biomarkers typically require CV below 15 % at the LOQ. The following illustrative data show how the choice of CV target moves the LOQ.

Nominal level (ng/mL)Mean (n = 10)SDCV (%)< 20 %?< 15 %?
0.050.0580.01932.8NoNo
0.100.1040.02423.1NoNo
0.200.1970.03316.8YesNo
0.500.4920.0418.3YesYes
1.001.0100.0525.1YesYes
2.001.9800.0834.2YesYes

Under the 20 % rule the LOQ is 0.20 ng/mL; under the 15 % rule it is 0.50 ng/mL, because no tested level between 0.20 and 0.50 was measured. When the two targets bracket a gap this wide, it is worth adding intermediate levels or fitting a precision profile (CV as a smooth function of concentration) and reading the LOQ from the curve. A precision profile also shows whether the clinical cutoff falls in the region where CV is still changing steeply—an important warning sign, because small calibration shifts then produce large changes in the proportion of patients classified positive. Results between LoD and LOQ should be reported as detected but below the quantifiable range rather than as numbers; in a WIA record the value can still be stored, with qualityFlags.other carrying a note such as "below_LOQ".

5.3 Precision

Repeatability and intermediate precision

Precision is the closeness of agreement between repeated measurements of the same material. It is expressed as the coefficient of variation, CV = SD / mean × 100 %, which makes it comparable across concentrations and across assays. Two conditions are distinguished:

A widely used design, described in CLSI EP05, measures each control or pool in duplicate in two runs per day over twenty days. The data are then analysed with a nested analysis of variance that separates the variance components. The resulting components add as variances, not as CVs, which is why the annex writes the total as

CV_total = √( CV²_within + CV²_between )

Here "between" means the between-run component—the extra variance introduced by changing runs—not the raw CV of run means, which already contains part of the within-run noise. With illustrative components of 4 % within-run and 3 % between-run, the total is √(16 + 9) = 5 %. If the design also separates a between-day component, the formula extends naturally: 3.2 %, 2.1 % and 2.4 % combine to √(10.24 + 4.41 + 5.76) ≈ 4.5 %.

Precision must be stated at relevant concentrations

A single CV for an assay is almost meaningless, because CV usually rises steeply at low concentration (as the LOQ table above illustrates). Precision should be reported at a minimum at the concentrations of the internal control levels and at, or near, the clinical cutoff. For a biomarker whose cutoff sits at 4.0 units, a CV of 3 % at 50 units is irrelevant to the misclassification rate; the CV at 4.0 units is what determines how often a patient with a true value of 3.8 is reported above the cutoff.

The standard's numeric targets differ by source: the main specification requires CV < 10 % for diagnostic use and < 15 % for screening; the README's validation requirements state CV < 15 % for quantitative biomarkers; the annex gives < 15 % (clinical) and < 20 % (research) within-run and < 20 % between-run; and the SDK declares MAX_CV_DIAGNOSTIC = 15.0 and MAX_CV_SCREENING = 20.0. Note that the SDK constants are declared but not used by any v1.0 function—no SDK call checks precision. Section 5.8 reconciles these figures. Beyond any fixed number, a well-established way to set a precision goal is from biological variation: an assay whose analytical CV is less than half of the analyte's within-subject biological CV adds only a small fraction to the total variation seen in a patient over time.

5.4 Trueness, Recovery and Linearity

Spike recovery

Precision says nothing about whether results are centred on the right value. A spike-recovery experiment adds a known amount of analyte to a real sample matrix and checks that the assay finds it:

% Recovery = (measured_spiked − measured_unspiked) / amount_added × 100 %

Illustrative example: a serum pool measures 2.0 units; 5.0 units are added; the spiked sample reads 6.7 units. Recovery = (6.7 − 2.0) / 5.0 × 100 = 94 %. If the spiked sample had read 7.8, recovery would be 116 %—acceptable under the annex's 80–120 % window but outside the main specification's 90–110 %. Recovery should be tested at several spike levels (low, near the cutoff, high) and in each specimen type the assay claims, because matrix effects in urine or cerebrospinal fluid can differ markedly from serum. The spike volume should be small relative to the sample so that dilution of the matrix itself does not distort the result.

Reference materials and comparison with a reference method

Where a certified reference material (CRM) exists, measuring it provides a direct check of calibration traceability; the annex targets agreement within ±10 % of the certified value. The main specification adds a bias requirement of less than 5 % from a reference method. Bias is estimated by measuring a set of patient samples covering the measuring range with both the candidate and the comparison method, then analysing the paired results with a difference plot (Bland–Altman style: difference against mean) and a regression that allows for error in both methods, such as Deming or Passing–Bablok regression. CLSI EP09 describes this method-comparison design. Ordinary least-squares regression and the correlation coefficient are poor tools here: a high correlation only shows that the two methods move together, not that they agree.

Bias matters for biomarkers in a specific way. A cutoff derived in the discovery laboratory is only portable if another laboratory's results sit on the same scale. A 5 % positive bias at the cutoff moves every patient near the threshold upward and changes the observed sensitivity and specificity at a site without anyone having changed the biology.

Linearity

Linearity establishes the range over which the assay's response is proportional to concentration, which defines the reportable (analytical measuring) range. The annex prescribes five to seven concentration levels, typically prepared by mixing a high and a low pool in known proportions, measured in duplicate and fitted by linear regression. Acceptance is R² > 0.95 (clinical; also the main specification's figure) or R² > 0.90 (research), with residuals randomly distributed.

R² alone is a weak criterion. Over a wide range, a curve that flattens noticeably at the top can still give R² above 0.99, because R² is dominated by the spread of the concentrations. The residual pattern is more informative: residuals that are negative at both ends and positive in the middle, or that grow steadily in one direction, show systematic curvature. A practical addition—used in CLSI EP06—is to compare a straight-line fit with a second- or third-order polynomial and to express the deviation from linearity at each level as a percentage, judged against the same total-error budget as the recovery study. Results above the validated range must be diluted and re-measured (the SDK's qualityFlags.diluted records that this happened) or reported as greater than the upper limit, never extrapolated.

5.5 Stability

Stability studies tell the laboratory how long, and under what conditions, a specimen can wait before the result it gives is no longer representative. They are the empirical basis for the pre-analytical rules in section 5.1: a freeze-thaw limit or a two-hour processing window is only defensible if a stability study supports it for the analyte in question. The annex specifies four conditions:

TestConditionAcceptance (annex)Question answered
Freeze-thaw3 cycles< 20 % changeCan an aliquot be re-tested after thawing?
Bench-top4 h at room temperature< 15 % changeCan samples wait on the bench during a run?
Processed sample24 h at 4 °C< 15 % changeCan separated serum/plasma be analysed next day?
Long-term storage−80 °C for 6 months< 20 % changeCan a biobank sample be used in a later study?

Change is computed relative to a baseline measurement of the same material:

% change = (stressed − baseline) / baseline × 100 %

For example (illustrative), a pool that reads 10.0 units fresh and 8.9 units after three freeze-thaw cycles has changed by −11 %, within the 20 % limit. Three points of good practice apply. First, the stressed and baseline aliquots should, where possible, be analysed in the same run, so that between-run imprecision does not masquerade as instability; otherwise the acceptance limit must be interpreted against the assay's between-run CV. Second, the tested condition must cover the permitted condition: the specification allows fewer than three freeze-thaw cycles, and a three-cycle study supports that rule, but a laboratory that wants to allow four cycles needs a four-cycle study. Third, long-term stability can only be claimed for the duration actually tested; six months of data does not support using a sample stored for five years, which is a common situation for retrospective biomarker studies drawing on biobanks. In such studies, the storage duration of each sample should be recorded and checked for correlation with the measured value and with case/control status.

5.6 Reference Intervals

Population and sample size

A reference interval describes the range of results expected in a defined healthy (or otherwise defined) reference population. It is the basis for the referenceRange that accompanies every WIA measurement record and for flags such as "high" and "low". Section 3.3.1 of the specification requires at least 120 reference individuals, representation by age, sex and ethnicity, verification of health status, and documentation of lifestyle factors. The figure of 120 is not arbitrary: it is the smallest sample for which the non-parametric 2.5th and 97.5th percentiles can each be given a 90 % confidence interval, the approach described in CLSI EP28-A3c (the guideline previously designated C28-A3c). Each partition—for instance each age group within each sex—needs its own 120 individuals if its limits are established directly.

Statistical methods

The specification allows three methods:

Outliers should be examined before the limits are computed, since a single unrecognised sub-clinical patient can move a non-parametric upper limit by a whole rank. Whether to split into partitions by age or sex is itself a statistical decision; a commonly used test (the Harris–Boyd criterion) compares the difference between subgroup means with the size of their standard deviations to decide whether separate intervals are warranted. Where a laboratory adopts an interval published by a manufacturer or another laboratory, it can verify transferability with a much smaller local sample—CLSI EP28-A3c describes testing 20 local reference individuals and accepting the interval if no more than two results fall outside it.

Recording the result

The outcome is the §3.3.2 reference-range record, with one entry per partition. The example below uses a fictional analyte and illustrative limits:

{
  "biomarker": "BMX-1",
  "unit": "ng/mL",
  "referenceRanges": [
    { "ageGroup": "18-49", "sex": "female", "lowerLimit": 1.2, "upperLimit": 7.9, "median": 3.4 },
    { "ageGroup": "18-49", "sex": "male",   "lowerLimit": 1.5, "upperLimit": 9.1, "median": 4.0 },
    { "ageGroup": "50-79", "sex": "female", "lowerLimit": 1.4, "upperLimit": 9.6, "median": 4.1 },
    { "ageGroup": "50-79", "sex": "male",   "lowerLimit": 1.8, "upperLimit": 11.3, "median": 4.9 }
  ]
}

When these limits are copied into an SDK ReferenceRange, lowerLimit and upperLimit become min and max, and the unit moves inside the object (Chapter 3 gives the full mapping). The record has no slot for the number of reference individuals, the method used, the confidence intervals of the limits or the partitioning decision. These belong in the validation dossier and should be referenced from it, because an interval without its derivation cannot be judged: an upper limit estimated from 120 people and one estimated from 40 look identical in the record.

Finally, a reference interval is not a diagnostic cutoff. The 97.5th percentile of healthy people describes where healthy values end; the cutoff chosen in Chapter 2 describes where the balance of sensitivity and specificity is best for a particular clinical question. The two can coincide, but a data set should never assume that they do.

5.7 Internal and External Quality Control

Internal QC: control levels and the Levey–Jennings chart

Validation shows that the method can perform; quality control shows, run after run, that it still does. Section 3.2.2 requires controls at two or three levels in each batch, the use of Westgard rules for acceptance, and a monthly review of QC data. The annex defines the levels: low (near the LOQ), medium (mid-range) and high (near the upper limit). A useful refinement is to place one level close to the clinical cutoff, since that is where drift has clinical consequences.

Each control material has a target mean and SD, established in the laboratory from repeated measurements over a period of stable operation (for example, twenty or more runs). Each new control result is converted to a z-score, z = (observed − target mean) / target SD, and plotted chronologically on a Levey–Jennings chart: a horizontal centre line at the mean, and lines at ±1, ±2 and ±3 SD. Random error appears as isolated points far from the centre; systematic error appears as a run of points on one side, or a steady trend.

 z
+3 |- - - - - - - - - - - - - - - - - - - - - - - - - - - - -  reject (1-3s)
+2 |- - - - - - - - - - - - - - - - - - - - - - - - - - * - -  warning (1-2s)
+1 |. . . . . . . . . . . . . . . . . .*. . *. . * . . . . .
 0 |--*----*------*---*-----*----*---------------------------  target mean
-1 |. . . . .*. . . . . . *. . . . . . . . . . . . . . . . .
-2 |- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-3 |- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    run 1                                             run 20
    (illustrative: runs 16-20 drift upward; four consecutive
     results beyond +1 SD trigger 4-1s before any 1-3s)

Westgard multirules

The annex lists the rules in the notation introduced by Westgard and colleagues, where "n-ks" means n control results exceeding k standard deviations. They are applied together, with 1-2s acting as a trigger for inspection rather than a rejection by itself.

RuleConditionActionError type mainly detected
1-2sOne control beyond ±2 SDWarning: inspect with the other rules—
1-3sOne control beyond ±3 SDReject runRandom (and large systematic)
2-2sTwo consecutive controls beyond 2 SD on the same side (same level across runs, or two levels in one run)Reject runSystematic
R-4sWithin one run, the range between two controls exceeds 4 SD (one above +2 SD, another below −2 SD)Reject runRandom
4-1sFour consecutive controls beyond 1 SD on the same sideReject runSystematic (small shift)

The reason 1-2s is only a warning is a matter of probability. For a normally distributed, in-control process, a single control falls outside ±2 SD about 4.6 % of the time. With two controls per run, at least one exceeds 2 SD in roughly 9 % of perfectly good runs, and with three controls in about 13 %. Rejecting on 1-2s would therefore throw away many valid runs. By contrast, a single control outside ±3 SD occurs by chance only about 0.27 % of the time. The multirule combination keeps false rejection low while remaining sensitive to the systematic shifts that matter most for a fixed cutoff.

The rules are easy to automate. The sketch below evaluates one run given the z-scores of its control levels and each level's recent history. It is a minimal illustration, not part of the @wia/bio-004 SDK, which has no QC functions in v1.0.

export type WestgardRule = '1-3s' | '2-2s' | 'R-4s' | '4-1s';

export interface RunVerdict {
  warning: boolean;            // 1-2s triggered
  violations: WestgardRule[];  // any entry means: reject the run
}

const sameSide = (zs: number[], limit: number): boolean =>
  zs.every((z) => z > limit) || zs.every((z) => z < -limit);

/**
 * runZ[i]    = z-score of control level i in the current run
 * history[i] = earlier z-scores of level i, oldest first
 */
export function evaluateRun(runZ: number[], history: number[][]): RunVerdict {
  const v = new Set<WestgardRule>();
  if (runZ.some((z) => Math.abs(z) > 3)) v.add('1-3s');

  // Within the run, across levels
  if (runZ.length >= 2 && Math.max(...runZ) > 2 && Math.min(...runZ) < -2) v.add('R-4s');
  for (let i = 0; i < runZ.length; i++) {
    for (let j = i + 1; j < runZ.length; j++) {
      if (sameSide([runZ[i], runZ[j]], 2)) v.add('2-2s');
    }
  }

  // Across runs, per level
  runZ.forEach((z, i) => {
    const series = [...(history[i] ?? []), z];
    if (series.length >= 2 && sameSide(series.slice(-2), 2)) v.add('2-2s');
    if (series.length >= 4 && sameSide(series.slice(-4), 1)) v.add('4-1s');
  });

  return { warning: runZ.some((z) => Math.abs(z) > 2), violations: [...v] };
}

A rejected run has consequences for data, not only for the instrument. Patient results produced in that run must be withheld or re-measured, and any results already released should be traceable back to the run. This is the purpose of linking each measurement to a QC run identifier, as in the record in section 5.1. For a biomarker validation study, the list of rejected runs and the fate of their samples should appear in the study report.

External QC and proficiency testing

Internal QC detects change relative to the laboratory's own history; it cannot detect a bias that has been present from the start. External quality assessment addresses this by sending the same material to many laboratories and comparing their results. The specification requires participation in proficiency testing, comparison with peer laboratories and annual method validation; the annex sets the frequency at quarterly or twice yearly, and the acceptance at within ±2 SD of the peer-group mean or within ±20 % of the target value. For new biomarkers there is often no commercial proficiency scheme. In that case an inter-laboratory exchange—splitting a panel of samples between two or more sites and comparing results—serves the same purpose and is particularly important before pooling data from several sites into one validation cohort.

5.8 One Acceptance Table, Reconciled

The numeric limits in the standard come from four sources that were evidently written separately: the main specification (§3.2.1 and §3.3.1), the quality-metrics annex, the README's validation requirements, and the SDK's BIOMARKER_CONSTANTS. The table places them side by side. None of them is "the" WIA limit on its own; citing a limit without naming its source is how inconsistent validation reports arise.

ParameterMain specAnnexREADME / SDKThis book applies
Precision (CV)< 10 % diagnostic; < 15 % screening< 15 % clinical, < 20 % research (within-run); < 20 % between-runREADME < 15 %; SDK MAX_CV_DIAGNOSTIC 15, MAX_CV_SCREENING 20 (unused)Diagnostic ≤ 10 %, screening ≤ 15 %, research ≤ 20 %, total CV at the cutoff
Recovery90–110 %80–120 %—90–110 % for diagnostic/screening; 80–120 % for research and near the LOQ
Bias / CRM< 5 % from reference method±10 % of CRM value—< 5 % vs reference method at the cutoff; CRM within ±10 %
LinearityR² > 0.95R² > 0.95 clinical, > 0.90 research; random residuals—R² > 0.95 plus residual/deviation check
LOD< 10 % of lower reference limitmean + 1.645 (or 3) SD of blank; 95 % detection—Two-step LoB/LoD with 19-of-20 verification; spec's 10 % rule only if lower limit > 0
LOQ< 20 % of lower reference limitLowest level with CV < 20 % (typically < 15 % clinical)—CV ≤ 15 % clinical, ≤ 20 % research; below clinical cutoff
StabilityFreeze-thaw < 3 cycles (rule)FT 3 cycles < 20 %; 4 h RT < 15 %; 24 h 4 °C < 15 %; −80 °C 6 mo < 20 %README: stability documentation requiredAnnex conditions and limits; claims limited to tested duration
Reference interval≥ 120 individuals; non-parametric, parametric or Box-Cox——≥ 120 per partition; non-parametric by default
Internal QC2–3 levels per batch; Westgard; monthly reviewLow/mid/high levels; 1-2s, 1-3s, 2-2s, R-4s, 4-1s—As annex, one level near the cutoff
External QCProficiency testing; peer comparison; annual validationQuarterly or biannual; ±2 SD of peer mean or ±20 % of target—As annex; inter-laboratory exchange if no scheme exists

The choices follow one principle: the limit depends on the use the result will be put to. A result that drives an individual diagnosis sits at the strictest level (the main specification's diagnostic figures), because a patient near the cutoff can be reclassified by a few percent of imprecision or bias. A screening test, whose positives are confirmed by a second method, can tolerate somewhat more imprecision. A research assay used for discovery, where the goal is to rank candidates rather than to report to clinicians, can use the annex's research limits—but a biomarker that moves from discovery to clinical validation must be re-validated against the stricter figures before its clinical performance is estimated. The intended-use category should therefore be written into the validation report next to every acceptance limit, together with the source of that limit.

Two more points of reconciliation concern the SDK. Its precision constants are named "diagnostic" (15) and "screening" (20), which corresponds to the annex's clinical/research split rather than to the main specification's diagnostic/screening split; a program that tests against MAX_CV_DIAGNOSTIC is applying 15 %, not 10 %. And because no v1.0 SDK function checks precision, recovery, linearity or QC status, passing validateBiomarker says nothing about analytical validity. Analytical acceptance must be checked separately, and the evidence carried alongside the clinical results.

Summary

Review Questions

  1. Which three pre-analytical factors in §3.1.2 have no field in a v1.0 measurement record, and how would you record them so that they can be used as covariates?
  2. Twenty blanks give mean 0.010 and SD 0.004; low-positive samples have SD 0.006 (same units). Compute the single-step limit and the two-step LoD, and explain which one would pass the 19-of-20 detection test.
  3. Why can the main specification's "LOD < 10 % of the lower reference limit" not be applied to the PSA reference-range example?
  4. Within-run CV is 5 % and the between-run component is 5 %. What is the total CV, and does it meet the main specification's diagnostic limit?
  5. A spike of 4.0 units into a sample reading 1.0 unit gives 4.6 units. Compute recovery and state which of the two recovery windows it satisfies.
  6. With three control levels per run, why would rejecting on 1-2s discard many valid runs?
  7. A program checks precision against BIOMARKER_CONSTANTS.MAX_CV_DIAGNOSTIC. Which limit is it actually applying, and which source does that correspond to?