Chuyển đến nội dung chính

Bài 3: Hiểu Concept — Trái tim của OMOP CDM

Concept là gì, Standard Concept vs Source Concept vs Classification Concept, concept_id vs source_value vs source_concept_id, Domain, Vocabulary, Concept Class, và cách tra cứu trên Athena.

🏗️ Kiến trúc — Bài 3 Hiểu Concept — Trái tim của OMOP CDM OMOP CDM 5.4 cho Người mới — Hiểu từ A đến Z Phần 1: Tổng quan & Nền tảng xdev.asia

Hệ thống Concept — Source, Standard và Classification

Giới thiệu

Nếu OMOP CDM là một ngôi nhà, thì Concept chính là viên gạch — mọi thứ đều được xây dựng từ Concept. Hiểu rõ Concept là chìa khóa để hiểu toàn bộ CDM.

Bài này sẽ giải thích: Concept là gì? Standard vs Source Concept khác nhau sao? Làm sao tra cứu Concept trên Athena? Và "bộ ba thần thánh" concept_id / source_value / source_concept_id hoạt động thế nào.


1. Concept là gì?

1.1. Định nghĩa

Concept = một "khái niệm" duy nhất trong y tế, được đại diện bởi một con số gọi là concept_id.

Mọi thứ bạn gặp trong y tế đều có Concept tương ứng:

Thực thể y tếconcept_idconcept_nameVocabulary
Nữ giới8532FemaleGender
Tiểu đường type 2201826Type 2 diabetes mellitusSNOMED
Metformin 500mg tablet1503297metformin 500 MG Oral TabletRxNorm
Xét nghiệm HbA1c3004410Hemoglobin A1c/Hemoglobin.total in BloodLOINC
Đơn vị phần trăm8554percentUCUM
Khám ngoại trú9202Outpatient VisitVisit
Dữ liệu từ EHR32817EHRType Concept

1.2. Bảng CONCEPT

Mỗi Concept được lưu như một dòng trong bảng CONCEPT:

SELECT *
FROM concept
WHERE concept_id = 201826;
CộtGiá trịMô tả
concept_id201826ID duy nhất
concept_nameType 2 diabetes mellitusTên hiển thị
domain_idConditionThuộc domain nào
vocabulary_idSNOMEDTừ vocabulary nào
concept_class_idClinical FindingLoại concept
standard_conceptSS = Standard
concept_code44054006Mã gốc trong vocabulary
valid_start_date1970-01-01Ngày bắt đầu có hiệu lực
valid_end_date2099-12-31Ngày hết hạn
invalid_reasonNULLLý do không hợp lệ

2. Standard Concept vs Source Concept vs Classification

2.1. Ba loại Concept

  standard_concept column:
  ┌─────────────────────────────────────────────────────────────┐
  │                                                             │
  │  'S' = STANDARD CONCEPT                                    │
  │  → Dùng trong *_concept_id columns                          │
  │  → Là "đại diện chính thức" cho một khái niệm              │
  │  → VD: SNOMED 201826 "Type 2 diabetes mellitus"             │
  │                                                             │
  │  'C' = CLASSIFICATION CONCEPT                               │
  │  → Dùng để phân nhóm/phân cấp                              │
  │  → KHÔNG dùng trực tiếp trong clinical tables               │
  │  → VD: SNOMED parent concepts                               │
  │                                                             │
  │  NULL = NON-STANDARD (SOURCE) CONCEPT                       │
  │  → Mã từ vocabulary gốc                                     │
  │  → Lưu trong *_source_concept_id columns                    │
  │  → VD: ICD-10 E11 "Type 2 diabetes mellitus"               │
  │                                                             │
  └─────────────────────────────────────────────────────────────┘

