# Jak normalizovat lékařská data

> Návod: přeměňte lékařská data z mnoha zdrojů do jedné srovnatelné formy — vyhledávání LOINC, jednotky UCUM, ISO data, referenční rozsahy, žádné duplicity při opakování a validace proti evropskému laboratornímu profilu.

Source: https://developers.anpheros.com/cs/guides/normalize-medical-data

**Normalizace lékařských dat znamená přeměnu hodnot, které přicházejí v mnoha podobách, do jedné srovnatelné formy: stejný kód pro stejný test, stejný systém jednotek, data v jednom formátu, každá hodnota s jejím referenčním rozsahem a jejím zdrojem a žádné duplicity.** Tento návod ukazuje, jak to provést předtím, než data dosáhnou záznamu HL7 FHIR R4: vyhledávání kódů LOINC a ATC, používání jednotek UCUM, odmítání nejednoznačných dat, uchovávání rozsahů, vyhýbání se duplicitám při opakování a kontrola výsledku proti evropskému laboratornímu profilu. Každá zobrazená odpověď pochází z Anpheros API.

## Proč na tom záleží

Stejný výsledek HbA1c k vám může dorazit jako „HbA1c 6,4 %“, „Hemoglobina glicozilata: 6.4“, „Glycated haemoglobin 46 mmol/mol“ nebo pouze laboratorní kód, kterému rozumí jen jedna laboratoř. Dokud se toto nestane jedním kódem s jednou jednotkou:

- graf HbA1c pacienta v průběhu času zobrazuje tři nesouvisející linie;
- upozornění na „HbA1c nad 6,5 %“ mine dvě z hodnot;
- model umělé inteligence vidí čtyři fakta místo jednoho trendu;
- jiný systém přijímající záznam jej nemůže interpretovat.

Normalizace patří do bodu, kde data vstupují do záznamu, jednou, nikoli do každé aplikace, která je později čte.

## Co obsahuje normalizovaná hodnota

| Část | Normalizovaná forma | Příklad |
|---|---|---|
| Co bylo měřeno | kód ze standardního systému | LOINC `4548-4` (HbA1c), RxNorm `6809` (metformin), ICD-10 `E11` (diabetes mellitus 2. typu) |
| Hodnota | číslo, nebo text pouze v případě, že výsledek není numerický | `6.4` |
| Jednotka | UCUM | `%`, `mg/dL`, `mm[Hg]`, `kg` |
| Kdy | datum a čas ve formátu ISO 8601, s časovým pásmem, pokud je čas důležitý | `2026-10-01T07:30:00Z` |
| Normální rozsah | dolní a horní mez, ve stejné jednotce | `4.0`–`5.6` |
| Zdroj | kdo ji vyprodukoval a z jakého systému | `import` z `labx` |
| Identita | něco, co činí opakování rozpoznatelným | klíč pro idempotenci nebo identifikátor zdroje |

