Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card
Як нормалізувати медичні дані
Посібник: перетворіть медичні дані з багатьох джерел в одну порівнянну форму — пошук LOINC, одиниці UCUM, дати ISO, референтні діапазони, відсутність дублікатів при повторній спробі та валідація за європейським лабораторним профілем.
Нормалізація медичних даних означає перетворення значень, які надходять у різних формах, в одну порівнянну форму: однаковий код для одного й того ж тесту, однакова система одиниць вимірювання, дати в одному форматі, кожне значення з його діапазоном посилань та його джерелом, і без дублікатів. Цей посібник показує, як це зробити перед тим, як дані потраплять до запису HL7 FHIR R4: пошук кодів LOINC та ATC, використання одиниць UCUM, відхилення неоднозначних дат, збереження діапазонів, уникнення дублікатів при повторних спробах та перевірка результату за європейським лабораторним профілем. Кожна показана відповідь надходить з Anpheros API.
Чому це важливо
Той самий результат HbA1c може надійти до вас як "HbA1c 6,4 %", "Гемоглобін глікований: 6.4", "Glycated haemoglobin 46 mmol/mol" або лише лабораторний код, який розуміє одна лабораторія. Доки вони не стануть одним кодом з однією одиницею вимірювання:
- діаграма показників HbA1c пацієнта з часом показуватиме три непов'язані лінії;
- сповіщення про "HbA1c вище 6,5 %" пропустить два зі значень;
- модель ШІ побачить чотири факти замість однієї тенденції;
- інша система, що отримує запис, не зможе його інтерпретувати.
Нормалізація повинна відбуватися в момент надходження даних до запису, один раз, а не в кожному додатку, який згодом їх читає.
Що містить нормалізоване значення
| Частина | Нормалізована форма | Приклад |
|---|---|---|
| Що вимірювалося | код зі стандартної системи | LOINC 4548-4 (HbA1c), RxNorm 6809 (метформін), ICD-10 E11 (цукровий діабет 2 типу) |
| Значення | число або текст, тільки якщо результат не є числовим | 6.4 |
| Одиниця вимірювання | UCUM | %, mg/dL, mm[Hg], kg |
| Коли | дата-час за стандартом ISO 8601, із зазначенням часового поясу, якщо час має значення | 2026-10-01T07:30:00Z |
| Нормальний діапазон | нижнє та верхнє значення в тій самій одиниці вимірювання | 4.0–5.6 |
| Джерело | хто його створив і з якої системи | import з labx |
| Ідентифікатор | щось, що робить повторний запис впізнаваним | ключ ідемпотентності або ідентифікатор джерела |
Яка кодова система відповідає якому типу ресурсу, перелічено в розділі Кодові системи FHIR.
Крок 1: знайдіть код
Шукайте термінологію платформи за англійською або румунською назвою, або за скороченням:
curl "https://platform.anpheros.com/v1/terminology/loinc?q=hba1c" -H "Authorization: Bearer $KEY"
curl "https://platform.anpheros.com/v1/terminology/loinc?q=hemoglobina%20glicozilata" -H "Authorization: Bearer $KEY"
Обидва повертають однакове поняття:
{"data": [{"system": "http://loinc.org", "code": "4548-4", "display": "Hemoglobin A1c/Hemoglobin.total in Blood",
"display_ro": "Hemoglobină glicozilată (HbA1c)", "category": "laboratory", "unit": "%"}], "total": 1}
Для ліків, Anpheros Search знаходить речовину за назвою або брендом і надає її RxNorm ingredient code та EMA product numbers:
curl "https://platform.anpheros.com/v1/search?q=metformin&type=treatment" -H "Authorization: Bearer $KEY"
Поле unit — це одиниця, яку LOINC очікує для цього тесту. Використовуйте його, щоб перевірити, що ви отримали. Створіть зіставлення від власних назв кожного джерела до кодів один раз, для кожного джерела, і зберігайте його у своїй інтеграції. Не вгадуйте під час запису: коли назва неоднозначна, і ніщо у джерелі не вирішує її, залиште її незіставленою та запитайте джерело. Як імпортувати лабораторні результати до запису FHIR показує, як зберігаються та повідомляються незіставлені лабораторні маркери.
Крок 2: запис із кодами, одиницями вимірювання та діапазонами
curl -X POST "https://platform.anpheros.com/v1/patients/$PID/observations" -H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" -H "Idempotency-Key: lab-77-hba1c" -d '{
"code": "4548-4", "category": "laboratory",
"value": 6.4, "unit": "%", "effective_at": "2026-10-01T07:30:00Z",
"reference_range": {"low": 4.0, "high": 5.6},
"author_type": "import"
}'
{"id": "3296315c-…", "code": "4548-4", "system": "http://loinc.org", "display": "Hemoglobin A1c/Hemoglobin.total in Blood",
"category": "laboratory", "effective_at": "2026-10-01T07:30:00Z", "value": 6.4, "unit": "%",
"reference_range": {"low": 4.0, "high": 5.6}, "status": "final", "fhir": "Observation/3296315c-…"}
Коли ви надсилаєте лише код, платформа заповнює стандартну назву LOINC, як у REST API, так і в FHIR API (/fhir/R4), тому кожна програма читає одне й те саме display. display, який ви надсилаєте самостійно, зберігається як є.
Зберігайте також оригінальне формулювання. Для лабораторного звіту code.text у FHIR Observation містить назву лабораторії ("Hemoglobina glicozilata (HbA1c)") поруч із кодуванням LOINC. Пацієнт все ще впізнає свій паперовий звіт, і нічого не втрачається, якщо зіставлення колись буде поставлено під сумнів.
Крок 3: одиниці вимірювання
Використовуйте коди UCUM: mg/dL, mmol/L, %, mm[Hg], kg, cm, /min, Cel. Два правила запобігають більшості помилок:
- Не конвертуйте мовчки. Якщо лабораторія повідомляє рівень глюкози в
mmol/L, а ваш додаток відображаєmg/dL, зберігайте те, що виміряла лабораторія, і конвертуйте під час відображення. Збережене значення залишається простежуваним до звіту. - Перевіряйте одиницю вимірювання проти коду. Коди LOINC є специфічними: HbA1c в
%— це4548-4, тоді як HbA1c вmmol/molмає інший код LOINC. Значення, одиниця вимірювання якого не відповідає очікуваній одиниці коду, є помилкою зіставлення, а не проблемою конвертації.
Anpheros не конвертує одиниці вимірювання для вас; він зберігає одиницю, яку ви надсилаєте.
Крок 4: дати
Перетворіть дати до формату ISO 8601 перед записом, використовуючи відомий формат джерела. 01.10.2026 — це 1 жовтня в Румунії та багатьох європейських країнах, але 10/01/2026 — це 1 жовтня лише в Сполучених Штатах. API відхиляє все, що не є ISO, замість того, щоб вгадувати:
{"error": {"type": "invalid", "message": "Input should be a valid datetime or date, invalid character in year (at effective_at)", "field": "effective_at"}}
Виняток становить лабораторний конектор: він приймає DD.MM.YYYY та DD/MM/YYYY, оскільки знає, що читає європейський звіт.
Для вимірювань, де важливий час доби (артеріальний тиск, глюкоза, дози ліків), надсилайте час із його часовим поясом. Показання о 23:30 в Бухаресті припадають на попередній день за UTC, і пацієнт очікує їх у день, коли вони були зроблені.
Крок 5: відсутність дублікатів
Дублікати виникають через повторні спроби, надсилання одного й того ж звіту двічі та надходження одного й того ж значення двома шляхами.
- Повторні спроби: надсилайте
Idempotency-Key, який ідентифікує значення у джерелі, наприклад, ідентифікатор звіту та тест. Повторне надсилання того ж запиту з тим самим ключем повертає першу відповідь і не зберігає нічого нового. SDK додають одиницю до кожного створення. - Один і той же звіт двічі: лабораторний конектор створює стабільний ідентифікатор для кожного рядка зі звіту, коду, дати та значення, і пропускає рядки, які вже були імпортовані.
- Два шляхи: зберігайте власний ідентифікатор системи-джерела з
X-Anpheros-Origin-Id(або вidentifierу ресурсах FHIR) і шукайте його перед записом значень, які можуть повернутися іншим шляхом.
Крок 6: перевірка за профілем
Для лабораторних результатів запитайте платформу, наскільки ресурс відповідає профілю HL7 Europe для лабораторних звітів, перш ніж покладатися на нього:
curl -X POST "https://platform.anpheros.com/fhir/R4/Observation/\$validate?profile=eu-lab" -H "Authorization: Bearer $KEY" \
-H "Content-Type: application/fhir+json" -d '{
"resourceType": "Observation", "status": "final",
"category": [{"coding": [{"system": "http://terminology.hl7.org/CodeSystem/observation-category", "code": "laboratory"}]}],
"code": {"text": "HbA1c"}, "subject": {"reference": "Patient/'$PID'"},
"valueQuantity": {"value": 6.4, "unit": "%"}
}'
Цей ненормалізований результат отримує точний список:
{"resourceType": "OperationOutcome", "issue": [
{"severity": "error", "code": "invalid", "diagnostics": "Observation.code must carry a LOINC coding.", "expression": ["Observation.code"]},
{"severity": "error", "code": "required", "diagnostics": "Observation.effective[x] is required.", "expression": ["Observation.effective"]},
{"severity": "warning", "code": "business-rule", "diagnostics": "valueQuantity should carry a UCUM system and code.", "expression": ["Observation.valueQuantity"]},
{"severity": "warning", "code": "informational", "diagnostics": "No referenceRange: interpretation will need the laboratory's ranges.", "expression": ["Observation.referenceRange"]},
{"severity": "information", "code": "informational", "diagnostics": "No performer (laboratory) recorded.", "expression": ["Observation.performer"]},
{"severity": "information", "code": "informational", "diagnostics": "No issued time (when the laboratory released the result).", "expression": ["Observation.issued"]}]}
Кожна проблема відповідає одному з наведених вище кроків. Запустіть $validate у своїх інтеграційних тестах з реальними зразками з кожного джерела.
Крок 7: збереження джерела
Нормалізація змінює спосіб запису значення, але ніколи не його походження. Надсилайте author_type (device, import, practitioner, patient) та X-Anpheros-Source-System з кожним записом. Це дозволяє лікарю, аудитору або моделі ШІ відрізнити лабораторний результат від значення, введеного вдома. Див. Пояснення походження медичних даних.
Чеклист
- [ ] Кожне джерело має відображення своїх назв на LOINC / ATC / ICD-10, збережене у вашій інтеграції
- [ ] Неоднозначні назви залишаються невідображеними та повідомляються, ніколи не вгадуються
- [ ] Одиниці UCUM, що відповідають коду; без прихованого перетворення
- [ ] Дати у форматі ISO 8601, із часовими поясами, де час має значення
- [ ] Діапазони посилань зберігаються разом із лабораторними значеннями
- [ ] Оригінальне формулювання збережено (
code.text) - [ ] Ключі ідемпотентності або ідентифікатори джерела при кожному записі
- [ ]
author_typeта система джерела при кожному записі - [ ]
$validateу тестах для лабораторних результатів
Часті запитання
Що таке нормалізація медичних даних?
Перетворення медичних даних з різних джерел в одну стандартну форму: спільні коди (LOINC для тестів та вимірювань, ICD-10 для діагнозів, ATC для медикаментів), одиниці UCUM, дати ISO, референтні діапазони та записане джерело, щоб значення з різних систем можна було порівнювати, комбінувати та обмінювати.
Чи слід перетворювати всі значення в одну одиницю?
Зберігайте одиницю, в якій вимірювало джерело, доки вона є дійсною одиницею UCUM, що відповідає коду, і перетворюйте під час відображення або аналізу. Це дозволяє відстежувати кожне збережене значення до його початкового звіту.
Чи може нормалізація бути повністю автоматичною?
Здебільшого. Коди у джерелі, відомі назви та добре сформовані одиниці можуть бути відображені автоматично. Неоднозначні назви та невідомі локальні коди потребують одноразового рішення людини для кожного джерела, після чого відображення стає автоматичним.
Пов'язане
- Системи кодів FHIR
- Як імпортувати лабораторні результати до запису FHIR
- Пояснення походження медичних даних
- Сумісність медичних даних
- API медичних даних
Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card