4. 数据核查与清理规则设计

数据核查与清理规则是质疑管理系统的“判断引擎”。它决定了系统在收到一条临床数据后,究竟把它判为通过、质疑还是硬错误。规则设计得粗糙,系统就会频繁误报,研究者逐渐对质疑失去信任;规则设计得过于宽松,真正的数据问题又会被漏掉。本节围绕四类核心核查规则展开,并讨论规则优先级与误报控制这两个工程化关键问题。

四类核查规则的分工

逻辑核查处理的是字段之间“不可能同时成立”的关系。它不关心数值大小是否合理,只关心组合是否自相矛盾。典型例子:受试者性别为“男”,却记录了“妊娠试验阳性”;访视日期早于知情同意日期;用药结束日期早于开始日期。逻辑核查的规则形式通常是布尔表达式,例如 SEX == 'M' AND PREG_TEST == 'POSITIVE' 触发质疑。这类规则误报率低,一旦触发几乎都是真实问题,应设为高优先级。

范围核查处理单个字段的取值边界。它分为两类:一类是硬边界,如收缩压必须大于 0 且小于 400 mmHg,超出即为录入错误;另一类是软边界,如收缩压 60~90 mmHg 属于“可能偏低”,需要提示但不阻断。范围核查的关键在于边界值来源必须可追溯——通常来自方案、CRF 填写说明或实验室参考区间,而不是凭经验拍定。

一致性核查处理跨访视、跨表单的纵向关系。例如基线体重 70 kg,随访 4 周体重 45 kg,单看每个值都在范围内,但变化幅度异常;再如某受试者首次访视记录“无既往用药”,后续访视却出现“既往用药继续”。一致性核查往往需要访问历史数据,规则实现上比前两类复杂,但能捕捉到单点核查无法发现的问题。

缺失值与异常值规则则分别处理“该有没有”和“有但不合理”。缺失值规则要区分三种情况:必填字段为空(真缺失)、因逻辑跳转不应填写(预期缺失)、以及“未知/未做”等编码值。异常值规则常用统计方法识别,如超出均值 ±3 倍标准差,或使用箱线图 IQR 法标记离群点。需要注意,统计离群不等于数据错误,异常值规则应输出“待核查”而非“错误”。

四类核查规则与优先级判定链 临床数据记录 字段值 + 访视上下文 逻辑核查 字段组合矛盾 性别 vs 妊娠试验 范围核查 单字段边界 SBP 0~400 mmHg 一致性核查 跨访视纵向关系 体重 70→45 kg 缺失值 / 异常值 必填为空 / 统计离群 均值±3SD、IQR 优先级判定 P1 硬错误 逻辑矛盾 / 超硬边界 P2 质疑 软边界 / 一致性异常 P3 提示 统计离群 / 待核查 P4 记录 预期缺失 / 编码值 高优先级先执行,命中即停 避免同一数据多重质疑 质疑输出 质疑编号 字段 / 访视 规则 ID + 级别 误报控制:规则命中率监控 → 高频误报规则降级或加条件 → 定期回顾规则库 示例:某规则 30 天内触发 200 次、研究者关闭率 > 90%,应重新评估边界或增加前置条件

规则优先级:让系统先判“硬伤”

同一条数据可能同时触发多条规则。例如一条收缩压记录为 500 mmHg,既超出硬边界(范围核查),又可能因为与历史值差异过大触发一致性核查。如果两条规则都生成质疑,研究者会收到重复且混乱的信息。因此必须建立优先级:P1 硬错误(逻辑矛盾、超出硬边界)优先执行,命中后不再执行低优先级规则;P2 质疑(软边界、一致性异常)次之;P3 提示(统计离群、待核查)再次;P4 记录(预期缺失、编码值)仅记录不阻断。这种“命中即停”的策略能显著减少重复质疑。

优先级不是固定不变的。在项目早期,数据录入错误较多,P1 规则应尽量全面;进入锁库阶段后,重点转向一致性核查,P2 规则的权重可以适当提高。规则优先级应作为配置项管理,而不是硬编码在程序里。

误报控制:从规则命中率反推规则质量

误报是质疑管理最大的隐性成本。一条规则如果频繁触发但研究者关闭率极高,说明它要么边界设置过宽,要么缺少前置条件。误报控制的核心指标是规则命中率与质疑关闭率。建议对每条规则统计:触发次数、研究者确认问题次数、关闭为“无需修改”次数。若某规则 30 天内触发 200 次,其中 180 次被关闭为“数据无误”,则该规则误报率约 90%,应重新评估。

降低误报的常用手段有三种。第一,增加前置条件:例如“体重变化超过 20%”这条规则,应排除妊娠、手术等已知原因,或限定在特定访视窗口内。第二,分级输出:把“必须修改”和“请确认”分开,避免所有问题都变成阻断性质疑。第三,定期回顾规则库:每个里程碑节点回顾一次规则命中数据,降级或删除长期高误报规则。

规则设计的一个实用原则:先保证 P1 规则零漏报,再逐步优化 P2/P3 规则的精确率。硬错误漏报的代价远高于软提示误报。

规则配置示例

下面是一段规则配置的示例结构,展示如何把规则类型、优先级、条件和输出级别绑定在一起。字段与阈值均为教学示例,实际项目应依据方案和 CRF 说明确定。

{
  "rule_id": "RANGE-SBP-001",
  "type": "range",
  "field": "SBP",
  "priority": "P1",
  "condition": "SBP <= 0 OR SBP >= 400",
  "message": "收缩压超出硬边界,请核对录入",
  "action": "block"
},
{
  "rule_id": "CONSIST-WT-002",
  "type": "consistency",
  "field": "WEIGHT",
  "priority": "P2",
  "condition": "abs(WEIGHT - WEIGHT_BASELINE) / WEIGHT_BASELINE > 0.20",
  "message": "体重较基线变化超过 20%,请确认",
  "action": "query"
},
{
  "rule_id": "OUTLIER-SBP-003",
  "type": "outlier",
  "field": "SBP",
  "priority": "P3",
  "condition": "SBP > mean + 3 * sd",
  "message": "收缩压为统计离群值,请核查",
  "action": "flag"
}

注意三条规则的 action 不同:P1 为 block(阻断提交),P2 为 query(生成质疑),P3 为 flag(标记待核查)。这种分级动作设计,能让研究者清楚哪些必须处理、哪些只需确认。

规则设计的常见陷阱

  • 边界值来源不明:范围核查的上下限如果没有方案或实验室依据,规则本身就不可信。
  • 忽略访视窗口:一致性核查若不做访视对齐,会把正常的访视时间偏移误判为数据异常。
  • 缺失值一刀切:把所有空值都当缺失,会误伤逻辑跳转导致的预期缺失,产生大量无效质疑。
  • 异常值直接判错:统计离群只说明“不常见”,不等于“错误”,必须保留人工确认环节。

规则设计不是一次性的编码工作,而是随项目推进不断校准的过程。把规则类型、优先级、误报指标和回顾机制一起纳入质疑管理计划,才能让系统既守住数据质量底线,又不至于被误报淹没。