Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card
Cum se normalizează datele medicale
Tutorial: transformați datele medicale din multiple surse într-o formă comparabilă — căutare LOINC, unități UCUM, date ISO, intervale de referință, fără duplicate la reîncercare și validare conform profilului european de laborator.
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.
Pasul 1: Găsiți codul
Căutați în terminologia platformei după numele în engleză sau română, sau după abreviere:
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:
{"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 găsește substanța după nume sau marcă și oferă codul ingredientului RxNorm și numerele de produs EMA:
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 arată cum sunt păstrate și raportate marcajele de laborator nemapate.
Pasul 2: scrieți cu coduri, unități și intervale
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-…"}
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
%este4548-4, în timp ce HbA1c înmmol/molare 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ă:
{"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-Keycare 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 înidentifierpe 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:
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ă:
{"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.
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
- Cum se importă rezultatele de laborator într-un fișier FHIR
- Proveniența datelor medicale explicată
- Interoperabilitatea datelor din domeniul sănătății
- API pentru date medicale
Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card