2.2. Ví dụ cụ thể: "Tiểu đường type 2"

  ICD-10-CM 'E11'                         SNOMED 44054006
  ┌──────────────────────┐    Maps to     ┌──────────────────────────┐
  │ concept_id = 443238  │ ──────────→    │ concept_id = 201826      │
  │ standard_concept=NULL│                │ standard_concept = 'S'    │
  │ vocabulary=ICD10CM   │                │ vocabulary = SNOMED       │
  │ (Source Concept)     │                │ (Standard Concept)        │
  └──────────────────────┘                └──────────────────────────┘

  Trong bảng CONDITION_OCCURRENCE:
  ┌────────────────────────────────────────────────────────────────────┐
  │ condition_concept_id        = 201826    ← Standard (SNOMED)       │
  │ condition_source_value      = 'E11'     ← Text gốc từ HIS        │
  │ condition_source_concept_id = 443238    ← Source Concept (ICD-10) │
  └────────────────────────────────────────────────────────────────────┘

2.3. Bộ ba thần thánh

Hầu hết bảng clinical có 3 cột cho mỗi trường concept:

CộtMục đíchGiá trị
*_concept_idPhân tích — concept chuẩnStandard Concept ID (S)
*_source_valueTruy vết — giá trị gốc dạng textText gốc (VD: "E11", "Glucophage")
*_source_concept_idMapping ngược — concept gốcNon-standard Concept ID
  ┌── Dùng để phân tích (SELECT, GROUP BY, JOIN)
  │
  condition_concept_id = 201826  ← Standard SNOMED
                                                    ├── Truy nguyên nguồn gốc
  condition_source_value = 'E11'  ← Text gốc HIS   │
  condition_source_concept_id = 443238  ← ICD-10 ───┘

3. Domain — Concept thuộc bảng nào?

3.1. Các Domain chính

DomainBảng đíchVí dụ
ConditionCONDITION_OCCURRENCETiểu đường, viêm phổi
DrugDRUG_EXPOSUREMetformin, Amoxicillin
ProcedurePROCEDURE_OCCURRENCENội soi, phẫu thuật
MeasurementMEASUREMENTHbA1c, huyết áp, BMI
ObservationOBSERVATIONHút thuốc, tiền sử gia đình
DeviceDEVICE_EXPOSUREStent, máy tạo nhịp
SpecimenSPECIMENMẫu máu, mẫu mô
VisitVISIT_OCCURRENCEKhám ngoại trú, nhập viện
GenderPERSONMale, Female
RacePERSONAsian, White
Type ConceptMọi bảngEHR, Claim, Lab
UnitMEASUREMENTmg/dL, %, mmHg
RouteDRUG_EXPOSUREOral, IV, Topical

3.2. Tại sao Domain quan trọng?

Domain quyết định bản ghi nằm ở bảng nào. Đây là quy tắc ETL cốt lõi:

  Dữ liệu nguồn: "ICD-10: Z87.891 — History of nicotine dependence"
  
  Bước 1: Tra cứu ICD-10 Z87.891 trên Athena
  Bước 2: Tìm Standard Concept → maps to SNOMED concept
  Bước 3: Standard Concept thuộc domain "Observation"
  Bước 4: Lưu vào bảng OBSERVATION (không phải CONDITION!)
  
  ⚠️ Dù ICD-10 thường gắn với Condition domain,
  nhưng "History of" map sang Observation domain

4. Vocabulary — Nguồn gốc Concept

4.1. Các Vocabulary quan trọng

  ┌──────────────────────────────────────────────────────────────────┐
  │  VOCABULARY CHÍNH TRONG OMOP CDM                                 │
  │                                                                   │
  │  ┌─────────────┐   Conditions (diagnoses, symptoms)              │
  │  │  SNOMED CT  │   → Standard vocabulary cho Condition domain     │
  │  └─────────────┘                                                  │
  │                                                                   │
  │  ┌─────────────┐   Drugs (medications, vaccines)                  │
  │  │  RxNorm     │   → Standard vocabulary cho Drug domain          │
  │  └─────────────┘                                                  │
  │                                                                   │
  │  ┌─────────────┐   Measurements (lab tests, vitals)              │
  │  │   LOINC     │   → Standard vocabulary cho Measurement domain  │
  │  └─────────────┘                                                  │
  │                                                                   │
  │  ┌─────────────┐   Procedures                                     │
  │  │  SNOMED CT  │   → Standard vocabulary cho Procedure domain     │
  │  │  CPT4       │   → US-specific procedures                       │
  │  └─────────────┘                                                  │
  │                                                                   │
  │  SOURCE VOCABULARIES (Non-standard, cần mapping):                 │
  │  ICD-10-CM/VN, ICD-9-CM, NDC, HCPCS, ATC, Read, MedDRA         │
  └──────────────────────────────────────────────────────────────────┘

