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: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE) [![.NET](https://img.shields.io/badge/.NET-9.0-purple.svg)](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多规则, 临床实验室, 临床检验, 医学检验, 实验室信息化, 开源, 系统误差, 西格玛度量, 质控引擎, 质量保证, 质量控制, 随机误差