farowolo/clinStrata-qc-engine
GitHub: farowolo/clinStrata-qc-engine
一款符合 CLSI EP23 标准的开源 Westgard 多规则 QC 评估与 Sigma 指标计算引擎,专为临床实验室信息系统提供透明、可审计、可移植的质量控制计算能力。
Stars: 0 | Forks: 0
# ClinStrata QC 引擎
**一款开源、符合 CLSI EP23 标准的 Westgard 多规则 QC 引擎及基于 2025 CLIA PT 的 Sigma 指标计算器,专为临床实验室信息系统设计。**
由临床检验专家为临床检验专家打造。告别 Excel。告别黑盒。提供完全可审计的规则逻辑,您可以直接将其记录到 CAP 和 CLIA 文档中。
[](LICENSE)
[](https://dotnet.microsoft.com)
## 问题背景
每个受 CLIA 监管的实验室在实施 Westgard 多规则 QC 时,都在以下四种方式之一中重复构建相同的逻辑——而这些方式都存在严重的局限性:
- **电子表格工作簿**——未经验证,每次检测项目变更时都需要从头重建,不可移植,且无法审计
- **专有 LIS 模块**——规则逻辑是一个黑盒;您无法向 CAP 检查员准确说明 2-2s 违规是如何被评估的
- **仪器制造商软件**——仅限特定仪器,无法跨平台汇总 QC 表现
- **云端托管的 QC 管理平台**——Peer 组模型假定存在具有既定实验室间人群数据的商品化试剂批号;对于不存在 Peer 组且必须独立定义 TEa 的 LC-MS/MS LDTs,其适用性有限
本库填补了这一空白:提供了一套干净、无状态、可独立测试的 C#/.NET 实现,涵盖六项标准 Westgard 规则和 CLSI EP23-A Sigma 指标框架,并由完整的 2025 CLIA PT 接受标准数据库提供支持。将其集成到您的信息系统中,它就能透明地、可审计地且可移植地为您处理所有的数学运算。
## 实现内容
### Westgard 多规则
| 规则 | N | 类型 | 检测目标 |
|------|---|------|---------|
| 1-2s | 1 | 警告 | 启动多规则评估 |
| 1-3s | 1 | 拒绝 | 随机误差 |
| 2-2s | 2 | 拒绝 | 系统误差 |
| R-4s | 2 | 拒绝 | 随机误差 |
| 4-1s | 4 | 拒绝 | 系统误差 |
| 10x̄ | 10 | 拒绝 | 系统误差 |
1-2s 警告会设置一个标志,但不会限制拒绝规则的评估——在每次调用时都会评估所有六项规则,这与最初的 Westgard 规范(《Clinical Chemistry》1981年)保持一致。详尽模式会返回所有触发违规的完整规则归因,以用于审计追踪记录。
### Sigma 指标引擎 (CLSI EP23-A)
σ = (TEa − |bias|) / CV
| σ | 推荐规则集 |
|---|---|
| ≥ 6 | 仅 1-3s,N=2 |
| 4–<6 | 1-3s / 2-2s / R-4s,N=2 |
| 3–<4 | 完整多规则,N=4 |
| < 3 | 需要进行方法学评审 |
### 2025 CLIA PT 接受标准数据库
涵盖 Chemistry(化学)、Immunology(免疫学)、Endocrinology(内分泌学)、Toxicology(毒理学)和 Hematology(血液学)的 87 个分析物,数据源自 42 CFR Part 493(CMS-3355-F 最终规则,2024年7月11日生效,2025年1月1日实施)。
支持三种标准类型:
- **简单**——TV ± X%(例如,白蛋白 ±8%、HbA1c ±8%、甘油三酯 ±15%)
- **复合**——TV ± X% 或 ± Y 单位,取较大者(例如,葡萄糖:±8% 或 ±6 mg/dL;肌酐:±10% 或 ±0.2 mg/dL;TSH:±20% 或 ±0.2 mIU/L)。对于复合标准,TEa% 是**依赖于浓度的**——请传入 QC 质控品均值以获得正确的计算结果。
- **绝对**——仅 TV ± X 单位(例如,钾:±0.3 mmol/L;钠:±4 mmol/L;血气 pH:±0.04)。需要 QC 均值才能转换为 TEa%。
对于没有 CLIA PT 标准的分析物——如免疫抑制剂、抗真菌药物 TDM、NGAL、25-OH 维生素 D 和其他 LDTs——请根据临床决定限或生物学变异度数据提供 `teaPct`。
### Levey-Jennings 输出
结构化数据对象:均值、±1s/2s/3s 控制限、带有规则归因的单次观测违规标志。图表渲染将委托给使用系统的呈现层来完成。
## 快速入门
### 运行 QC 评估
```
using ClinStrata.QC.Engine.Engine;
using ClinStrata.QC.Engine.Models;
var limits = new QcControlLimits { Mean = 100.0, Sd = 5.0 };
var observations = new List
{
new(Value: 111.0, RunId: "RUN-001"),
new(Value: 111.5, RunId: "RUN-001")
};
var engine = new WestgardEngine();
var result = engine.Evaluate(observations, limits);
if (!result.IsAccepted)
{
Console.WriteLine($"Run rejected: {result.PrimaryViolation!.RuleName}");
Console.WriteLine(result.PrimaryViolation.Description);
// Run rejected: 2-2s
// Observations at indices 0 and 1 both exceeded +2s. Probable systematic error. Run rejected.
}
if (result.WarningTriggered && result.IsAccepted)
Console.WriteLine("1-2s warning — monitor closely but run is accepted.");
```
### 计算 Sigma —— 简单标准(仅百分比)
```
var calc = new SigmaCalculator();
// Albumin — 2025 CLIA ±8% (simple criterion, no qcMean needed)
var sigma = calc.Calculate(biasPct: 1.5, cvPct: 2.0, analyte: "albumin");
Console.WriteLine($"σ = {sigma.Sigma}"); // σ = 3.25
Console.WriteLine(sigma.RecommendationDescription); // Full multi-rule, N=4
Console.WriteLine(sigma.Criteria!.Description); // TV ±8%
```
### 计算 Sigma —— 复合标准(浓度依赖型 TEa)
```
// Glucose — 2025 CLIA ±8% or ±6 mg/dL (greater)
// Always pass qcMean for composite criteria — TEa% varies by concentration
// Low QC (mean ~75 mg/dL): abs% = 6/75*100 = 8.0% = fixed% → TEa = 8.0%
var sigmaLow = calc.Calculate(biasPct: 1.0, cvPct: 1.5, analyte: "glucose", qcMean: 75.0);
Console.WriteLine($"Low QC σ = {sigmaLow.Sigma}, TEa = {sigmaLow.Tea}%");
// High QC (mean ~250 mg/dL): abs% = 6/250*100 = 2.4% < 8% → TEa = 8.0%
var sigmaHigh = calc.Calculate(biasPct: 1.0, cvPct: 1.5, analyte: "glucose", qcMean: 250.0);
Console.WriteLine($"High QC σ = {sigmaHigh.Sigma}, TEa = {sigmaHigh.Tea}%");
// Creatinine — ±10% or ±0.2 mg/dL (greater)
// At low creatinine (0.5 mg/dL), absolute dominates: abs% = 0.2/0.5*100 = 40%
var sigmaCr = calc.Calculate(biasPct: 2.0, cvPct: 3.0, analyte: "creatinine", qcMean: 0.5);
Console.WriteLine($"Low creatinine TEa = {sigmaCr.Tea}%"); // 40% — not 10%
```
### 计算 Sigma —— 绝对标准
```
// Potassium — ±0.3 mmol/L absolute (no fixed percentage component)
// TEa% depends entirely on the QC concentration
var sigmaK = calc.Calculate(biasPct: 0.2, cvPct: 0.8, analyte: "potassium", qcMean: 4.0);
Console.WriteLine($"K TEa = {sigmaK.Tea}%"); // 7.5% (= 0.3/4.0*100)
```
### 计算 Sigma —— LDT 分析物(用户提供的 TEa)
```
// Voriconazole — no CLIA PT criteria; use clinical decision limit-based TEa
var sigmaVori = calc.Calculate(
biasPct: 9.8,
cvPct: 5.0,
teaPct: 30.0,
analyte: "voriconazole",
teaSource: "Conservative clinical estimate (therapeutic range 0.5–4 mg/L)");
Console.WriteLine($"σ = {sigmaVori.Sigma}"); // 4.04 → Three-rule set
```
### 检查 CLIA 标准覆盖范围
```
// Check if an analyte has 2025 CLIA PT criteria
SigmaCalculator.HasCliaCriteria("glucose"); // true
SigmaCalculator.HasCliaCriteria("hba1c"); // true (new in 2025)
SigmaCalculator.HasCliaCriteria("bnp"); // true (new in 2025)
SigmaCalculator.HasCliaCriteria("vancomycin"); // true (composite, tightened)
SigmaCalculator.HasCliaCriteria("cyclosporine"); // false (no CLIA PT criteria — use teaPct)
SigmaCalculator.HasCliaCriteria("ngal"); // false (no CLIA PT criteria — use teaPct)
// Inspect the resolved criterion
var criteria = SigmaCalculator.GetCriteria("tsh");
Console.WriteLine(criteria!.Description); // TV ±20% or ±0.2 mIU/L (greater)
Console.WriteLine(criteria.Type); // Composite
Console.WriteLine(criteria.RequiresQcMean); // True
```
### 用于审计追踪的详尽模式
```
var result = engine.Evaluate(observations, limits, EvaluationMode.Exhaustive);
foreach (var v in result.AllViolations)
Console.WriteLine($"{v.RuleName}: {v.Description}");
```
### Levey-Jennings 图表数据
```
var builder = new LeveyJenningsBuilder();
var chart = builder.Build(observations, limits);
foreach (var point in chart.DataPoints)
Console.WriteLine($"[{point.Index}] {point.Value:F2} — " +
(point.IsViolation ? $"VIOLATION: {point.ViolatingRuleName}" : "OK"));
```
## 2025 CLIA PT 标准 —— 相较于先前版本的主要变化
| 分析物 | 旧版 | 2025(现行) |
|---|---|---|
| Glucose(葡萄糖) | ±10% | ±8% 或 ±6 mg/dL(复合) |
| Creatinine(肌酐) | ±15% | ±10% 或 ±0.2 mg/dL(复合) |
| ALT / AST | ±20% | ±15% 或 ±6 U/L(复合) |
| Albumin(白蛋白) | ±10% | ±8% |
| Total protein(总蛋白) | ±10% | ±8% |
| Triglycerides(甘油三酯) | ±25% | ±15% |
| Alkaline phosphatase(碱性磷酸酶) | ±30% | ±20% |
| Magnesium(镁) | ±25% | ±15% |
| HDL cholesterol(HDL 胆固醇) | ±30% | ±20% 或 ±6 mg/dL(复合) |
| TSH | ±3 SD | ±20% 或 ±0.2 mIU/L(复合) |
| Phenytoin(苯妥英) | ±25% | ±15% 或 ±2 mcg/mL(复合) |
| Vancomycin(万古霉素) | 未监管 | ±15% 或 ±2 mcg/mL(复合) |
| Lithium(锂) | ±20% | ±15% 或 ±0.3 mmol/L(复合) |
| HbA1c | 未监管 | ±8%(新增) |
| BNP / NT-proBNP | 未监管 | ±30%(新增) |
| Hemoglobin(血红蛋白) | ±7% | ±4% |
| WBC | ±15% | ±10% |
| RBC / Hematocrit(红细胞压积) | ±6% | ±4% |
## 验证
该引擎在 24 个确定性测试场景中进行了验证,涵盖了所有已实现的规则、边界条件、多规则组合和边缘情况。所有场景均与 Westgard Web (Westgard QC, Inc.) 以及 CLSI EP23-A 发布的实例进行了交叉核对。
```
dotnet test
# 54 个测试 — 24 个 Westgard 场景 + sigma 计算器套件
```
位于 `tests/ClinStrata.QC.Engine.Tests/WestgardValidationTests.cs` 的测试文件是配套 JALM 技术说明中引用的补充验证数据集。
## 安装
```
dotnet add package ClinStrata.QC.Engine
```
或者直接克隆:
```
git clone https://github.com/[PLACEHOLDER]/clinstrata-qc-engine
```
要求 .NET 9.0+。无外部运行时依赖。
## 局限性
**无 CUSUM 或 EWMA。** 这些方法在检测微小但持续存在的系统误差方面表现更优——这类误差会在不同运行批次间缓慢累积,且对 Westgard 多规则是不可见的。计划在未来的版本中发布。
**复合和绝对 TEa 标准需要 qcMean。** 对于具有浓度依赖型 CLIA 标准的分析物(如葡萄糖、肌酐、TSH、万古霉素等),请务必传入 QC 质控品均值。如果没有该数据,引擎将仅返回固定的百分比部分,这可能会低估低浓度下的 TEa 并高估 Sigma。
**TEa 并非自动适用于所有分析物。** CLIA PT 标准是监管层面的接受限,并不一定是最优的分析质量规范。对于 LDTs 和复杂检测项目——尤其是处于临床决定阈值处的分析物——请考虑基于生物学变异或临床决定限推导出的 TEa 是否比 CLIA 默认值更为合适。
**设计上为无状态。** 该引擎评估离散的观测窗口,且不会在调用之间维护运行中的统计数据。运行批次间的趋势分析应由使用该引擎的信息系统负责。
**始终需要临床判断。** 基于 Sigma 的规则选择是基于证据的指导,而非强制性指令。QC 计划的最终确定需要由具备资质的实验室专业人员完成。
## 与 Bio-Rad Unity 的关系
Bio-Rad Unity 是临床实验室中部署最广泛的 QC 管理平台,提供了有价值的实验室间 Peer 组比较。ClinStrata QC 引擎并非 Unity 的替代品——它在架构上是不同的。Unity 是一个托管服务,拥有专有的规则逻辑和建立在商品化试剂批号基础上的 Peer 组模型。ClinStrata 是一个您可以嵌入到自己的信息系统中的开源计算库,拥有完全可审计的规则逻辑、符合 2025 CLIA 标准的 TEa,并且不依赖于 Peer 人群数据。对于不存在 Peer 组且规则逻辑必须透明且可独立验证的 LC-MS/MS LDTs,ClinStrata 填补了 Unity 架构未能涵盖的空白。
## 引用
如果您在已发表的工作中使用了本引擎,请引用:
## 许可证
Apache 2.0。详见 [LICENSE](LICENSE)。
标签:CAP认证, CLIA, CLSI EP23, LC-MS/MS, LDT, LIS, .NET 9, Sigma度量, TEa, Westgard多规则, 临床实验室, 临床检验, 医学检验, 实验室信息化, 开源, 系统误差, 西格玛度量, 质控引擎, 质量保证, 质量控制, 随机误差