# Dados sintéticos de pacientes para testes

> Synthea, personas e dados gerados por modelos comparados, o que bons dados de teste contêm e o que aconteceu quando carregámos pacientes Synthea num servidor FHIR.

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

**Dados sintéticos de pacientes são registos médicos inventados — pacientes, diagnósticos, medicamentos, resultados de laboratório, consultas — gerados para parecerem e comportarem-se como os reais, para que possa criar, testar e demonstrar software de saúde sem tocar em qualquer informação de saúde de alguém.** É o padrão para desenvolvimento: dados reais de pacientes num ambiente de teste representam um risco de privacidade e geralmente um problema legal. Esta página aborda as principais formas de obter dados sintéticos, os pontos fortes e fracos de cada um, como projetar testes em torno deles e como carregá-los num servidor FHIR — incluindo o que aconteceu quando carregámos pacientes Synthea no Anpheros.

## Três formas de obter pacientes sintéticos

| Abordagem | Exemplo | Ideal para | Atenção |
|---|---|---|---|
| Simulação baseada em regras | [Synthea](https://github.com/synthetichealth/synthea) (open source, da MITRE): simula vidas desde o nascimento com módulos de doenças e exporta bundles FHIR R4, C-CDA e CSV | Volume, históricos completos, formatos standard | Centrado nos EUA por defeito (demografia, recursos de faturação, códigos); os padrões são tão realistas quanto os módulos |
| Personas curadas | Pacientes desenhados manualmente com condições específicas | Demos, casos extremos, testes repetíveis | Poucos pacientes; alguém tem de os manter coerentes |
| Geração estatística ou ML a partir de dados reais | Modelos treinados num conjunto de dados real | Realismo da investigação | Pode vazar pessoas reais se feito incorretamente; necessita de avaliação de privacidade, não apenas "é sintético" |

Texto escrito por um modelo de linguagem a pedido é uma quarta fonte, arriscada: lê-se bem, mas muitas vezes contradiz-se (uma medicação sem a condição que trata, valores de laboratório impossíveis) e não deve ser a base de testes.

## O que os bons dados de teste contêm

Médias realistas não são suficientes. O código falha nas extremidades, por isso certifique-se de que os seus dados, sintéticos ou não, incluem:

- **Dados em falta e parciais:** um resultado de laboratório sem intervalo de referência, um medicamento sem dose, um paciente sem data de nascimento.
- **Unidades e formatos:** o mesmo teste em mg/dL e mmol/L, vírgulas decimais, horas com e sem fuso horário.
- **Correções e histórico:** um resultado alterado, uma entrada eliminada (`entered-in-error`), uma condição que foi resolvida.
- **Duplicados:** o mesmo relatório enviado duas vezes.
- **Históricos longos e curtos:** um recém-nascido, alguém com dez anos de dados, alguém com uma consulta.
- **Várias línguas e países** se servir mais do que um mercado.
- **Alterações de consentimento:** uma aplicação cujo acesso é revogado a meio de uma sessão.

## Carregar Pacientes Synthea num Servidor FHIR

O Synthea gera um Bundle FHIR R4 `transaction` por paciente. Gerámos dois pacientes (`java -jar synthea-with-dependencies.jar -p 2 -s 4242 Massachusetts`) e carregámo-los numa instância local do Anpheros. O bundle do primeiro paciente continha 221 entradas:

| Mantido (tipos que o Anpheros armazena) | Removido (tipos que o Anpheros não armazena) |
|---|---|
| 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 |

O carregador pergunta ao servidor quais os tipos que suporta, mantém apenas esses e envia os restantes como uma transação:

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

Resultado: 182 recursos criados numa transação. As referências `urn:uuid` entre as entradas mantidas foram resolvidas para IDs do servidor (um `result` de DiagnosticReport aponta para uma Observation existente); as referências às 39 entradas descartadas permanecem como escritas, pelo que, antes de carregar, recolha os `fullUrl` de cada entrada descartada e remova ou converta as referências mantidas que apontam para elas, e `Patient/{id}/$summary` produziu um International Patient Summary com 15 problemas, 6 imunizações, 15 resultados e 28 sinais vitais. `$everything` retornou 363 entradas, incluindo a proveniência que a plataforma adiciona a cada escrita.

Três coisas a saber antes de confiar nele:

- **Referências condicionais permanecem como escritas.** O Synthea aponta para praticantes, organizações e locais com referências condicionais como `Practitioner?identifier=http://hl7.org/fhir/sid/us-npi|9999967398`. O Anpheros não resolve referências condicionais numa transação; elas são armazenadas como escritas, com o seu texto `display`, e não são resolvidas para um recurso. Se o seu código seguir essas ligações, carregue praticantes e organizações separadamente e reescreva as referências.
- **Dados de faturação e fornecimento desapareceram.** Reclamações e explicações de benefício são centrais para o modelo de custos dos EUA do Synthea e não fazem parte de um registo clínico no Anpheros.
- **Prescrições tornam-se ausentes, não convertidas.** `MedicationRequest` é removido; se precisar dos medicamentos no registo, converta-os para `MedicationStatement` antes de carregar.

Os nomes no Synthea incluem números (`Marcelo725 Gulgowski816`) propositadamente, para que ninguém os confunda com pessoas reais.

## Pacientes sintéticos na sandbox Anpheros

Cada projeto sandbox Anpheros recebe a sua própria cópia de 30 pacientes sintéticos, gerados a partir de personas desenhadas manualmente: idades de 3 a 85 anos, vários países e línguas da UE, condições codificadas em ICD-10, medicamentos em ATC, laboratórios e sinais vitais em LOINC com unidades UCUM e intervalos de referência, seis meses de histórico e documentos. Um projeto recém-inicializado contém 30 pacientes, 43 condições, 51 declarações de medicação, 1.811 observações, 57 documentos e 6 alergias. Os dados são determinísticos — cada projeto vê as mesmas pessoas com os mesmos valores, apenas com IDs diferentes — e um reset restaura-os. Cada persona mantém um identificador estável, pelo que `Patient?identifier=https://anpheros.com/fhir/sid/sandbox-persona|p02` encontrará sempre a mesma pessoa. Ver [Base de dados FHIR gratuita e sandbox](https://developers.anpheros.com/pt/guides/free-fhir-database).

Utilize as personas quando pretender registos pequenos e coerentes que cubram línguas europeias e as funcionalidades da própria plataforma; carregue Synthea quando precisar de volume ou de históricos ao estilo dos EUA.

## Perguntas frequentes

### O que são dados sintéticos de pacientes?
Registos de saúde inventados que se assemelham a registos reais em estrutura e padrões, mas que não descrevem nenhuma pessoa real. Permite que os desenvolvedores criem e testem sem usar informações de saúde protegidas.

### Os dados sintéticos são anónimos por definição?
Dados gerados a partir de regras, como os do Synthea, não contêm pacientes reais. Dados gerados por modelos treinados em registos reais ainda podem revelar pessoas reais e necessitam de uma avaliação de privacidade antes de serem partilhados.

### Posso importar dados do Synthea para um servidor FHIR?
Sim. O Synthea exporta pacotes de transação FHIR R4. Remova os tipos de recursos que o servidor não suporta, verifique como ele lida com referências condicionais e publique cada pacote como uma transação.

### A sandbox Anpheros inclui pacientes sintéticos?
Sim: 30 por projeto, com seis meses de histórico codificado, mais até 50 pacientes de teste que você cria.

## Relacionado

- [Base de dados e sandbox FHIR gratuitos](https://developers.anpheros.com/pt/guides/free-fhir-database)
- [Exemplos JSON FHIR R4](https://developers.anpheros.com/tools/fhir-examples/)
- [Como normalizar dados médicos](https://developers.anpheros.com/pt/guides/normalize-medical-data)
- [Como armazenar registos médicos utilizando FHIR R4](https://developers.anpheros.com/pt/guides/store-medical-records-fhir)
- [Plataforma FHIR](https://developers.anpheros.com/pt/guides/fhir)
