2. 源数据剖析与映射可行性评估

在把任何一条临床记录写入 OMOP CDM 之前,必须先回答一个更基础的问题:源系统里到底有什么、长什么样、能不能映射。源数据剖析(Source Data Profiling)与映射可行性评估,就是为后续 ETL 建立“事实底账”的环节。它不产出 CDM 表,却决定了后续映射是顺畅推进还是反复返工。本节围绕电子病历(EMR)、医保结算、登记队列三类典型源系统,讲清结构探查、数据质量画像、字段语义识别和映射风险清单四件事怎么做。

一、先分清三类源系统的结构差异

不同源系统的“形状”差别很大,探查策略也不同。EMR 通常是高度规范化的关系库,围绕患者、就诊、医嘱、检验、病历文书等实体展开,主键外键清晰,但字段命名常带厂商或院内缩写,如 PAT_ID、VISIT_NO、ORDER_ITEM。医保结算数据更接近“一次结算一行”的宽表,字段以费用、诊断编码、项目编码为主,患者标识往往是加密后的参保号,缺少连续就诊轨迹。登记队列(Registry)则常是研究者手工维护的专题表,字段少、随访节点明确,但缺失和口径不一致问题突出。

结构探查的第一步是拿到每张表的元数据:表名、字段名、数据类型、长度、是否可空、主键、索引、行数。对 EMR 还要额外确认就诊与患者、医嘱与就诊之间的关联路径,因为这直接决定 visit_occurrence 和 drug_exposure 能否正确挂接。对医保数据要确认结算粒度是“一次住院一行”还是“一个项目一行”,粒度判断错误会导致 cost 重复累加。

二、数据质量画像:用可量化指标代替“感觉脏”

质量画像不是笼统地说“数据质量差”,而是对每个关键字段给出可复核的指标。常用维度包括:空值率、唯一值数量、取值分布、格式一致性、参照完整性、时间合理性。例如对 BIRTH_DATE 统计空值率与未来日期占比;对 GENDER 统计取值集合,看是否存在 M/F/1/2/男/女/未知 混用;对诊断编码统计是否符合 ICD-10 或 ICD-9 的长度与首字母规则。

一个可执行的画像片段如下,用于快速摸清字段取值:

-- 示例:对性别字段做取值分布画像
SELECT gender_code, COUNT(*) AS cnt,
       ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER (), 2) AS pct
FROM src_patient
GROUP BY gender_code
ORDER BY cnt DESC;

-- 示例:就诊时间合理性检查
SELECT COUNT(*) AS total,
       SUM(CASE WHEN visit_start > visit_end THEN 1 ELSE 0 END) AS reversed,
       SUM(CASE WHEN visit_start > CURRENT_DATE THEN 1 ELSE 0 END) AS future_rows
FROM src_visit;

这些结果要落到一张“字段画像表”里,字段包括:源表、源字段、数据类型、空值率、唯一值数、Top 取值、疑似标准、备注。它是后续语义识别和风险清单的输入,而不是一次性报告。

三、字段语义识别:从“像什么”到“是什么”

语义识别的目标,是判断源字段对应 OMOP 的哪个概念域(Domain)和哪张标准表。识别不能只看字段名,要结合取值、上下文和业务含义。例如 DIAG_CODE 若取值形如 E11.9,大概率是 ICD-10 诊断,应映射到 condition_occurrence;若形如 250.00,则可能是 ICD-9,需要先做版本判定。再如 ITEM_NAME 若取值是“阿莫西林胶囊”,属于药品域,应进入 drug_exposure;若取值是“血常规”,则更接近测量或操作,需要进一步区分。

识别时建议对每个候选字段记录三件事:源取值样例、推断的标准概念、置信度(高/中/低)。置信度低的字段不要急于映射,先列入待确认清单,向数据提供方或临床人员核实。这一步的产出是“字段—概念”对照表,它是映射设计的直接依据。

四、映射风险清单:把不确定性显式化

可行性评估的最终交付物是映射风险清单。它把前面发现的问题转化为可跟踪、可决策的条目。每条风险应包含:风险描述、涉及源字段、影响的目标表、风险等级、建议处理方式、责任人。常见风险类型包括:标识缺失导致无法关联患者、编码版本不明、时间粒度不足(只有年月没有日)、单位不统一、自由文本无法结构化、隐私字段被脱敏后不可逆。

例如“医保数据中患者标识为加密参保号,且无跨次就诊关联键”,会直接影响 person 与 visit_occurrence 的构建,属于高风险,处理方式可能是引入院内主索引做桥接,或明确该数据仅用于费用分析而不进入患者级 CDM。风险清单不是一次性文档,而应在映射和 ETL 过程中持续更新状态。

源数据剖析与映射可行性评估流程 电子病历 EMR 规范化关系库 患者/就诊/医嘱/检验 医保结算 结算宽表 费用/诊断/项目编码 登记队列 Registry 专题随访表 字段少/随访节点明确 ① 结构探查:元数据 + 关联路径 + 粒度判定 表/字段/类型/主键/行数 · 患者-就诊-医嘱关联 · 结算粒度(住院行 vs 项目行) ② 数据质量画像 空值率 · 唯一值数 · 取值分布 格式一致性 · 参照完整性 · 时间合理性 产出:字段画像表 ③ 字段语义识别 取值样例 + 上下文 → 概念域判定 ICD-9/10 版本 · 药品/测量/操作区分 产出:字段—概念对照表(含置信度) ④ 映射风险清单 标识缺失 · 编码版本不明 · 时间粒度不足 · 单位不统一 · 自由文本 · 脱敏不可逆 每条含:风险描述 / 源字段 / 目标表 / 等级 / 处理建议 / 责任人

五、把四步串成可复用的评估动作

实际项目中,这四步往往交叉进行。一个稳妥的做法是:先对全部源表做一轮结构探查,形成表清单和关联图;再对进入映射范围的关键字段做质量画像;随后逐字段做语义识别并标注置信度;最后把低置信度、缺失、冲突项汇总为风险清单,并给出“可映射 / 需转换 / 暂缓 / 不可映射”的结论。这个结论直接决定后续 ETL 的范围和优先级。

建议在评估阶段就为每个源字段记录“源字段 → 目标表.字段 → 转换规则 → 风险编号”四元组。它既是评估成果,也能在后续映射实现时直接复用,避免二次梳理。
不要跳过粒度判定直接映射。医保结算若按项目行存储,直接汇总到 visit_occurrence 会造成费用重复;登记队列若只有随访日期而无就诊标识,强行生成 visit_occurrence 会引入虚假就诊。粒度与标识是可行性评估中最容易埋雷的两点。

完成本节工作后,应当能够回答:源系统有哪些表、关键字段长什么样、每个字段可能对应哪个 OMOP 概念、哪些地方存在无法自动消解的风险。带着这份底账进入映射设计,才能把返工控制在评估阶段,而不是等到 ETL 跑完才发现患者对不上、费用翻倍、编码版本错位。