Který kódovací systém patří ke kterému typu zdroje je uvedeno v [FHIR kódovacích systémech](https://developers.anpheros.com/cs/guides/fhir-code-systems).

## Krok 1: Najděte kód

Vyhledejte terminologii platformy podle anglického nebo rumunského názvu, případně podle zkratky:

```bash
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"
```

Obě možnosti vrátí stejný koncept:

```json
{"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}
```

Pro léčivé přípravky vyhledá [Anpheros Search](https://developers.anpheros.com/cs/guides/anpheros-search) látku podle názvu nebo značky a poskytne její RxNorm kód složky a čísla produktů EMA:

```bash
curl "https://platform.anpheros.com/v1/search?q=metformin&type=treatment" -H "Authorization: Bearer $KEY"
```

Pole `unit` je jednotka, kterou LOINC pro daný test očekává. Použijte jej ke kontrole toho, co jste obdrželi. Sestavte mapování z vlastních názvů každého zdroje na kódy jednou pro každý zdroj a uchovávejte jej ve své integraci. Nehádejte v době zápisu: pokud je název nejednoznačný a nic ve zdroji jej neupřesňuje, ponechte jej nemapovaný a zeptejte se zdroje. [Jak importovat laboratorní výsledky do záznamu FHIR](https://developers.anpheros.com/cs/guides/import-lab-results-fhir) ukazuje, jak jsou nemapované laboratorní markery uchovávány a hlášeny.

## Krok 2: Zápis pomocí kódů, jednotek a rozsahů

```bash
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"
}'
```

```json
{"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-…"}
```

Když odešlete pouze kód, platforma doplní standardní název LOINC, a to jak na REST API, tak na FHIR API (`/fhir/R4`), takže každá aplikace čte stejný `display`. `display`, který odešlete sami, zůstane tak, jak je.

Zachovejte také původní znění. Pro laboratorní zprávu drží `code.text` na FHIR Observation název laboratoře ("Hemoglobina glicozilata (HbA1c)") vedle kódování LOINC. Pacient stále rozpozná svou papírovou zprávu a nic se neztratí, pokud by se mapování někdy zpochybnilo.

## Krok 3: Jednotky

Používejte kódy UCUM: `mg/dL`, `mmol/L`, `%`, `mm[Hg]`, `kg`, `cm`, `/min`, `Cel`. Většině chyb zabrání dvě pravidla:

- **Neimprovizujte při převodu.** Pokud laboratoř hlásí glukózu v `mmol/L` a vaše aplikace zobrazuje `mg/dL`, ukládejte to, co laboratoř změřila, a převádějte až při zobrazování. Uložená hodnota zůstává sledovatelná k původnímu hlášení.
- **Zkontrolujte jednotku oproti kódu.** Kódy LOINC jsou specifické: HbA1c v `%` je `4548-4`, zatímco HbA1c v `mmol/mol` má jiný kód LOINC. Hodnota, jejíž jednotka neodpovídá očekávané jednotce kódu, je chybou mapování, nikoli problémem s převodem.

Anpheros jednotky za vás nepřevádí; ukládá jednotku, kterou odešlete.

## Krok 4: Datumy

Před zápisem převedete datumy do formátu ISO 8601 s použitím známého formátu zdroje. `01.10.2026` je 1. říjen v Rumunsku a mnoha evropských zemích, ale `10/01/2026` je 1. říjen pouze ve Spojených státech. API odmítá cokoliv, co není ve formátu ISO, místo aby se pokoušelo hádat:

```json
{"error": {"type": "invalid", "message": "Input should be a valid datetime or date, invalid character in year (at effective_at)", "field": "effective_at"}}
```

Výjimkou je konektor pro laboratoře: přijímá `DD.MM.YYYY` a `DD/MM/YYYY`, protože ví, že čte evropskou zprávu.

U měření, kde záleží na denní době (krevní tlak, glukóza, dávky léků), odešlete čas s jeho časovým pásmem. Hodnota naměřená ve 23:30 v Bukurešti je v UTC předchozího dne a pacient očekává, že bude zaznamenána ve den, kdy byla provedena.

## Krok 5: žádné duplicity

Duplicity vznikají při opakovaných pokusech, při odeslání stejné zprávy dvakrát a při příchodu stejné hodnoty dvěma cestami.

- **Opakované pokusy:** odešlete `Idempotency-Key`, který identifikuje hodnotu ve zdroji, například ID zprávy a test. Opětovné odeslání stejného požadavku se stejným klíčem vrátí první odpověď a nic nového neuloží. SDK přidávají ke každému vytvoření jednu.
- **Stejná zpráva dvakrát:** konektor laboratoře sestaví stabilní identifikátor na řádek ze zprávy, kódu, data a hodnoty a přeskočí již importované řádky.
- **Dvě cesty:** uložte vlastní ID zdrojového systému pomocí `X-Anpheros-Origin-Id` (nebo v `identifier` na FHIR zdrojích) a vyhledejte jej před zápisem hodnot, které se mohou vrátit jinou cestou.

## Krok 6: Kontrola proti profilu

Pro laboratorní výsledky se před jejich použitím zeptejte platformy, jak se daný zdroj shoduje s profilem pro laboratorní zprávy HL7 Europe:

```bash
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": "%"}
}'
```

Tento nenormalizovaný výsledek získá přesný seznam:

```json
{"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"]}]}
```

Každý problém odpovídá jednomu z výše uvedených kroků. Spusťte `$validate` ve vašich integračních testech s reálnými vzorky z každého zdroje.

## Krok 7: uchování zdroje

Normalizace mění způsob, jakým je hodnota zapsána, nikoli odkud pochází. Při každém zápisu odešlete `author_type` (`device`, `import`, `practitioner`, `patient`) a `X-Anpheros-Source-System`. To umožňuje lékaři, auditorovi nebo modelu AI odlišit laboratorní výsledek od hodnoty zadané doma. Viz [Vysvětlení původu lékařských dat](https://developers.anpheros.com/cs/guides/medical-data-provenance).

## Kontrolní seznam

- [ ] Každý zdroj má mapování svých názvů na LOINC / ATC / ICD-10, uchovávané ve vaší integraci
- [ ] Nejednoznačné názvy zůstávají nemapované a jsou hlášeny, nikdy se nehádají
- [ ] Jednotky UCUM, odpovídající kódu; žádná tichá konverze
- [ ] Data ve formátu ISO 8601, s časovými zónami tam, kde na čase záleží
- [ ] Referenční rozsahy uchované s laboratorními hodnotami
- [ ] Původní znění zachováno (`code.text`)
- [ ] Idempotentní klíče nebo zdrojové ID při každém zápisu
- [ ] `author_type` a zdrojový systém při každém zápisu
- [ ] `$validate` v testech pro laboratorní výsledky

## Často kladené dotazy

### Co je normalizace lékařských dat?
Převod zdravotnických dat z různých zdrojů do jedné standardní formy: sdílené kódy (LOINC pro testy a měření, ICD-10 pro diagnózy, ATC pro léky), jednotky UCUM, data ISO, referenční rozsahy a zaznamenaný zdroj, aby bylo možné porovnávat, kombinovat a vyměňovat hodnoty z různých systémů.

### Mám převést všechny hodnoty na jednu jednotku?
Uchovávejte jednotku, ve které zdroj měřil, pokud je to platná jednotka UCUM odpovídající kódu, a konvertujte ji při zobrazování nebo analýze. Tím zůstává každá uložená hodnota dohledatelná ke svému původnímu hlášení.

### Může být normalizace plně automatická?
Většinou ano. Kódy ve zdroji, známé názvy a dobře formátované jednotky lze mapovat automaticky. Nejednoznačné názvy a neznámé lokální kódy vyžadují lidské rozhodnutí jednou pro každý zdroj, poté je mapování automatické.

## Související

- [Kódové systémy FHIR](https://developers.anpheros.com/cs/guides/fhir-code-systems)
- [Jak importovat laboratorní výsledky do záznamu FHIR](https://developers.anpheros.com/cs/guides/import-lab-results-fhir)
- [Vysvětlení původu lékařských dat](https://developers.anpheros.com/cs/guides/medical-data-provenance)
- [Interoperabilita zdravotnických dat](https://developers.anpheros.com/cs/guides/interoperability)
- [API pro lékařská data](https://developers.anpheros.com/cs/guides/medical-data-api)