4.2. Standard vs Non-standard Vocabulary

LoạiVí dụstandard_conceptDùng ở cột
StandardSNOMED CT, RxNorm, LOINC'S'*_concept_id
Non-standardICD-10, NDC, ATC, MedDRANULL*_source_concept_id
ClassificationSNOMED hierarchy nodes'C'Dùng trong queries phân cấp

4.3. Quá trình Mapping

  HIS: "E11" (ICD-10)
       │
       │  Tra bảng CONCEPT_RELATIONSHIP
       │  relationship_id = 'Maps to'
       ↓
  Source Concept: 443238 (ICD-10 E11)
       │
       │  Maps to
       ↓
  Standard Concept: 201826 (SNOMED Type 2 diabetes mellitus)

SQL tra cứu mapping:

-- Tìm Standard Concept từ ICD-10 code 'E11'
SELECT
    c1.concept_id   AS source_concept_id,
    c1.concept_name AS source_name,
    c1.vocabulary_id AS source_vocab,
    c2.concept_id   AS standard_concept_id,
    c2.concept_name AS standard_name,
    c2.vocabulary_id AS standard_vocab
FROM concept c1
JOIN concept_relationship cr
    ON c1.concept_id = cr.concept_id_1
    AND cr.relationship_id = 'Maps to'
JOIN concept c2
    ON cr.concept_id_2 = c2.concept_id
    AND c2.standard_concept = 'S'
WHERE c1.concept_code = 'E11'
  AND c1.vocabulary_id = 'ICD10CM';

5. Concept Class — Phân loại chi tiết

Mỗi Concept thuộc một Concept Class cho biết nó thuộc cấp độ nào trong vocabulary:

DomainConcept ClassVí dụ
ConditionClinical FindingType 2 diabetes mellitus
DrugIngredientMetformin
DrugClinical DrugMetformin 500 MG Oral Tablet
DrugBranded DrugGlucophage 500 MG Oral Tablet
MeasurementLab TestHemoglobin A1c
MeasurementClinical ObservationBody weight
ProcedureProcedureCoronary artery bypass grafting
ObservationContext-dependentHistory of clinical finding

Drug Concept Class — Đặc biệt quan trọng

RxNorm tổ chức thuốc theo cấp độ:

  INGREDIENT (hoạt chất)
  └── Metformin (concept_id = 1503297)
       │
       ├── CLINICAL DRUG FORM
       │   └── Metformin Oral Tablet
       │        │
       │        ├── CLINICAL DRUG (hoạt chất + liều + dạng)
       │        │   └── Metformin 500 MG Oral Tablet
       │        │        │
       │        │        └── BRANDED DRUG (tên thương mại)
       │        │            └── Glucophage 500 MG Oral Tablet
       │        │
       │        └── CLINICAL DRUG
       │            └── Metformin 1000 MG Oral Tablet
       │
       └── CLINICAL DRUG FORM
           └── Metformin Extended Release Oral Tablet

6. Tra cứu Concept trên Athena

6.1. Athena là gì?

