# Syntetyczne dane pacjentów do testowania

> Synthea, persony i dane generowane przez modele – porównanie, co zawierają dobre dane testowe i co się stało, gdy załadowaliśmy pacjentów Synthea na serwer FHIR.

Source: https://developers.anpheros.com/pl/guides/synthetic-patient-data

**Syntetyczne dane pacjentów to wymyślone dokumentacje medyczne – pacjenci, diagnozy, leki, wyniki badań laboratoryjnych, wizyty – generowane tak, aby wyglądały i zachowywały się jak prawdziwe, dzięki czemu można tworzyć, testować i prezentować oprogramowanie medyczne bez dotykania informacji o zdrowiu kogokolwiek.** Jest to domyślne rozwiązanie dla środowisk deweloperskich: prawdziwe dane pacjentów w środowisku testowym stanowią ryzyko naruszenia prywatności i zazwyczaj są problemem prawnym. Ta strona omawia główne sposoby pozyskiwania danych syntetycznych, ich mocne i słabe strony, sposoby projektowania testów wokół nich oraz sposoby ładowania ich na serwer FHIR – w tym, co się stało, gdy załadowaliśmy pacjentów Synthea do Anpheros.

## Trzy sposoby na uzyskanie syntetycznych pacjentów

| Podejście | Przykład | Dobre dla | Na co uważać |
|---|---|---|---|
| Symulacja oparta na regułach | [Synthea](https://github.com/synthetichealth/synthea) (open source, od MITRE): symuluje życie od urodzenia za pomocą modułów chorobowych i eksportuje pakiety FHIR R4, C-CDA i CSV | Wolumen, pełne historie, standardowe formaty | Domyślnie skoncentrowany na USA (demografia, zasoby rozliczeniowe, kody); wzorce są tak realistyczne, jak moduły |
| Wyselekcjonowane persony | Pacjenci zaprojektowani ręcznie z określonymi schorzeniami | Dema, przypadki brzegowe, powtarzalne testy | Niewielka liczba pacjentów; ktoś musi zachować ich spójność |
| Generowanie statystyczne lub ML na podstawie rzeczywistych danych | Modele wytrenowane na rzeczywistym zbiorze danych | Realizm badań | Może ujawnić rzeczywiste osoby, jeśli zostanie wykonane źle; wymaga oceny prywatności, a nie tylko "jest syntetyczne" |

Tekst napisany przez model językowy na żądanie jest czwartym, ryzykownym źródłem: czyta się go dobrze, ale często jest wewnętrznie sprzeczny (lek bez schorzenia, które leczy, niemożliwe wartości laboratoryjne) i nie powinien stanowić podstawy testów.

## Co zawiera dobre dane testowe

Realistyczne średnie wartości nie wystarczą. Kod łamie się na skrajnościach, dlatego upewnij się, że Twoje dane, syntetyczne lub nie, zawierają:

- **Brakujące i niekompletne dane:** wynik badania laboratoryjnego bez zakresu referencyjnego, lek bez dawki, pacjent bez daty urodzenia.
- **Jednostki i formaty:** ten sam test w mg/dL i mmol/L, przecinki dziesiętne, czasy ze strefami czasowymi i bez nich.
- **Korekty i historia:** poprawiony wynik, usunięty (`entered-in-error`) wpis, stan, który został rozwiązany.
- **Duplikaty:** ten sam raport wysłany dwukrotnie.
- **Długa i krótka historia:** noworodek, osoba z dziesięcioletnią historią danych, osoba z jedną wizytą.
- **Kilka języków i krajów**, jeśli obsługujesz więcej niż jeden rynek.
- **Zmiany zgody:** aplikacja, której dostęp został cofnięty w środku sesji.

## Ładowanie pacjentów Synthea na serwer FHIR

Synthea zapisuje jeden pakiet FHIR R4 `transaction` na pacjenta. Wygenerowaliśmy dwóch pacjentów (`java -jar synthea-with-dependencies.jar -p 2 -s 4242 Massachusetts`) i załadowaliśmy ich do lokalnej instancji Anpheros. Pakiet pierwszego pacjenta zawierał 221 wpisów:

| Zachowane (typy przechowywane przez Anpheros) | Usunięte (typy nieprzechowywane przez Anpheros) |
|---|---|
| Observation 61, Procedure 48, DiagnosticReport 24, Condition 15, Encounter 12, DocumentReference 12, Immunization 6, Patient, CareTeam, CarePlan, Provenance | Claim 13, ExplanationOfBenefit 13, SupplyDelivery 9, Device 2, ImagingStudy 1, MedicationRequest 1 |

Program ładujący pyta serwer, jakie typy obsługuje, zachowuje tylko te, a resztę wysyła jako jedną transakcję:

```ts
import { readFile } from 'node:fs/promises';
import { Anpheros, apiKey } from '@anpheros/sdk';

const anpheros = new Anpheros({ auth: apiKey(process.env.ANPHEROS_KEY!) });   // sk_test_… key
const SUPPORTED = new Set(((await anpheros.fhir.metadata()) as any).rest[0].resource.map((r: any) => r.type));
const bundle = JSON.parse(await readFile(process.argv[2], 'utf8'));            // one Synthea patient file
const kept = bundle.entry.filter((e: any) => SUPPORTED.has(e.resource.resourceType));
const out: any = await anpheros.fhir.transaction({ ...bundle, entry: kept } as any);
console.log('created', out.entry.length);
```

Wynik: 182 zasoby utworzone w jednej transakcji. `urn:uuid` odniesienia między zachowanymi wpisami zostały rozwiązane do identyfikatorów serwera (`result` DiagnosticReport wskazuje na istniejącą Observation); odniesienia do 39 usuniętych wpisów pozostają niezmienione, więc przed załadowaniem należy zebrać `fullUrl` każdego usuniętego wpisu i usunąć lub przekonwertować zachowane odniesienia, które do nich wskazują, a `Patient/{id}/$summary` wygenerował Międzynarodowe Podsumowanie Pacjenta z 15 problemami, 6 szczepieniami, 15 wynikami i 28 danymi o parametrach życiowych. `$everything` zwrócił 363 wpisy, w tym provenance, którą platforma dodaje do każdego zapisu.

Trzy rzeczy, o których należy wiedzieć, zanim zaczniesz na nich polegać:

- **Odniesienia warunkowe pozostają niezmienione.** Synthea wskazuje na praktyków, organizacje i lokalizacje za pomocą odniesień warunkowych, takich jak `Practitioner?identifier=http://hl7.org/fhir/sid/us-npi|9999967398`. Anpheros nie rozwiązuje odniesień warunkowych w transakcji; są one przechowywane w niezmienionej postaci, z ich `display` tekstem i nie rozwiązują się do zasobu. Jeśli Twój kod podąża za tymi linkami, załaduj praktyków i organizacje osobno i przepisz odniesienia.
- **Dane dotyczące rozliczeń i dostaw zostały usunięte.** Roszczenia i wyjaśnienia świadczeń są kluczowe dla modelu kosztów Synthea w USA i nie są częścią dokumentacji klinicznej w Anpheros.
- **Recepty stają się nieobecne, nie są konwertowane.** `MedicationRequest` jest usuwane; jeśli potrzebujesz leków w dokumentacji, przekonwertuj je na `MedicationStatement` przed załadowaniem.

Nazwy w Synthea celowo zawierają liczby (`Marcelo725 Gulgowski816`), aby nikt nie pomylił ich z prawdziwymi ludźmi.

## Pacjenci syntetyczni w piaskownicy Anpheros

Każdy projekt piaskownicy Anpheros otrzymuje własną kopię 30 pacjentów syntetycznych, wygenerowanych na podstawie ręcznie zaprojektowanych person: w wieku od 3 do 85 lat, z kilku krajów i języków UE, schorzenia zakodowane w ICD-10, leki w ATC, badania laboratoryjne i parametry życiowe w LOINC z jednostkami UCUM i zakresami referencyjnymi, sześć miesięcy historii i dokumentów. Świeżo zainicjowany projekt zawiera 30 pacjentów, 43 schorzenia, 51 stwierdzeń dotyczących leków, 1 811 obserwacji, 57 dokumentów i 6 alergii. Dane są deterministyczne — każdy projekt widzi te same osoby z tymi samymi wartościami, jedynie z innymi identyfikatorami — a reset przywraca je. Każda persona zachowuje stabilny identyfikator, dzięki czemu `Patient?identifier=https://anpheros.com/fhir/sid/sandbox-persona|p02` zawsze odnajduje tę samą osobę. Zobacz [Darmowa baza danych FHIR i piaskownica](https://developers.anpheros.com/pl/guides/free-fhir-database).

Używaj person, gdy potrzebujesz małych, spójnych rekordów obejmujących języki europejskie i własne funkcje platformy; załaduj Synthea, gdy potrzebujesz dużej ilości danych lub historii w stylu amerykańskim.

## Najczęściej zadawane pytania

### Czym są syntetyczne dane pacjentów?
Wymyślone historie medyczne, które pod względem struktury i wzorców przypominają prawdziwe, ale nie opisują żadnej rzeczywistej osoby. Pozwala to programistom na tworzenie i testowanie bez używania chronionych informacji o stanie zdrowia.

### Czy dane syntetyczne są z definicji anonimowe?
Dane generowane na podstawie reguł, takie jak Synthea, nie zawierają danych prawdziwych pacjentów. Dane generowane przez modele wytrenowane na rzeczywistych rekordach mogą nadal ujawniać informacje o prawdziwych osobach i wymagają oceny prywatności przed udostępnieniem.

### Czy mogę zaimportować dane Synthea na serwer FHIR?
Tak. Synthea eksportuje pakiety transakcyjne FHIR R4. Usuń typy zasobów, których serwer nie obsługuje, sprawdź, jak obsługuje odniesienia warunkowe i publikuj każdy pakiet jako transakcję.

### Czy piaskownica Anpheros zawiera syntetycznych pacjentów?
Tak: 30 na projekt, z sześciomiesięczną historią kodowania, plus do 50 pacjentów testowych, których tworzysz samodzielnie.

## Powiązane

- [Darmowa baza danych FHIR i piaskownica](https://developers.anpheros.com/pl/guides/free-fhir-database)
- [Przykłady FHIR R4 JSON](https://developers.anpheros.com/tools/fhir-examples/)
- [Jak normalizować dane medyczne](https://developers.anpheros.com/pl/guides/normalize-medical-data)
- [Jak przechowywać dokumentację medyczną przy użyciu FHIR R4](https://developers.anpheros.com/pl/guides/store-medical-records-fhir)
- [Platforma FHIR](https://developers.anpheros.com/pl/guides/fhir)
