# Cum să normalizați datele medicale

> Tutorial: transformați datele medicale din mai multe surse într-o singură formă comparabilă — căutare LOINC, unități UCUM, date ISO, intervale de referință, fără duplicate la reîncercare și validare împotriva profilului european de laborator.

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

**Normalizarea datelor medicale înseamnă transformarea valorilor care sosesc în multe forme într-o singură formă comparabilă: același cod pentru același test, același sistem de unități, date într-un singur format, fiecare valoare cu intervalul său de referință și sursa sa, și fără duplicate.** Acest tutorial arată cum să faceți acest lucru înainte ca datele să ajungă la un înregistrare HL7 FHIR R4: căutarea codurilor LOINC și ATC, utilizarea unităților UCUM, refuzarea datelor ambigue, păstrarea intervalelor, evitarea duplicatelor la reîncercare și verificarea rezultatului împotriva profilului european de laborator. Fiecare răspuns afișat provine de la API-ul Anpheros.

## De ce contează

Același rezultat HbA1c vă poate ajunge ca "HbA1c 6,4 %", "Hemoglobina glicozilată: 6.4", "Hemoglobină glicozilată 46 mmol/mol" sau doar un cod de laborator pe care un singur laborator îl înțelege. Până când acestea devin un singur cod cu o singură unitate:

- un grafic al HbA1c al pacientului în timp arată trei linii fără legătură;
- o alertă pentru "HbA1c peste 6,5 %" omite două dintre valori;
- un model AI vede patru fapte în loc de o tendință;
- un alt sistem care primește înregistrarea nu o poate interpreta.

Normalizarea aparține punctului în care datele intră în înregistrare, o singură dată, nu în fiecare aplicație care o citește ulterior.

## Ce are o valoare normalizată

| Parte | Formă normalizată | Exemplu |
|---|---|---|
| Ce a fost măsurat | un cod dintr-un sistem standard | LOINC `4548-4` (HbA1c), RxNorm `6809` (metformin), ICD-10 `E11` (diabet de tip 2) |
| Valoarea | un număr, sau text doar atunci când rezultatul nu este numeric | `6.4` |
| Unitatea | UCUM | `%`, `mg/dL`, `mm[Hg]`, `kg` |
| Când | o dată-oră ISO 8601, cu fus orar atunci când ora contează | `2026-10-01T07:30:00Z` |
| Interval normal | minim și maxim, în aceeași unitate | `4.0`–`5.6` |
| Sursă | cine a produs-o și din ce sistem | `import` din `labx` |
| Identitate | ceva ce face o repetare recunoscută | o cheie de idempotenta sau un identificator sursă |

