4. 数据核查与清理规则设计
数据核查与清理规则是质疑管理系统的“判断引擎”。它决定了系统在收到一条临床数据后,究竟把它判为通过、质疑还是硬错误。规则设计得粗糙,系统就会频繁误报,研究者逐渐对质疑失去信任;规则设计得过于宽松,真正的数据问题又会被漏掉。本节围绕四类核心核查规则展开,并讨论规则优先级与误报控制这两个工程化关键问题。
四类核查规则的分工
逻辑核查处理的是字段之间“不可能同时成立”的关系。它不关心数值大小是否合理,只关心组合是否自相矛盾。典型例子:受试者性别为“男”,却记录了“妊娠试验阳性”;访视日期早于知情同意日期;用药结束日期早于开始日期。逻辑核查的规则形式通常是布尔表达式,例如 SEX == 'M' AND PREG_TEST == 'POSITIVE' 触发质疑。这类规则误报率低,一旦触发几乎都是真实问题,应设为高优先级。
范围核查处理单个字段的取值边界。它分为两类:一类是硬边界,如收缩压必须大于 0 且小于 400 mmHg,超出即为录入错误;另一类是软边界,如收缩压 60~90 mmHg 属于“可能偏低”,需要提示但不阻断。范围核查的关键在于边界值来源必须可追溯——通常来自方案、CRF 填写说明或实验室参考区间,而不是凭经验拍定。
一致性核查处理跨访视、跨表单的纵向关系。例如基线体重 70 kg,随访 4 周体重 45 kg,单看每个值都在范围内,但变化幅度异常;再如某受试者首次访视记录“无既往用药”,后续访视却出现“既往用药继续”。一致性核查往往需要访问历史数据,规则实现上比前两类复杂,但能捕捉到单点核查无法发现的问题。
缺失值与异常值规则则分别处理“该有没有”和“有但不合理”。缺失值规则要区分三种情况:必填字段为空(真缺失)、因逻辑跳转不应填写(预期缺失)、以及“未知/未做”等编码值。异常值规则常用统计方法识别,如超出均值 ±3 倍标准差,或使用箱线图 IQR 法标记离群点。需要注意,统计离群不等于数据错误,异常值规则应输出“待核查”而非“错误”。
规则优先级:让系统先判“硬伤”
同一条数据可能同时触发多条规则。例如一条收缩压记录为 500 mmHg,既超出硬边界(范围核查),又可能因为与历史值差异过大触发一致性核查。如果两条规则都生成质疑,研究者会收到重复且混乱的信息。因此必须建立优先级:P1 硬错误(逻辑矛盾、超出硬边界)优先执行,命中后不再执行低优先级规则;P2 质疑(软边界、一致性异常)次之;P3 提示(统计离群、待核查)再次;P4 记录(预期缺失、编码值)仅记录不阻断。这种“命中即停”的策略能显著减少重复质疑。
优先级不是固定不变的。在项目早期,数据录入错误较多,P1 规则应尽量全面;进入锁库阶段后,重点转向一致性核查,P2 规则的权重可以适当提高。规则优先级应作为配置项管理,而不是硬编码在程序里。
误报控制:从规则命中率反推规则质量
误报是质疑管理最大的隐性成本。一条规则如果频繁触发但研究者关闭率极高,说明它要么边界设置过宽,要么缺少前置条件。误报控制的核心指标是规则命中率与质疑关闭率。建议对每条规则统计:触发次数、研究者确认问题次数、关闭为“无需修改”次数。若某规则 30 天内触发 200 次,其中 180 次被关闭为“数据无误”,则该规则误报率约 90%,应重新评估。
降低误报的常用手段有三种。第一,增加前置条件:例如“体重变化超过 20%”这条规则,应排除妊娠、手术等已知原因,或限定在特定访视窗口内。第二,分级输出:把“必须修改”和“请确认”分开,避免所有问题都变成阻断性质疑。第三,定期回顾规则库:每个里程碑节点回顾一次规则命中数据,降级或删除长期高误报规则。
规则配置示例
下面是一段规则配置的示例结构,展示如何把规则类型、优先级、条件和输出级别绑定在一起。字段与阈值均为教学示例,实际项目应依据方案和 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(标记待核查)。这种分级动作设计,能让研究者清楚哪些必须处理、哪些只需确认。
规则设计的常见陷阱
- 边界值来源不明:范围核查的上下限如果没有方案或实验室依据,规则本身就不可信。
- 忽略访视窗口:一致性核查若不做访视对齐,会把正常的访视时间偏移误判为数据异常。
- 缺失值一刀切:把所有空值都当缺失,会误伤逻辑跳转导致的预期缺失,产生大量无效质疑。
- 异常值直接判错:统计离群只说明“不常见”,不等于“错误”,必须保留人工确认环节。
规则设计不是一次性的编码工作,而是随项目推进不断校准的过程。把规则类型、优先级、误报指标和回顾机制一起纳入质疑管理计划,才能让系统既守住数据质量底线,又不至于被误报淹没。