3. OMOP 词表体系与标准概念选择
OMOP CDM 的每一张临床表最终都通过 concept_id 与词表体系相连。源系统里的诊断名称、检验项目、药品商品名、手术描述,只有落到一个明确的 concept_id 上,才能被跨机构、跨年份地比较和统计。因此,词表体系不是附属资料,而是 OMOP 转换的语义底座。本节围绕 SNOMED、LOINC、RxNorm、ATC、ICD 这几类常见词表,说明它们各自承担什么角色、映射到标准概念时应遵循什么原则,以及如何借助概念表与关系表构建可复用的概念集。
一、标准概念与非标准概念的分工
在 OMOP 中,概念分为标准概念(standard concept)与非标准概念(non-standard concept)。标准概念是分析时应当使用的目标概念,其 standard_concept 字段取值为 'S';分类概念取值为 'C',通常用于层级汇总;其余为空,表示非标准概念,只能作为映射来源。源系统编码(如 ICD-10、本地检验码、药品商品名)一般是非标准概念,需要经映射后落到标准概念上。
各词表的典型角色如下:SNOMED 是临床发现、疾病、手术操作、解剖部位等的主力标准词表,覆盖 Condition、Procedure、Observation 等域;LOINC 是检验项目与观测指标的标准词表,对应 Measurement 与部分 Observation;RxNorm 是药品的标准词表,对应 Drug 域,其临床剂量形式(Clinical Drug)与成分(Ingredient)层级各有用途;ATC 是药品分类体系,在 OMOP 中通常作为分类概念('C')用于药物类别的层级汇总,而不是直接作为 Drug 域的标准概念;ICD-9/ICD-10 是疾病与死因分类,属于非标准概念,主要作为映射来源,也可用于与外部报表对齐。
concept_id,先看 standard_concept 是否为 'S',再看其 domain_id 是否与目标字段匹配。二者缺一,都不应直接使用。二、映射原则:从源编码到标准概念
映射的核心原则是“先找等价,再找上位,最后才考虑人工裁定”。具体可分四步:
- 精确匹配:源编码本身若已是标准概念,直接使用其
concept_id。例如源系统已用 SNOMED 编码记录诊断,则无需再映射。 - 关系表映射:通过
concept_relationship中的'Maps to'关系,从非标准概念找到标准概念。ICD-10 到 SNOMED 的映射主要走这条路。 - 层级上溯:当无法精确匹配时,可沿
'Is a'关系上溯到更通用的标准概念,但必须记录映射粒度损失,避免把“2型糖尿病伴肾病”粗化为“糖尿病”后仍当作精确映射。 - 人工裁定:对无自动映射的本地码,由临床或编码人员依据定义裁定,并保留映射来源与审核状态。
需要特别注意的是,'Maps to' 关系具有方向性:从非标准概念指向标准概念。反向查询时不能简单取反,应使用 'Mapped from' 或按 concept_id_1、concept_id_2 的实际语义判断。此外,同一源概念可能映射到多个标准概念(一对多),此时应结合域、单位、剂量形式等上下文选择,而不是随意取第一条。
三、概念表与关系表的使用
OMOP 词表由五张核心表构成:concept 存概念主数据,concept_relationship 存概念间关系,concept_ancestor 存层级祖先关系,concept_synonym 存同义词,vocabulary 存词表元数据。实际使用中,concept 用于按 concept_code、vocabulary_id、domain_id 定位概念;concept_relationship 用于跨词表映射;concept_ancestor 用于药物成分与临床剂量形式之间的层级展开,或疾病分类的上下位汇总。
下面是一段典型的映射查询示例,用于把 ICD-10 诊断码映射到 SNOMED 标准概念:
SELECT
c1.concept_code AS icd_code,
c1.concept_name AS icd_name,
c2.concept_id AS standard_concept_id,
c2.concept_name AS standard_name,
c2.vocabulary_id AS standard_vocab,
c2.domain_id AS standard_domain
FROM concept c1
JOIN concept_relationship cr
ON cr.concept_id_1 = c1.concept_id
AND cr.relationship_id = 'Maps to'
JOIN concept c2
ON c2.concept_id = cr.concept_id_2
WHERE c1.vocabulary_id = 'ICD10CM'
AND c1.concept_code = 'E11.9'
AND c2.standard_concept = 'S'
AND c2.invalid_reason IS NULL;
查询结果中,E11.9(2型糖尿病不伴并发症)会映射到一个 SNOMED 标准概念,其 domain_id 为 'Condition'。若结果为空,说明该码在当前词表版本中无自动映射,需要进入人工裁定流程。注意 invalid_reason IS NULL 这一条件不可省略,否则可能取到已废弃概念。
四、概念集的构建
概念集(concept set)是一组用于特定分析目的的概念集合,例如“糖尿病相关诊断”“降压药”“肾功能检验项目”。构建概念集通常有两种方式:一是基于 concept_ancestor 做层级展开,把某个上位概念的全部后代纳入;二是基于 concept_relationship 或显式列表,把多个来源概念映射后的标准概念合并去重。
以“糖尿病相关诊断”为例,可先定位 SNOMED 中“Diabetes mellitus”的根概念,再通过 concept_ancestor 取出其全部后代标准概念,形成初始集合;随后补充 ICD 映射过来的标准概念,并剔除 invalid_reason 非空的概念。构建完成后应记录词表版本、生成时间、纳入规则与排除规则,使概念集可复现、可审计。
五、常见陷阱与判断依据
第一,把 ATC 直接当作 Drug 域标准概念。ATC 是分类体系,standard_concept 通常为 'C',若直接写入 drug_concept_id,会导致药物分析粒度不一致。正确做法是映射到 RxNorm 标准概念,再用 ATC 做类别汇总。
第二,忽略词表版本。OMOP 词表定期更新,概念可能被废弃或替换。转换前应确认所用词表版本,并在 ETL 日志中记录版本号,否则同一批数据在不同时间运行可能得到不同结果。
第三,把“映射成功”等同于“语义正确”。自动映射可能给出粒度不匹配的结果,例如把“糖尿病伴酮症酸中毒”映射到“糖尿病”。应通过抽样复核、映射覆盖率统计和临床合理性检查来验证,而不是只看映射率。
第四,概念集缺少版本与规则记录。概念集一旦用于队列定义或指标计算,就必须可复现。建议在概念集元数据中固定词表版本、生成 SQL、纳入与排除规则、审核人及日期,使后续审计和更新有据可依。
掌握以上原则后,词表映射就不再是“查表填 ID”,而是一个有方向、有层级、有版本、可审计的语义工程过程。概念表提供定位能力,关系表提供映射与层级能力,概念集则把二者组织成可复用的分析资产。