# Dati di pazienti sintetici per il testing

> Synthea, personas e dati generati da modelli a confronto, cosa contengono i buoni dati di test e cosa è successo quando abbiamo caricato pazienti Synthea su un server FHIR.

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

I **dati di pazienti sintetici sono cartelle cliniche inventate — pazienti, diagnosi, farmaci, risultati di laboratorio, visite — generate per assomigliare e comportarsi come quelle reali, in modo da poter creare, testare e dimostrare software sanitario senza toccare le informazioni sanitarie di nessuno.** È l'impostazione predefinita per lo sviluppo: i dati reali dei pazienti in un ambiente di test rappresentano un rischio per la privacy e solitamente un problema legale. Questa pagina copre i modi principali per ottenere dati sintetici, i punti di forza e di debolezza di ciascuno, come progettare test attorno ad essi e come caricarli su un server FHIR — incluso cosa è successo quando abbiamo caricato pazienti Synthea su Anpheros.

## Tre modi per ottenere pazienti sintetici

| Approccio | Esempio | Ideale per | Attenzione a |
|---|---|---|---|
| Simulazione basata su regole | [Synthea](https://github.com/synthetichealth/synthea) (open source, da MITRE): simula vite dalla nascita con moduli di malattia ed esporta bundle FHIR R4, C-CDA e CSV | Volume, cronologie complete, formati standard | Di default incentrato sugli USA (demografia, risorse di fatturazione, codici); i pattern sono realistici solo quanto i moduli |
| Personaggi curati | Pazienti progettati manualmente con condizioni specifiche | Demo, casi limite, test ripetibili | Pochi pazienti; qualcuno deve mantenerli coerenti |
| Generazione statistica o ML da dati reali | Modelli addestrati su un set di dati reale | Realismo della ricerca | Può rivelare persone reali se fatto male; richiede valutazione della privacy, non solo "è sintetico" |

Il testo scritto da un modello linguistico su richiesta è una quarta fonte, rischiosa: si legge bene ma spesso si contraddice (un farmaco senza la condizione che tratta, valori di laboratorio impossibili) e non dovrebbe essere la base dei test.

## Cosa contiene una buona suite di dati di test

Le medie realistiche non sono sufficienti. Il codice si rompe sui casi limite, quindi assicurati che i tuoi dati, sintetici o meno, includano:

- **Dati mancanti e parziali:** un risultato di laboratorio senza intervallo di riferimento, un farmaco senza dosaggio, un paziente senza data di nascita.
- **Unità e formati:** lo stesso test in mg/dL e mmol/L, virgole decimali, orari con e senza fuso orario.
- **Correzioni e cronologia:** un risultato modificato, una voce cancellata (`entered-in-error`), una condizione risolta.
- **Duplicati:** lo stesso report inviato due volte.
- **Cronologie lunghe e brevi:** un neonato, qualcuno con dieci anni di dati, qualcuno con una sola visita.
- **Diverse lingue e paesi** se servi più di un mercato.
- **Modifiche al consenso:** un'app il cui accesso viene revocato nel mezzo di una sessione.

## Caricamento di pazienti Synthea su un server FHIR

Synthea scrive un Bundle FHIR R4 `transaction` per paziente. Abbiamo generato due pazienti (`java -jar synthea-with-dependencies.jar -p 2 -s 4242 Massachusetts`) e li abbiamo caricati in un'istanza locale di Anpheros. Il bundle del primo paziente conteneva 221 voci:

| Mantenute (tipi archiviati da Anpheros) | Rimosse (tipi non archiviati da 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 |

Il loader chiede al server quali tipi supporta, mantiene solo quelli e invia il resto come una transazione:

```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);
```

Risultato: 182 risorse create in una transazione. I riferimenti `urn:uuid` tra le voci mantenute sono stati risolti in ID del server (un `result` di DiagnosticReport punta a un Observation esistente); i riferimenti alle 39 voci scartate rimangono come scritti, quindi prima del caricamento, raccogliere i `fullUrl` di ogni voce scartata e rimuovere o convertire i riferimenti mantenuti che puntano ad esse, e `Patient/{id}/$summary` ha prodotto un International Patient Summary con 15 problemi, 6 immunizzazioni, 15 risultati e 28 segni vitali. `$everything` ha restituito 363 voci, inclusa la provenance che la piattaforma aggiunge a ogni scrittura.

Tre cose da sapere prima di fare affidamento su di esso:

- **I riferimenti condizionali rimangono come scritti.** Synthea punta a praticanti, organizzazioni e luoghi con riferimenti condizionali come `Practitioner?identifier=http://hl7.org/fhir/sid/us-npi|9999967398`. Anpheros non risolve i riferimenti condizionali in una transazione; vengono archiviati come scritti, con il loro testo `display`, e non si risolvono in una risorsa. Se il tuo codice segue questi collegamenti, carica separatamente praticanti e organizzazioni e riscrivi i riferimenti.
- **I dati di fatturazione e fornitura sono persi.** Claims e explanations of benefit sono centrali nel modello di costo USA di Synthea e non fanno parte di un record clinico in Anpheros.
- **Le prescrizioni diventano assenti, non convertite.** `MedicationRequest` viene rimosso; se hai bisogno dei farmaci nel record, convertili in `MedicationStatement` prima del caricamento.

I nomi in Synthea includono numeri (`Marcelo725 Gulgowski816`) di proposito, in modo che nessuno li scambi per persone reali.

## Pazienti sintetici nella sandbox Anpheros

Ogni progetto sandbox Anpheros ottiene la propria copia di 30 pazienti sintetici, generati da persone progettate manualmente: età da 3 a 85 anni, diversi paesi e lingue dell'UE, condizioni codificate in ICD-10, farmaci in ATC, laboratori e parametri vitali in LOINC con unità UCUM e intervalli di riferimento, sei mesi di cronologia e documenti. Un progetto appena inizializzato contiene 30 pazienti, 43 condizioni, 51 dichiarazioni di farmaci, 1.811 osservazioni, 57 documenti e 6 allergie. I dati sono deterministici: ogni progetto vede le stesse persone con gli stessi valori, solo ID diversi, e un reset li ripristina. Ogni persona mantiene un identificatore stabile, quindi `Patient?identifier=https://anpheros.com/fhir/sid/sandbox-persona|p02` troverà sempre la stessa persona. Vedere [Database FHIR gratuito e sandbox](https://developers.anpheros.com/it/guides/free-fhir-database).

Utilizzare le persone quando si desiderano record piccoli e coerenti che coprano le lingue europee e le funzionalità della piattaforma; caricare Synthea quando si necessita di volume o di cronologie in stile USA.

## Domande frequenti

### Cos'è il dato paziente sintetico?
Record sanitari inventati che assomigliano a quelli reali per struttura e pattern, ma non descrivono alcuna persona reale. Permette agli sviluppatori di creare e testare senza utilizzare informazioni sanitarie protette.

### Il dato sintetico è anonimo per definizione?
I dati generati da regole, come quelli di Synthea, non contengono pazienti reali. I dati generati da modelli addestrati su record reali possono comunque rivelare persone reali e necessitano di una valutazione della privacy prima di essere condivisi.

### Posso importare dati Synthea in un server FHIR?
Sì. Synthea esporta bundle di transazioni FHIR R4. Rimuovere i tipi di risorsa che il server non supporta, verificare come gestisce i riferimenti condizionali e inviare ogni bundle come transazione.

### Il sandbox Anpheros include pazienti sintetici?
Sì: 30 per progetto, con sei mesi di cronologia codificata, più fino a 50 pazienti di test che crei tu stesso.

## Correlati

- [Database FHIR e sandbox gratuiti](https://developers.anpheros.com/it/guides/free-fhir-database)
- [Esempi JSON FHIR R4](https://developers.anpheros.com/tools/fhir-examples/)
- [Come normalizzare i dati medici](https://developers.anpheros.com/it/guides/normalize-medical-data)
- [Come archiviare cartelle cliniche utilizzando FHIR R4](https://developers.anpheros.com/it/guides/store-medical-records-fhir)
- [Piattaforma FHIR](https://developers.anpheros.com/it/guides/fhir)
