# Wie medizinische Daten normalisiert werden

> Tutorial: medizinische Daten aus vielen Quellen in eine vergleichbare Form bringen – LOINC-Lookup, UCUM-Einheiten, ISO-Daten, Referenzbereiche, keine Duplikate bei Wiederholung und Validierung gegen das European Lab Profile.

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

**Das Normalisieren medizinischer Daten bedeutet, Werte, die in vielen Formen ankommen, in eine vergleichbare Form zu bringen: denselben Code für denselben Test, dasselbe Einheitensystem, Daten in einem Format, jeder Wert mit seinem Referenzbereich und seiner Quelle und keine Duplikate.** Dieses Tutorial zeigt, wie das gemacht wird, bevor Daten in einen HL7 FHIR R4-Datensatz gelangen: LOINC- und ATC-Codes nachschlagen, UCUM-Einheiten verwenden, mehrdeutige Daten ablehnen, Bereiche beibehalten, Duplikate bei Wiederholung vermeiden und das Ergebnis gegen das European Laboratory Profile prüfen. Jede angezeigte Antwort stammt von der Anpheros API.

## Warum es wichtig ist

Dasselbe HbA1c-Ergebnis kann Sie als "HbA1c 6,4 %", "Hemoglobina glicozilata: 6.4", "Glycated haemoglobin 46 mmol/mol" oder nur als Laborkode, den ein einzelnes Labor versteht, erreichen. Bis diese zu einem Code mit einer Einheit werden:

- eine Grafik des HbA1c des Patienten über die Zeit zeigt drei nicht zusammenhängende Linien;
- eine Warnung bei "HbA1c über 6,5 %" übersieht zwei der Werte;
- ein KI-Modell sieht vier Fakten statt eines Trends;
- ein anderes System, das den Datensatz empfängt, kann ihn nicht interpretieren.

Die Normalisierung gehört an den Punkt, an dem die Daten in den Datensatz gelangen, einmalig, nicht in jeder Anwendung, die sie später liest.

## Was ein normalisierter Wert hat

| Teil | Normalisierte Form | Beispiel |
|---|---|---|
| Was gemessen wurde | ein Code aus einem Standard-System | LOINC `4548-4` (HbA1c), RxNorm `6809` (Metformin), ICD-10 `E11` (Typ-2-Diabetes) |
| Der Wert | eine Zahl oder Text, nur wenn das Ergebnis nicht numerisch ist | `6.4` |
| Die Einheit | UCUM | `%`, `mg/dL`, `mm[Hg]`, `kg` |
| Wann | ein ISO 8601 Datum-Zeit-Stempel, mit Zeitzone, wenn die Zeit relevant ist | `2026-10-01T07:30:00Z` |
| Normalbereich | niedrig und hoch, in derselben Einheit | `4.0`–`5.6` |
| Quelle | wer es produziert hat und aus welchem System | `import` von `labx` |
| Identität | etwas, das eine Wiederholung erkennbar macht | ein Idempotenzschlüssel oder eine Quellkennung |