Athena (https://athena.ohdsi.org/) là công cụ web miễn phí để tra cứu Standardized Vocabularies.

6.2. Hướng dẫn tra cứu

Bước 1: Truy cập https://athena.ohdsi.org/ (cần tạo tài khoản miễn phí)

Bước 2: Nhập từ khóa, ví dụ "diabetes type 2"

Bước 3: Lọc kết quả:

  • Standard Concept: chọn "Standard" để chỉ xem concept chuẩn
  • Domain: chọn "Condition" nếu tìm bệnh
  • Vocabulary: chọn "SNOMED" hoặc "ICD10CM"

Bước 4: Xem chi tiết concept:

  • Concept ID, name, class, domain, vocabulary
  • Tab Relationships: xem "Maps to", "Is a", "Has component"
  • Tab Hierarchy: xem concept cha/con

6.3. Ví dụ tra cứu phổ biến

  Tìm bệnh tiểu đường type 2:
  → Search: "type 2 diabetes"
  → Filter: Domain=Condition, Standard=Standard
  → Kết quả: concept_id=201826, SNOMED "Type 2 diabetes mellitus"

  Tìm thuốc Metformin:
  → Search: "metformin"
  → Filter: Domain=Drug, Concept Class=Ingredient
  → Kết quả: concept_id=1503297, RxNorm "metformin"

  Tìm xét nghiệm HbA1c:
  → Search: "hemoglobin a1c"
  → Filter: Domain=Measurement, Standard=Standard
  → Kết quả: concept_id=3004410, LOINC "Hemoglobin A1c/Hemoglobin.total"

7. concept_id = 0 — Khi không map được

Khi dữ liệu nguồn không thể map sang Standard Concept:

-- Một mã thuốc nội bộ bệnh viện không có trong RxNorm
drug_concept_id        = 0              -- Không map được!
drug_source_value      = 'THUOC_BV_001' -- Vẫn giữ mã gốc
drug_source_concept_id = 0              -- Cũng không có source concept

Điều này hoàn toàn hợp lệ. OMOP CDM cho phép concept_id = 0, nhưng mục tiêu là giảm thiểu số bản ghi có concept_id = 0 bằng cách:

  1. Sử dụng SOURCE_TO_CONCEPT_MAP cho custom mappings
  2. Dùng công cụ Usagi để mapping bán tự động
  3. Yêu cầu cộng đồng thêm concepts mới vào vocabulary

8. Thực hành: Đọc một bản ghi CDM

Cho bản ghi sau trong CONDITION_OCCURRENCE:

condition_occurrence_id    = 50001
person_id                  = 12345
condition_concept_id       = 201826
condition_start_date       = '2024-06-10'
condition_start_datetime   = '2024-06-10 09:30:00'
condition_end_date         = NULL
condition_end_datetime     = NULL
condition_type_concept_id  = 32817
condition_status_concept_id = 32902
provider_id                = 5001
visit_occurrence_id        = V001
condition_source_value     = 'E11'
condition_source_concept_id = 443238
condition_status_source_value = 'admitting'

Giải mã:

TrườngGiá trịÝ nghĩa
condition_concept_id = 201826SNOMED "Type 2 diabetes mellitus"Chẩn đoán chuẩn
condition_type_concept_id = 32817"EHR"Dữ liệu từ hệ thống EMR
condition_status_concept_id = 32902"Primary diagnosis"Chẩn đoán chính
condition_source_value = 'E11'ICD-10-CM code gốcMã gốc từ HIS
condition_source_concept_id = 443238ICD-10-CM concept cho "E11"Concept gốc
provider_id = 5001Bác sĩ chẩn đoánTra bảng PROVIDER
visit_occurrence_id = V001Lượt khám ngoại trúTra bảng VISIT_OCCURRENCE

Tổng kết

Trong bài này, bạn đã hiểu:

  1. Concept = khái niệm y tế, đại diện bởi concept_id duy nhất
  2. 3 loại Concept: Standard (S), Classification (C), Source (NULL)
  3. Bộ ba cột: *_concept_id / *_source_value / *_source_concept_id
  4. Domain quyết định bản ghi nằm ở bảng nào
  5. Vocabulary: SNOMED (Condition), RxNorm (Drug), LOINC (Measurement)
  6. Concept Class: phân loại chi tiết (Ingredient vs Clinical Drug...)
  7. Athena: công cụ tra cứu concept miễn phí
  8. concept_id = 0: hợp lệ khi không map được

Bài tiếp theo: Chúng ta sẽ bắt đầu khám phá bảng đầu tiên — PERSON — nơi lưu trữ thông tin nhân khẩu bệnh nhân.


Tài liệu tham khảo