# Синтетические данные пациентов для тестирования

> Synthea, персоны и сгенерированные моделью данные: сравнение, что содержит хорошие тестовые данные и что произошло, когда мы загрузили пациентов Synthea на FHIR-сервер.

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

**Синтетические данные пациентов — это вымышленные медицинские записи: пациенты, диагнозы, лекарства, результаты лабораторных исследований, визиты — сгенерированные так, чтобы они выглядели и вели себя как настоящие, чтобы вы могли создавать, тестировать и демонстрировать медицинское программное обеспечение, не затрагивая чью-либо медицинскую информацию.** Это стандартный подход для разработки: реальные данные пациентов в тестовой среде представляют риск конфиденциальности и обычно являются юридической проблемой. На этой странице рассматриваются основные способы получения синтетических данных, их преимущества и недостатки, как проектировать тесты на их основе и как загружать их на FHIR-сервер, включая то, что произошло, когда мы загрузили пациентов Synthea в Anpheros.

## Три способа получить синтетических пациентов

| Подход | Пример | Подходит для | Обратите внимание |
|---|---|---|---|
| Симуляция на основе правил | [Synthea](https://github.com/synthetichealth/synthea) (open source, от MITRE): симулирует жизнь с рождения с помощью модулей заболеваний и экспортирует пакеты FHIR R4, C-CDA и CSV | Большой объем, полные истории, стандартные форматы | По умолчанию ориентирован на США (демография, платежные ресурсы, коды); закономерности реалистичны только настолько, насколько реалистичны модули |
| Курируемые персоны | Пациенты, разработанные вручную с конкретными состояниями | Демонстрации, крайние случаи, повторяемые тесты | Небольшое количество пациентов; кто-то должен поддерживать их согласованность |
| Статистическая генерация или генерация с помощью МО на основе реальных данных | Модели, обученные на реальном наборе данных | Исследование реализма | Может привести к утечке данных реальных людей при плохом исполнении; требует оценки конфиденциальности, а не просто "это синтетика" |

Текст, написанный языковой моделью по запросу, является четвертым, рискованным источником: он хорошо читается, но часто противоречит сам себе (лекарство без заболевания, которое оно лечит, невозможные лабораторные значения) и не должен быть основой для тестов.

## Что должно содержаться в хороших тестовых данных

Реалистичных средних значений недостаточно. Код ломается на граничных случаях, поэтому убедитесь, что ваши данные, синтетические или нет, включают:

- **Отсутствующие и частичные данные:** лабораторный результат без диапазона референсных значений, лекарство без дозировки, пациент без даты рождения.
- **Единицы измерения и форматы:** один и тот же тест в мг/дл и ммоль/л, десятичные запятые, время с часовым поясом и без него.
- **Исправления и история:** исправленный результат, удаленная (`entered-in-error`) запись, разрешившееся состояние.
- **Дубликаты:** один и тот же отчет, отправленный дважды.
- **Длинная и короткая история:** новорожденный, человек с десятилетним стажем данных, человек с одним визитом.
- **Несколько языков и стран**, если вы работаете на нескольких рынках.
- **Изменения согласия:** приложение, доступ к которому был отозван в середине сеанса.

## Загрузка пациентов Synthea на FHIR-сервер

Synthea записывает один FHIR R4 `transaction` Bundle на пациента. Мы сгенерировали двух пациентов (`java -jar synthea-with-dependencies.jar -p 2 -s 4242 Massachusetts`) и загрузили их в локальный экземпляр Anpheros. Bundle первого пациента содержал 221 запись:

| Сохранено (типы, которые хранит Anpheros) | Удалено (типы, которые 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 |

Загрузчик запрашивает у сервера, какие типы он поддерживает, сохраняет только их и отправляет остальные одной транзакцией:

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

Результат: 182 ресурса создано в одной транзакции. `urn:uuid` ссылки между сохраненными записями были разрешены в серверные идентификаторы (`result` DiagnosticReport ссылается на существующий Observation); ссылки на 39 удаленных записей остаются как есть, поэтому перед загрузкой соберите `fullUrl` каждой удаленной записи и удалите или преобразуйте сохраненные ссылки, которые на них указывают, а `Patient/{id}/$summary` сгенерировал International Patient Summary с 15 проблемами, 6 прививками, 15 результатами и 28 жизненными показателями. `$everything` вернул 363 записи, включая provenance, который платформа добавляет к каждой записи.

Три вещи, которые нужно знать, прежде чем полагаться на это:

- **Условные ссылки остаются как есть.** Synthea ссылается на практикующих врачей, организации и места с помощью условных ссылок, таких как `Practitioner?identifier=http://hl7.org/fhir/sid/us-npi|9999967398`. Anpheros не разрешает условные ссылки в транзакции; они хранятся как есть, с их `display` текстом, и не разрешаются в ресурс. Если ваш код следует этим ссылкам, загрузите практикующих врачей и организации отдельно и перепишите ссылки.
- **Данные о выставлении счетов и поставках отсутствуют.** Счета и объяснения льгот являются центральными для американской модели затрат Synthea и не являются частью клинической записи в Anpheros.
- **Рецепты отсутствуют, а не конвертируются.** `MedicationRequest` удаляется; если вам нужны лекарства в записи, преобразуйте их в `MedicationStatement` перед загрузкой.

Имена в Synthea включают цифры (`Marcelo725 Gulgowski816`) намеренно, чтобы никто не принял их за реальных людей.

## Синтетические пациенты в песочнице Anpheros

Каждый проект песочницы Anpheros получает свою копию из 30 синтетических пациентов, сгенерированных на основе разработанных вручную персон: возраст от 3 до 85 лет, несколько стран и языков ЕС, состояния, закодированные в ICD-10, медикаменты в ATC, лабораторные исследования и жизненные показатели в LOINC с единицами UCUM и референсными диапазонами, шестимесячная история и документы. Свежезагруженный проект содержит 30 пациентов, 43 состояния, 51 назначение медикаментов, 1 811 наблюдений, 57 документов и 6 аллергий. Данные детерминированы — каждый проект видит одних и тех же людей с одинаковыми значениями, только с разными идентификаторами — и сброс восстанавливает их. Каждая персона сохраняет стабильный идентификатор, поэтому `Patient?identifier=https://anpheros.com/fhir/sid/sandbox-persona|p02` всегда находит одного и того же человека. См. [Бесплатная база данных FHIR и песочница](https://developers.anpheros.com/ru/guides/free-fhir-database).

Используйте персоны, когда вам нужны небольшие, связные записи, охватывающие европейские языки и собственные функции платформы; загрузите Synthea, когда вам нужен объем или истории в американском стиле.

## Часто задаваемые вопросы

### Что такое синтетические данные пациента?
Вымышленные медицинские записи, которые по структуре и закономерностям напоминают реальные, но не описывают реального человека. Это позволяет разработчикам создавать и тестировать приложения без использования защищенной медицинской информации.

### Являются ли синтетические данные анонимными по определению?
Данные, сгенерированные по правилам, как в Synthea, не содержат реальных пациентов. Данные, сгенерированные моделями, обученными на реальных записях, все еще могут раскрывать реальных людей и требуют оценки конфиденциальности перед распространением.

### Могу ли я импортировать данные Synthea на FHIR-сервер?
Да. Synthea экспортирует пакеты транзакций FHIR R4. Удалите типы ресурсов, которые сервер не поддерживает, проверьте, как он обрабатывает условные ссылки, и отправьте каждый пакет как транзакцию.

### Включает ли песочница Anpheros синтетических пациентов?
Да: 30 на проект с шестимесячной кодированной историей, плюс до 50 тестовых пациентов, которых вы создаете сами.

## Связанные материалы

- [Бесплатная база данных и песочница FHIR](https://developers.anpheros.com/ru/guides/free-fhir-database)
- [Примеры FHIR R4 JSON](https://developers.anpheros.com/tools/fhir-examples/)
- [Как нормализовать медицинские данные](https://developers.anpheros.com/ru/guides/normalize-medical-data)
- [Как хранить медицинские записи с использованием FHIR R4](https://developers.anpheros.com/ru/guides/store-medical-records-fhir)
- [Платформа FHIR](https://developers.anpheros.com/ru/guides/fhir)
