3. 源数据采集与电子数据采集系统对接

采集层是临床研究数据管线的入口,它面对的不是一个系统,而是一组异构数据源:EDC 承载研究者录入的病例报告表数据,ePRO 承载受试者自报结局,eSource 提供原始电子源数据,可穿戴设备持续输出生理信号,中心实验室则按样本批次回传检验结果。这些来源在时间粒度、标识体系、编码标准和传输机制上各不相同。如果采集层只是"把数据收进来",下游清洗和统计就会反复返工。因此本节的核心任务是:为采集层建立数据契约,明确字段映射规则,并部署实时校验,让错误在进入管线的第一时间被拦截。

数据契约:先约定"接口长什么样"

数据契约是数据提供方与管线之间的一份机器可读约定,至少包含四类信息:标识与版本(来源系统、契约版本、生效日期)、结构定义(字段名、类型、是否必填、允许值域)、语义定义(字段含义、对应 CDISC 变量、单位)、传输约定(格式、频率、幂等键、失败重试策略)。以 ePRO 为例,一份契约片段可以写成:

contract: epro_diary_v1.2
source_system: ePRO-Platform-A
record_key: [study_id, site_id, subject_id, instrument_oid, visit_oid]
fields:
  - name: item_oid        type: string   required: true
  - name: response_value  type: decimal  range: [0,10]
  - name: response_date   type: datetime format: ISO8601  tz: site_local
  - name: completion_status type: enum   allowed: [COMPLETED, PARTIAL, MISSED]
cdisc_mapping: QSORRES / QSTESTCD / QSDTC
delivery: REST push, batch=1, retry=3, idempotency_key=record_key

契约的价值在于"可执行":它既能生成校验器,也能生成映射配置,还能作为变更管理的依据。任何一方修改字段,都必须升版本并触发回归校验,而不是悄悄改字段名。

字段映射:从源字段到标准变量

映射不是简单的改名,而是三层转换。第一层是结构映射:把源系统的嵌套 JSON 或宽表,拆解为以受试者-访视-表单为键的标准化记录。第二层是语义映射:把源字段对应到 CDISC SDTM 变量,例如 ePRO 的 item_oid 映射到 QSTESTCD,response_value 映射到 QSORRES,response_date 映射到 QSDTC。第三层是值域映射:把源系统的本地编码转换为受控术语,例如把设备厂商的 HR_BPM 统一为 VSHR 并统一单位为次/分。

映射配置建议以"映射表"形式维护,每行至少包含:源系统、源字段、目标变量、转换表达式、单位换算、缺失值处理、生效版本。这样当某个中心实验室更换 LIS 系统时,只需替换对应行,而不必改动管线代码。

实时校验:在入口处拦截错误

实时校验按强度分为四档,建议在采集层全部部署:

  • 结构校验:必填字段是否存在、类型是否正确、时间格式是否合法。例如 response_date 必须能被解析为 ISO8601。
  • 值域校验:数值是否落在允许区间,枚举是否在受控列表内。例如疼痛评分必须在 0–10 之间。
  • 逻辑校验:字段之间的约束。例如 completion_status=MISSED 时 response_value 必须为空;visit_date 不得早于知情同意日期。
  • 跨源一致性校验:同一受试者在 EDC 与 ePRO 中的出生日期、性别、访视窗口是否一致;实验室结果的采样时间是否落在访视窗口内。

校验失败时不应直接丢弃数据,而应写入隔离区并生成带上下文的告警:来源系统、记录键、失败规则、原始报文片段。这样数据管理员可以判断是源系统问题、映射问题还是真实的数据质量问题。

建议为每条校验规则分配唯一规则 ID(如 CHK-EPRO-007),并在告警、日志和审计追踪中引用该 ID,便于回溯与规则覆盖率统计。

采集层数据流与校验位置

下图展示五类数据源进入采集层后的统一处理路径:每个来源先经过契约解析,再执行字段映射,随后进入实时校验;通过校验的记录写入标准化暂存区,未通过的进入隔离区并触发告警。图中同时标出了幂等键与版本号在链路中的作用位置。

采集层数据契约 · 字段映射 · 实时校验链路 数据源 EDC 研究者录入 CRF ePRO 受试者自报日记 eSource 电子源数据 可穿戴设备 连续生理信号 中心实验室 LIS 检验结果 契约解析 版本校验 结构定义加载 幂等键提取 格式识别 契约版本 v1.2 / v2.0 record_key study+site+ subject+visit 字段映射 结构映射 语义映射 值域映射 item_oid → QSTESTCD response_value → QSORRES HR_BPM → VSHR 单位统一 实时校验 结构校验 值域校验 逻辑校验 跨源一致性 CHK-EPRO-007 0 ≤ score ≤ 10 MISSED → 空值 visit_date ≥ ICF_date 标准化暂存区 通过校验记录 写入下游 隔离区 + 告警 失败记录 规则ID + 上下文 通过 失败 关键控制点 ① 契约版本与幂等键在解析阶段锁定,防止重复写入 ② 映射表按源系统独立维护,变更需升版本并回归校验 ③ 校验规则带唯一 ID,失败记录保留原始报文片段

落地要点与常见陷阱

第一,幂等键必须唯一且稳定。可穿戴设备常因网络重传导致同一时间点数据重复上报,若幂等键只取时间戳,就会产生重复记录。建议使用"设备序列号 + 受试者 ID + 采样时间 + 信号类型"组合键。第二,时间与时区要显式声明。ePRO 在受试者本地时区记录,实验室结果按中心时区出具,若不在契约中声明时区,跨源一致性校验会大量误报。第三,缺失值要区分"未采集"与"不适用"。EDC 中未填写的字段可能是漏填,也可能是逻辑跳转导致的不适用,两者在 SDTM 中分别对应空值和 NOT DONE,映射时必须区分。

不要在校验失败时静默丢弃记录。隔离区必须保留原始报文、来源系统、接收时间、失败规则 ID 和重试次数,否则一旦发生数据丢失,将无法完成审计追踪和根因分析。

最后,采集层的质量需要用指标持续观察:契约覆盖率(已接入来源中已定义契约的比例)、映射成功率、校验通过率、隔离区积压量、平均修复时长。建议按日统计并按来源系统拆分,当某个来源的校验通过率持续低于阈值时,优先排查其契约版本或映射配置,而不是在下游反复清洗。