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

Lesson 3: Understanding the Concept — The heart of OMOP CDM

What is Concept, Standard Concept vs Source Concept vs Classification Concept, concept_id vs source_value vs source_concept_id, Domain, Vocabulary, Concept Class, and how to look up on Athena.

🏗️ Architecture — Lesson 3 Understanding Concept — Heart of OMOP CDM OMOP CDM 5.4 for Beginners — Understand A to Z Part 1: Overview & Background xdev.asia

Concept System — Source, Standard and Classification

Introduction

If OMOP CDM is a house, then Concept is the brick — everything is built from Concept. Understanding the Concept is the key to understanding CDM as a whole.

This article will explain: What is Concept? Is Standard vs Source Concept different? How to look up Concept on Athena? And the "holy trinity" concept_id / source_value / source_concept_id How does it work?


1. What is concept?

1.1. Definition

Concept = a unique medical "concept", represented by a number called concept_id.

Everything you encounter in medicine has a corresponding Concept:

Medical Entityconcept_idconcept_nameVocabulary
Women8532FemaleGender
Type 2 diabetes201826Type 2 diabetes mellitusSNOMED
Metformin 500mg tablets1503297metformin 500 MG Oral TabletRxNorm
HbA1c test3004410Hemoglobin A1c/Hemoglobin.total in BloodLOINC
Percent unit8554percentUCUM
Outpatient examination9202Outpatient VisitVisit
Data from EHR32817EHRType Concept

1.2. CONCEPT table

Each Concept is saved as a row in the table CONCEPT:

SELECT *
FROM concept
WHERE concept_id = 201826;
ColumnValueDescription
concept_id201826Unique ID
concept_nameType 2 diabetes mellitusDisplay name
domain_idConditionsWhich domain does it belong to
vocabulary_idSNOMEDWhich vocabulary word
concept_class_idClinical FindingsConcept type
standard_conceptSS = Standard
concept_code44054006Original code in vocabulary
valid_start_date1970-01-01Effective start date
valid_end_date2099-12-31Expiry date
invalid_reasonNULLInvalid reason

2. Standard Concept vs Source Concept vs Classification

2.1. Three types of Concepts

  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. Specific example: "Type 2 diabetes"

  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. The holy trinity

Most clinical tables have 3 columns for each concept field:

ColumnPurposeValue
*_concept_idAnalysis — standard conceptStandard Concept ID (S)
*_source_valueTrace — original text valueOriginal text (eg: "E11", "Glucophage")
*_source_concept_idReverse Mapping — original conceptNon-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 — Which table does Concept belong to?

3.1. Main Domains

DomainDestination tableExample
ConditionsCONDITION_OCCURRENCEDiabetes, pneumonia
DrugsDRUG_EXPOSUREMetformin, Amoxicillin
ProcedurePROCEDURE_OCCURRENCEEndoscopy, surgery
MeasurementMEASUREMENTHbA1c, blood pressure, BMI
ObservationOBSERVATIONSmoking, family history
DeviceDEVICE_EXPOSUREStents, pacemakers
SpecimenSPECIMENBlood samples, tissue samples
VisitVISIT_OCCURRENCEOutpatient examination, hospitalization
GenderPERSONMale, Female
RacePERSONAsian, White
Type ConceptAll tablesEHR, Claim, Lab
UnitMEASUREMENTmg/dL, %, mmHg
RouteDRUG_EXPOSUREOral, IV, Topical

3.2. Why is Domain important?

The domain decides which table the record is in. Here are the core ETL rules:

  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 — Concept Origin

4.1. Important Vocabularies

  ┌──────────────────────────────────────────────────────────────────┐
  │  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

TypeExamplestandard_conceptUsed in column
StandardSNOMED CT, RxNorm, LOINC'S'*_concept_id
Non-standardICD-10, NDC, ATC, MedDRANULL*_source_concept_id
ClassificationSNOMED hierarchy nodes'C'Used in hierarchical queries

4.3. Mapping process

  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 lookup 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 — Detailed classification

Each Concept belongs to a Concept Class that indicates which level of vocabulary it belongs to:

DomainConcept ClassExample
ConditionsClinical FindingsType 2 diabetes mellitus
DrugsIngredientMetformin
DrugsClinical DrugMetformin 500 MG Oral Tablet
DrugsBranded DrugGlucophage 500 MG Oral Tablet
MeasurementLab TestHemoglobin A1c
MeasurementClinical ObservationBodyweight
ProcedureProcedureCoronary artery bypass grafting
ObservationContext-dependentHistory of clinical findings

Drug Concept Class — Particularly important

RxNorm organizes drugs by level:

  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. Look up Concept on Athena

6.1. What is Athena?

Athena (https://athena.ohdsi.org/) is a free web tool to look up Standardized Vocabularies.

6.2. Search instructions

Step 1: Access https://athena.ohdsi.org/ (need to create free account)

Step 2: Enter a keyword, for example "diabetes type 2"

Step 3: Filter results:

  • Standard Concept: select "Standard" to see only standard concepts
  • Domain: select "Condition" if searching for a disease
  • Vocabulary: select "SNOMED" or "ICD10CM"

Step 4: See concept details:

  • Concept ID, name, class, domain, vocabulary
  • Relationships tab: see "Maps to", "Is a", "Has component"
  • Hierarchy tab: see father/child concept

6.3. Popular lookup example

  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 — When unable to map

When source data cannot be mapped to 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

This is completely valid. OMOP CDM allows it concept_id = 0, but the goal is to minimize the number of records with concept_id = 0 by:

  1. Use SOURCE_TO_CONCEPT_MAP for custom mappings
  2. Use Usagi tool for semi-automatic mapping
  3. Ask the community to add new concepts to the vocabulary

8. Practice: Read a CDM record

For the following record in 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'

Decoding:

SchoolValueMeaning
condition_concept_id = 201826SNOMED "Type 2 diabetes mellitus"Standard diagnosis
condition_type_concept_id = 32817"EHR"Data from EMR system
condition_status_concept_id = 32902"Primary diagnosis"Primary Diagnosis
condition_source_value = 'E11'ICD-10-CM original codeOriginal code from HIS
condition_source_concept_id = 443238ICD-10-CM concept for "E11"Original concept
provider_id = 5001Diagnosis DoctorLook up table PROVIDER
visit_occurrence_id = V001Outpatient visitsLook up the table VISIT_OCCURRENCE

Summary

In this article, you have learned:

  1. Concept = medical concept, represented by unique concept_id
  2. 3 types of Concept: Standard (S), Classification (C), Source (NULL)
  3. Triple columns: *_concept_id / *_source_value / *_source_concept_id
  4. Domain decides which table the record is in
  5. Vocabulary: SNOMED (Condition), RxNorm (Drug), LOINC (Measurement)
  6. Concept Class: detailed classification (Ingredient vs Clinical Drug...)
  7. Athena: free concept lookup tool
  8. concept_id = 0: valid when map is not possible

Next post: We'll start by exploring the first table — PERSON — where patient demographic information is stored.


References