公司动态

如何用 Synthea 一条命令生成百万条合成患者数据

📅 2026/8/23 16:18:53
如何用 Synthea 一条命令生成百万条合成患者数据
如何用 Synthea 一条命令生成百万条合成患者数据【免费下载链接】syntheaSynthetic Patient Population Simulator项目地址: https://gitcode.com/gh_mirrors/sy/syntheaSynthea 是一个由 MITRE 开发的合成患者模拟器Synthetic Patient Population Simulator。它把每个虚拟患者从出生到死亡的完整生命周期跑一遍产出疾病、就诊、用药、检验等合成的医疗记录——数据足够逼真但和任何真实患者无关。如果你需要批量、合规、可复现的医疗测试数据它就是干这件事的工具。装好环境、构建并跑通第一次合成患者数据生成唯一硬性依赖是 Java。Synthea 需要JDK 17 或更高版本仓库 README 明确要求推荐用 LTS 版本。装好之后克隆、构建、生成三步git clone https://gitcode.com/gh_mirrors/sy/synthea cd synthea ./gradlew build check test ./run_synthea第一条命令拉代码第二条构建项目并跑完整测试套件想快速验证可以只跑./gradlew build第三条开始生成。不带参数时Synthea 会按默认人口规模开始逐个生成患者结果落在./output目录每个患者一个以 ID 命名的文件夹。跑通之后几个最常用的参数值得记下来./run_synthea -p 1000 # 只生成 1000 名患者 ./run_synthea -s 12345 # 指定随机种子结果可复现 ./run_synthea -g M -a 60-65 # 限定性别女性和 60–65 岁年龄段 ./run_synthea -h # 查看全部参数还支持按地理区域圈定人群人口统计默认使用马萨诸塞州普查数据例如./run_synthea Massachusetts或./run_synthea Alaska Juneau。产出的是 FHIR 数据改一行配置就能切换 CSV 或批量导出默认情况下./output里每个患者目录装的是HL7 FHIR R4格式的 JSON 资源Patient、Condition、MedicationRequest、Observation、Procedure 等覆盖疾病、过敏、药物、疫苗接种、生命体征、检验、护理计划这些记录类型。也就是说开箱即得的是可以直接喂给 FHIR 服务端或 EHR 系统的结构化数据。想换或追加输出格式改 src/main/resources/synthea.properties 里的开关即可三个最常碰到的配置项exporter.fhir.export true # 默认开启输出 FHIR exporter.csv.export false # 改为 true追加 CSV 输出 exporter.fhir.bulk_data false # 改为 true输出 ndjson 批量 FHIR每行一条资源CSV 适合快速用表格工具抽查ndjson 批量格式适合直接导入数据管道。此外 C-CDAexporter.ccda.export和 CPCDSexporter.cpcds.export也都是同样的布尔开关默认关闭。更省事的做法是不改文件直接在命令行覆盖任意配置项./run_synthea -p 10 --exporter.csv.exporttrue --exporter.baseDirectory./output_csv/这里顺带介绍了--exporter.baseDirectory它让你把每次实验的输出隔离到不同目录避免相互覆盖。另外两个 Gradle 任务排查问题时很顺手./gradlew graphviz会渲染规则和疾病模块的图形化视图./gradlew concepts和./gradlew attributes分别列出记录中使用到的临床概念和每个患者身上的属性变量。两个扩展入口JSON 规则模块和 Java 模块不用读全部源码先记住两条扩展路径。第一条JSON 通用规则模块。src/main/resources/modules/ 目录下放着 85 个以上的 JSON 文件每一个都是一条完整的疾病或诊疗流程比如asthma.json、congestive_heart_failure.json描述触发条件、状态流转、概率和产生的临床记录。写一个新疾病流程往往只需要按这套 JSON 规则格式新建一个文件放进目录不需要写 Java、不需要重新编译业务代码。第二条自定义 Java 模块。需要复杂逻辑时继承引擎里的Module类实现process(Person person, long time)方法即可。典型例子是 CardiovascularDiseaseModule.java它继承org.mitre.synthea.engine.Module在每个时间点上用 Framingham 或 ASCVD 公式为这位虚拟患者算一次年度心血管风险再据风险值决定后续是否发生房颤、卒中等事件。引擎本身——状态机State、转移Transition、逻辑表达式Logic、随机分布Distribution——都集中在 src/main/java/org/mitre/synthea/engine/扩展时基本不需要动这里只调用它的 API。输出侧同理src/main/java/org/mitre/synthea/export/ 下每个导出器对应一种格式FhirR4、CSVExporter、CCDAExporter、TextExporter各管一摊。要加新格式照着这些类实现Exporter接口就行。上手前先看这三条建议调试阶段永远带-s种子。随机生成意味着两次无种子的运行结果完全不同带上种子你才能稳定复现某份数据去排查问题。先小规模验证再生成大批量。用-p 10确认流程和格式符合预期再放大到几万、几十万。默认generate.thread_pool_size -1表示自动使用全部处理器并行大规模生成无需额外调参。给每次运行指定独立的输出目录。用--exporter.baseDirectory...区分不同参数组合的实验结果否则./output会被后来的运行混在一起很难追溯哪份数据来自哪次配置。常见疑问生成的数据包含真实患者信息吗不包含全部是合成的。逼真指统计分布贴近真实人群而非来自任何真人。想加一个自定义疾病从哪下手优先在src/main/resources/modules/下按现有 JSON 模块的格式新建规则文件涉及复杂计算或需要访问患者属性做判断的再写继承Module的 Java 类。能生成多少患者-p参数就是目标数量本身没有硬上限规模受限于你的内存和可用时间。【免费下载链接】syntheaSynthetic Patient Population Simulator项目地址: https://gitcode.com/gh_mirrors/sy/synthea创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考