Ce sistem de coduri se potrivește cu ce tip de resursă este listat în [Sisteme de coduri FHIR](https://developers.anpheros.com/ro/guides/fhir-code-systems).

## Pasul 1: Găsiți codul

Căutați în terminologia platformei după numele în engleză sau română, sau după abreviere:

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

Ambele returnează același concept:

```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}
```

Pentru medicamente, [Anpheros Search](https://developers.anpheros.com/ro/guides/anpheros-search) găsește substanța după nume sau marcă și oferă codul ingredientului RxNorm și numerele de produs EMA:

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

Câmpul `unit` este unitatea pe care LOINC o așteaptă pentru acel test. Folosiți-l pentru a verifica ce ați primit. Construiți maparea de la propriile nume ale fiecărei surse la coduri o singură dată, per sursă, și păstrați-o în integrarea dumneavoastră. Nu ghiciți la momentul scrierii: atunci când un nume este ambiguu și nimic din sursă nu îl clarifică, lăsați-l nemapat și întrebați sursa. [Cum să importați rezultatele de laborator într-un înregistrare FHIR](https://developers.anpheros.com/ro/guides/import-lab-results-fhir) arată cum sunt păstrate și raportate marcajele de laborator nemapate.

## Pasul 2: scrieți cu coduri, unități și intervale

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

Când trimiteți doar codul, platforma completează numele standard LOINC, atât pe REST API, cât și pe FHIR API (`/fhir/R4`), astfel încât fiecare aplicație citește același `display`. Un `display` pe care îl trimiteți dumneavoastră este păstrat așa cum este.

Păstrați și formularea originală. Pentru un raport de laborator, `code.text` pe FHIR Observation deține numele laboratorului ("Hemoglobina glicozilata (HbA1c)") alături de codificarea LOINC. Pacientul își recunoaște în continuare raportul pe hârtie și nimic nu se pierde dacă maparea este vreodată pusă la îndoială.

## Pasul 3: unități

Utilizați coduri UCUM: `mg/dL`, `mmol/L`, `%`, `mm[Hg]`, `kg`, `cm`, `/min`, `Cel`. Două reguli previn majoritatea erorilor:

- **Nu convertiți silențios.** Dacă un laborator raportează glucoza în `mmol/L` și aplicația dvs. afișează `mg/dL`, stocați ceea ce a măsurat laboratorul și convertiți la afișare. Valoarea stocată rămâne trasabilă la raport.
- **Verificați unitatea în raport cu codul.** Codurile LOINC sunt specifice: HbA1c în `%` este `4548-4`, în timp ce HbA1c în `mmol/mol` are un cod LOINC diferit. O valoare a cărei unitate nu corespunde unității așteptate a codului este o eroare de mapare, nu o problemă de conversie.

Anpheros nu convertește unitățile pentru dvs.; stochează unitatea pe care o trimiteți.

## Pasul 4: date

Convertiți datele în ISO 8601 înainte de a le scrie, utilizând formatul cunoscut al sursei. `01.10.2026` este 1 octombrie în România și în multe țări europene, dar `10/01/2026` este 1 octombrie doar în Statele Unite. API-ul refuză orice altceva decât ISO, în loc să ghicească:

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

Conectorul de laborator este excepția: acceptă `DD.MM.YYYY` și `DD/MM/YYYY` deoarece știe că citește un raport european.

Pentru măsurătorile unde ora din zi contează (tensiune arterială, glucoză, doze de medicamente), trimiteți ora cu fusul orar aferent. O citire la ora 23:30 în București este în ziua precedentă în UTC, iar pacientul se așteaptă să fie înregistrată în ziua în care a fost efectuată.

## Pasul 5: Fără duplicate

Duplicatele provin din reîncercări, din același raport trimis de două ori și din aceeași valoare care ajunge prin două rute.

- **Reîncercări:** trimiteți un `Idempotency-Key` care identifică valoarea în sursă, de exemplu ID-ul raportului și testul. Trimiterea aceleiași cereri din nou cu aceeași cheie returnează primul răspuns și nu stochează nimic nou. SDK-urile adaugă unu la fiecare creare.
- **Același raport de două ori:** conectorul de laborator construiește un identificator stabil per rând din raport, cod, dată și valoare și omite rândurile deja importate.
- **Două rute:** stocați ID-ul propriu al sistemului sursă cu `X-Anpheros-Origin-Id` (sau în `identifier` pe resursele FHIR) și căutați-l înainte de a scrie valori care pot reveni printr-o altă cale.

## Pasul 6: Verificarea conformității cu un profil

Pentru rezultatele de laborator, întrebați platforma cum se compară o resursă cu profilul HL7 Europe pentru raportul de laborator înainte de a vă baza pe ea:

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

Acest rezultat nenormalizat primește o listă precisă:

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

Fiecare problemă corespunde unuia dintre pașii de mai sus. Rulați `$validate` în testele de integrare, cu mostre reale din fiecare sursă.

## Pasul 7: Păstrați sursa

Normalizarea modifică modul în care este scrisă o valoare, niciodată de unde provine. Trimiteți `author_type` (`device`, `import`, `practitioner`, `patient`) și `X-Anpheros-Source-System` cu fiecare scriere. Acesta este lucrul care permite unui medic, unui auditor sau unui model AI să distingă un rezultat de laborator de o valoare introdusă acasă. Vezi [Explicația provenienței datelor medicale](https://developers.anpheros.com/ro/guides/medical-data-provenance).

## Checklist

- [ ] Fiecare sursă are o mapare de la numele sale la LOINC / ATC / ICD-10, păstrată în integrarea dumneavoastră
- [ ] Numele ambigue rămân nemapate și sunt raportate, niciodată ghicite
- [ ] Unități UCUM, corespunzătoare codului; fără conversie silențioasă
- [ ] Date ISO 8601, cu fusuri orare acolo unde ora contează
- [ ] Intervalele de referință păstrate cu valorile de laborator
- [ ] Formularea originală păstrată (`code.text`)
- [ ] Chei de idempotență sau ID-uri sursă la fiecare scriere
- [ ] `author_type` și sistemul sursă la fiecare scriere
- [ ] `$validate` în teste pentru rezultate de laborator

## Întrebări frecvente

### Ce este normalizarea datelor medicale?
Conversia datelor de sănătate din diferite surse într-o singură formă standard: coduri comune (LOINC pentru teste și măsurători, ICD-10 pentru diagnostice, ATC pentru medicamente), unități UCUM, date ISO, intervale de referință și o sursă înregistrată, astfel încât valorile din diferite sisteme să poată fi comparate, combinate și schimbate.

### Ar trebui să convertesc toate valorile într-o singură unitate?
Stocați unitatea în care a măsurat sursa, atâta timp cât este o unitate UCUM validă care se potrivește codului, și convertiți la afișare sau analiză. Acest lucru menține fiecare valoare stocată trasabilă la raportul său original.

### Poate fi normalizarea complet automată?
În mare parte. Codurile din sursă, numele cunoscute și unitățile bine formatate pot fi mapate automat. Numele ambigue și codurile locale necunoscute necesită o decizie umană o dată pe sursă, după care maparea este automată.

## Conexe

- [Sisteme de coduri FHIR](https://developers.anpheros.com/ro/guides/fhir-code-systems)
- [Cum se importă rezultatele de laborator într-un fișier FHIR](https://developers.anpheros.com/ro/guides/import-lab-results-fhir)
- [Proveniența datelor medicale explicată](https://developers.anpheros.com/ro/guides/medical-data-provenance)
- [Interoperabilitatea datelor din domeniul sănătății](https://developers.anpheros.com/ro/guides/interoperability)
- [API pentru date medicale](https://developers.anpheros.com/ro/guides/medical-data-api)