Welches Codesystem zu welchem Ressourcentyp gehört, ist in [FHIR Code-Systemen](https://developers.anpheros.com/de/guides/fhir-code-systems) aufgeführt.

## Schritt 1: Code finden

Durchsuchen Sie die Terminologie der Plattform nach englischem oder rumänischem Namen oder nach Abkürzung:

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

Beides gibt dasselbe Konzept zurück:

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

Für Medikamente findet [Anpheros Search](https://developers.anpheros.com/de/guides/anpheros-search) die Substanz nach Namen oder Marke und liefert deren RxNorm-Inhaltsstoffcode und EMA-Produktnummern:

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

Das Feld `unit` ist die Einheit, die LOINC für diesen Test erwartet. Verwenden Sie es, um zu überprüfen, was Sie erhalten haben. Erstellen Sie die Zuordnung von den eigenen Namen jeder Quelle zu Codes einmal pro Quelle und behalten Sie sie in Ihrer Integration. Raten Sie nicht zur Schreibzeit: Wenn ein Name mehrdeutig ist und nichts in der Quelle dies klärt, lassen Sie ihn nicht zugeordnet und fragen Sie die Quelle. [Wie Laborergebnisse in einen FHIR-Datensatz importiert werden](https://developers.anpheros.com/de/guides/import-lab-results-fhir) zeigt, wie nicht zugeordnete Labormarker gespeichert und gemeldet werden.

## Schritt 2: Schreiben mit Codes, Einheiten und Bereichen

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

Wenn Sie nur den Code senden, füllt die Plattform den Standard-LOINC-Namen sowohl in der REST-API als auch in der FHIR-API (`/fhir/R4`) aus, sodass jede Anwendung dasselbe `display` liest. Ein `display`, das Sie selbst senden, wird beibehalten.

Behalten Sie auch die ursprüngliche Formulierung bei. Für einen Laborbericht enthält `code.text` auf der FHIR Observation den Namen des Labors ("Hemoglobina glicozilata (HbA1c)") neben der LOINC-Kodierung. Der Patient erkennt seinen Papierbericht immer noch wieder, und es geht nichts verloren, wenn die Zuordnung jemals in Frage gestellt wird.

## Schritt 3: Einheiten

Verwenden Sie UCUM-Codes: `mg/dL`, `mmol/L`, `%`, `mm[Hg]`, `kg`, `cm`, `/min`, `Cel`. Zwei Regeln verhindern die meisten Fehler:

- **Konvertieren Sie nicht stillschweigend.** Wenn ein Labor Glukose in `mmol/L` meldet und Ihre App `mg/dL` anzeigt, speichern Sie, was das Labor gemessen hat, und konvertieren Sie es bei der Anzeige. Der gespeicherte Wert bleibt nachvollziehbar zum Bericht.
- **Überprüfen Sie die Einheit anhand des Codes.** LOINC-Codes sind spezifisch: HbA1c in `%` ist `4548-4`, während HbA1c in `mmol/mol` einen anderen LOINC-Code hat. Ein Wert, dessen Einheit nicht mit der erwarteten Einheit des Codes übereinstimmt, ist ein Mapping-Fehler, kein Konvertierungsproblem.

Anpheros konvertiert Einheiten nicht für Sie; es speichert die von Ihnen gesendete Einheit.

## Schritt 4: Datumsangaben

Konvertieren Sie Datumsangaben vor dem Schreiben in ISO 8601 unter Verwendung des bekannten Formats der Quelle. `01.10.2026` ist der 1. Oktober in Rumänien und vielen europäischen Ländern, aber `10/01/2026` ist der 1. Oktober nur in den Vereinigten Staaten. Die API lehnt alles ab, was nicht ISO ist, anstatt zu raten:

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

Der Lab-Connector ist die Ausnahme: Er akzeptiert `DD.MM.YYYY` und `DD/MM/YYYY`, da er weiß, dass er einen europäischen Bericht liest.

Bei Messungen, bei denen die Tageszeit wichtig ist (Blutdruck, Glukose, Medikamentendosierungen), senden Sie die Uhrzeit mit ihrer Zeitzone. Eine Messung um 23:30 Uhr in Bukarest liegt am Vortag in UTC und der Patient erwartet sie am Tag, an dem er sie aufgenommen hat.

## Schritt 5: Keine Duplikate

Duplikate entstehen durch Wiederholungsversuche, durch das zweimalige Senden desselben Berichts und durch denselben Wert, der über zwei Wege eingeht.

- **Wiederholungsversuche:** Senden Sie einen `Idempotency-Key`, der den Wert in der Quelle identifiziert, z. B. die Berichts-ID und den Test. Das erneute Senden derselben Anfrage mit demselben Schlüssel gibt die erste Antwort zurück und speichert nichts Neues. Die SDKs fügen jedem Create eine hinzu.
- **Derselbe Bericht zweimal:** Der Lab-Connector erstellt eine stabile Kennung pro Zeile aus dem Bericht, dem Code, dem Datum und dem Wert und überspringt bereits importierte Zeilen.
- **Zwei Wege:** Speichern Sie die eigene ID des Quellsystems mit `X-Anpheros-Origin-Id` (oder in `identifier` bei FHIR-Ressourcen) und suchen Sie danach, bevor Sie Werte schreiben, die über einen anderen Weg zurückkommen können.

## Schritt 6: Profilprüfung

Fragen Sie für Laborergebnisse die Plattform, wie eine Ressource mit dem HL7 Europe Laborberichtsprofil übereinstimmt, bevor Sie sich darauf verlassen:

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

Dieses nicht normalisierte Ergebnis liefert eine präzise Liste:

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

Jedes Problem entspricht einem der obigen Schritte. Führen Sie `$validate` in Ihren Integrationstests mit realen Beispielen aus jeder Quelle aus.

## Schritt 7: Die Quelle beibehalten

Normalisierung ändert, wie ein Wert geschrieben wird, niemals, woher er stammt. Senden Sie `author_type` (`device`, `import`, `practitioner`, `patient`) und `X-Anpheros-Source-System` bei jedem Schreibvorgang. Nur so kann ein Arzt, ein Prüfer oder ein KI-Modell ein Laborergebnis von einem zu Hause eingegebenen Wert unterscheiden. Siehe [Erklärung der Herkunft medizinischer Daten](https://developers.anpheros.com/de/guides/medical-data-provenance).

## Checkliste

- [ ] Jede Quelle hat eine Zuordnung ihrer Namen zu LOINC / ATC / ICD-10, die in Ihrer Integration gespeichert ist
- [ ] Mehrdeutige Namen bleiben ohne Zuordnung und werden gemeldet, niemals erraten
- [ ] UCUM-Einheiten, passend zum Code; keine stille Konvertierung
- [ ] ISO 8601-Daten, mit Zeitzonen, wo die Uhrzeit wichtig ist
- [ ] Referenzbereiche werden mit Laborwerten beibehalten
- [ ] Originalformulierung beibehalten (`code.text`)
- [ ] Idempotenzschlüssel oder Quell-IDs bei jedem Schreibvorgang
- [ ] `author_type` und Quellsystem bei jedem Schreibvorgang
- [ ] `$validate` in Tests für Laborergebnisse

## Häufig gestellte Fragen

### Was ist medizinische Daten-Normalisierung?
Die Umwandlung von Gesundheitsdaten aus verschiedenen Quellen in eine einheitliche Standardform: gemeinsame Codes (LOINC für Tests und Messungen, ICD-10 für Diagnosen, ATC für Medikamente), UCUM-Einheiten, ISO-Daten, Referenzbereiche und eine aufgezeichnete Quelle, damit Werte aus verschiedenen Systemen verglichen, kombiniert und ausgetauscht werden können.

### Sollte ich alle Werte in eine Einheit umrechnen?
Speichern Sie die Einheit, in der die Quelle gemessen hat, solange es sich um eine gültige UCUM-Einheit handelt, die mit dem Code übereinstimmt, und konvertieren Sie sie bei der Anzeige oder Analyse. Dadurch bleibt jeder gespeicherte Wert nachvollziehbar zu seinem ursprünglichen Bericht.

### Kann die Normalisierung vollautomatisch erfolgen?
Größtenteils. Codes in der Quelle, bekannte Namen und gut formatierte Einheiten können automatisch zugeordnet werden. Mehrdeutige Namen und unbekannte lokale Codes erfordern eine einmalige menschliche Entscheidung pro Quelle, danach ist die Zuordnung automatisch.

## Verwandte Themen

- [FHIR-Codesysteme](https://developers.anpheros.com/de/guides/fhir-code-systems)
- [Importieren von Laborergebnissen in einen FHIR-Datensatz](https://developers.anpheros.com/de/guides/import-lab-results-fhir)
- [Erklärung der Herkunft medizinischer Daten](https://developers.anpheros.com/de/guides/medical-data-provenance)
- [Interoperabilität von Gesundheitsdaten](https://developers.anpheros.com/de/guides/interoperability)
- [API für medizinische Daten](https://developers.anpheros.com/de/guides/medical-data-api)
