CMS DE-SynPUF — 合成医保理赔 AI-Ready Wikipedia

约 233 万合成受益人、1.12 亿条理赔的美国 Medicare 全理赔链合成公开数据

来源 美国医疗保险和医疗补助服务中心(Centers for Medicare & Medicaid Services, CMS) url: https://www.cms.gov/Research-Statistics-Data-and-Systems/Downloadable-Public-Use-Files/SynPUFs/DE_Syn_PUF.html发布时间: 2026-09-16最后更新: 2026-09-25 阅读 40
CMS DE-SynPUF — 合成医保理赔 AI-Ready Wikipedia

信息速览

数据集名称CMS DE-SynPUF — 合成医保理赔 AI-Ready Wikipedia
数据类型约 233 万合成受益人,约 1.12 亿条理赔记录,5 类文件 × 20 样本,CSV/ZIP 格式,公有领域免费下载
规模约 233 万名合成受益人(不含任何真实患者)
接入方式美国医疗保险和医疗补助服务中心(Centers for Medicare & Medicaid Services, CMS) url: https://www.cms.gov/Research-Statistics-Data-and-Systems/Downloadable-Public-Use-Files/SynPUFs/DE_Syn_PUF.html
AI 就绪度

数据集封面

CMS DE-SynPUF — 大规模合成医保理赔公开数据 AI-Ready Wikipedia

INFOBOX

字段 内容
数据集名称 CMS DE-SynPUF(CMS 合成医保理赔公开数据文件)
英文全称 CMS Linkable 2008-2010 Medicare Data Entrepreneurs’ Synthetic Public Use File (DE-SynPUF)
别名/简称 DE-SynPUF;Medicare SynPUF;Medicare Claims Synthetic Public Use File
疾病分类(ICD-11) 多病种覆盖:2 型糖尿病(5A11)、心力衰竭(BC16)、慢性肾病(GB61)、慢阻肺(CA22)、缺血性心脏病(BA41)等 11 项慢病标志
SNOMED CT 73211009(糖尿病)、84114007(心力衰竭)、433144002(慢性肾病)、13645005(慢阻肺)、26929004(阿尔茨海默病)等
数据模态 合成医保理赔:受益人摘要 + 住院理赔 + 门诊理赔 + 医生/供应商理赔 + 处方药事件
AI 任务类型 费用预测、医疗服务利用预测、慢病表型提取、异常检测、理赔数据管线开发、OMOP 转换与教学
样本总数 约 233 万名合成受益人;约 1.12 亿条理赔;约 1.11 亿条处方事件(2008-2010)
数据大小 20 个样本 × 8 个 ZIP/CSV 文件(官方未公布单一总大小,单样本可在个人电脑处理)
数据格式 CSV(ZIP 打包)+ 官方 SAS 读入程序;另有 OMOP CDM 版本(AWS Open Data)
许可证 Public Domain(CMS Public Use Data 条款)
访问级别 开放(免注册、免申请,直接下载)
DUO 标签 NRES(官方无 DUO 标注;公有领域,无使用限制)
语言 英语(文档与变量名)
首发日期 2011(2008 单年样本,据第三方目录记录);2013-02-11(Linkable 2008-2010 完整版公开发布)
最后更新 2013-02-11(DE1.0 后未再更新)
发布机构 Centers for Medicare & Medicaid Services(CMS,美国医疗保险和医疗补助服务中心)
官方主页 CMS SynPUFs 官方页
下载地址 DE1.0 Sample 1 下载页
DOI 无官方 DOI(官方引用方式为 DE1.0 用户手册,2013-01-15)
AI 就绪度评分 ⭐⭐⭐⭐(4/5)— 有官方 20 样本划分、完整 Codebook 与 SAS 读入程序;扣分项:无官方 Python 预处理脚本、Carrier 文件拆分为两份需手动合并、无特征工程管线
页面状态 published

§0 E-E-A-T 信任声明与免责声明

医学审核者:千方病案医学编辑部交叉审核:§2 医学背景(Medicare 体系与理赔数据结构、11 项慢病标志的 ICD-11/SNOMED CT 映射、临床任务定义)、§7 偏倚分析。

数据工程审核者:千方病案医学编辑部交叉审核:§4 DAIMS 数据字典(五类文件与 DESYNPUF_ID 链接体系)、§5 数据划分策略、§6 预处理 Pipeline 和坑点。

审核日期:2026-09-05

审核方式:交叉审核

利益冲突声明:千方病案医数集与 CMS、NORC、IMPAQ International 无任何商业利益关联。本页面不销售 DE-SynPUF 数据集本身,仅提供 AI 就绪指南与学术信息服务。编辑者未接受 CMS、NORC 或 IMPAQ 的任何形式资助。

医疗免责声明:本页面提供的医学信息仅供研究和教育目的,不构成医疗建议、诊断或治疗方案。数据集的医学描述基于公开发表的文献,未经逐一临床验证。任何基于该数据集训练的 AI 模型在应用于临床决策前,必须经过独立的临床验证和监管审批。

技术免责声明:本页面的代码示例、预处理建议和基准性能数据基于公开资料整理,不保证在特定环境下的准确性和适用性。使用者应自行验证代码安全性和数据预处理流程的正确性。千方病案医数集不对因使用本页面信息而导致的任何直接或间接损失承担责任。

数据使用合规:使用本页面描述的数据集前,请务必阅读并遵守数据集原始许可协议。DE-SynPUF 为公有领域公开数据,无需注册、申请或签署数据使用协议,但仍受 CMS Public Use Data 免责声明条款约束。DUO 标签仅供参考,具体使用限制以数据集官方协议为准。


§1 数据集概览

§1.0 30 秒速览

这是什么? DE-SynPUF 是美国医保官方机构 CMS 公开发布的一套"假数据真结构"的 Medicare 理赔数据集。它以 2008 年约 240 万名真实受益人的 5% 抽样为底本,经过种子-捐赠者替换、日期扰动、数值粗化等多重披露限制处理,合成为约 233 万名"合成受益人"及其 2008-2010 三年间约 1.12 亿条住院/门诊/医生理赔与约 1.11 亿条处方药事件。每一条记录都不对应任何真实患者,但文件结构、变量命名与真实 Medicare 理赔数据(Limited Data Sets)高度一致。

为什么重要? 真实的 Medicare 理赔数据申请门槛高、周期长、协议严格。DE-SynPUF 让任何人——学生、工程师、创业者——当天就能下载并上手一套"长相"与真实理赔数据几乎一样的数据:跑通 SQL/Python 管线、练习 OMOP CDM 转换、开发医疗保险类应用界面、验证数据工程质量。它是全球使用最广的医保理赔合成数据之一,也是 OHDSI 社区 OMOP 转换教程的标准练习集。

我能用它做什么? 典型用途包括:开发并调试面向真实 CMS 数据的分析程序、训练学生读懂理赔表结构(诊断码、操作码、支付金额字段)、构建 AI 原型(费用预测、服务利用预测、慢病表型提取)后在真实数据上迁移、以及做隐私安全的系统演示。注意:由于合成过程改变了变量间协变关系,官方明确声明它不可用于对真实 Medicare 人群的统计推断或流行病学估计。

§1.1 技术摘要

DE-SynPUF(DE1.0 版)由 CMS 委托 NORC 与 IMPAQ International 制作,2013-02-11 公开发布 Linkable 2008-2010 完整版[1]。源数据为 2008 年 Medicare 受益人 5% 抽样(约 240 万人),与 CMS 现有 5% 研究样本及 BSA PUF 完全不相交[2]。合成流程以真实受益人为"种子",通过热卡法(hot-decking)匹配相似"捐赠者"替换其特征与理赔,每个合成受益人的理赔集至少由 3 个不同捐赠者贡献,并叠加变量削减(受益人 240→32 个变量;住院理赔 611→81 个)、k-匿名抑制、日期扰动与连续值粗化[2]。全量数据分为 5 类文件(Beneficiary Summary、Inpatient、Outpatient、Carrier、PDE),按 20 个独立样本分发(各约 0.25% 样本),每样本含 8 个 CSV 文件,以 16 位加密标识 DESYNPUF_ID 作为跨文件链接键[1][3]。全部文件为 CSV/ZIP 格式免注册下载,公有领域许可。

§1.2 战略价值

维度一:理赔数据教育的"零门槛标准件"。 真实 CMS 数据(如 Limited Data Sets、Medicare Claims Synthetic PUF 新版)需要研究计划书、机构审查甚至付费。DE-SynPUF 是极少数免注册、免协议、公有领域的全理赔链数据,覆盖从受益人人口学、Part A/B 费用分担到 Part D 处方事件的完整结构。全球多所高校将其作为健康服务研究与医保数据建模的教学数据集,R 社区还衍生出 claimsdb 等教学包(内置 500 名受益人的 DuckDB 子集)[6]。

维度二:数据工程与 OMOP 生态的"实弹演习场"。 DE-SynPUF 的文件结构与 CMS Limited Data Sets 一致,官方明确声明"在 DE-SynPUF 上写好的程序与流程可直接运行于 CMS Limited Data Sets"[1]。OHDSI 社区发布了官方 ETL 规范与 AWS Open Data 上的 OMOP CDM 版本(1k/100k/2.3m 三种规模)[5],社区开源的 Python ETL 项目(dec-etl-project)可在约 2 小时内完成全量 CDMv5 转换[7]。这使得 DE-SynPUF 成为验证 OMOP 转换、术语映射(ICD-9、HCPCS、NDC→RxNorm)与大数据管线的最佳合成靶场。

维度三:AI 原型的"预演数据"。 对于费用预测、再住院预测、处方续药风险等机器学习任务,DE-SynPUF 提供了规模足够大(亿级事件)、结构足够真实的长时序理赔样本。学术综述将其列为医疗合成数据的代表性数据集,定位是"让模型先学会理赔数据的语法,再迁移到真实数据"[4]。2026 年利兹大学 Data & AI Hackathon 即以 DE-SynPUF 的 PDE 文件作为处方续药风险预测与序贯推荐的赛道数据[8]。

§1.3 同类数据集横向对比

数据集 机构 模态 规模 标注/标签 与 DE-SynPUF 的差异化
DE-SynPUF CMS 合成理赔(受益人+住院+门诊+医生+处方) 约 233 万合成受益人,约 1.12 亿条理赔,2008-2010 11 项慢病标志、费用分担字段 全理赔链结构对齐 CMS Limited Data Sets,公有领域免注册
Synthea/SyntheticMass MITRE 合成 EHR(FHIR) 约 100 万虚拟患者 完整临床过程仿真 病程级生成模型数据,非理赔结构;可定制再生成
MIMIC-III MIT LCP/PhysioNet 真实 ICU EHR 约 4.9 万真实患者 真实临床标注 真实数据但需培训认证与协议;无理赔账单视角
Blue Button 2.0 Sandbox CMS 合成 FHIR 理赔 约 3 万合成受益人 同 FHIR 资源模型 面向 API 应用测试的沙箱,规模小但 FHIR 化
Medicare Claims SynPUF(新版) CMS/ResDAC 合成理赔 较小样本,逐年更新 更新版变量体系 新版官方合成数据,需通过 ResDAC 获取,变量更现代但规模远小于 DE-SynPUF

§1.4 版本时间轴

时间 版本/事件 说明
2011 初次发布(2008 单年样本) 据第三方开放数据目录 openbigdata.org 记录的首发日期[9]
2013-01-15 DE1.0 用户手册定稿 CMS Linkable 2008-2010 DE-SynPUF User Manual[2]
2013-02-11 Linkable 2008-2010 完整版公开发布 NORC 新闻稿宣布发布;20 个样本 × 8 文件全量上线[13]
后续 OMOP CDM 版本托管至 AWS Open Data 1k/100k/2.3m 三种规模,标注 Not updated[5]
至今(截至 2026-09) DE1.0 为最终版本 CMS 未发布后续增量;新版合成数据转向 ResDAC 分发

§1.5 典型应用场景

  1. 理赔分析教学与课程实验:用 20 个样本中的 1 个(约 11.6 万受益人)完成"读入-链接-汇总"全流程训练,R 教学包 claimsdb 已内置可运行子集[6]。
  2. 真实 CMS 数据申请前的程序预演:官方设计目标即在 DE-SynPUF 上开发的应用与程序可直接运行于 CMS Limited Data Sets[1]。
  3. OMOP CDM 转换与术语映射演练:练习 ICD-9 诊断码、HCPCS 操作码、NDC 药品码到 OMOP 词表的映射,社区已有完整 Python ETL 参考实现[7]。
  4. 医保费用预测 AI 原型:以受益人年度费用字段(MEDREIMB_IP/OP/CAR)为标签构建回归/分类模型,PLOS Digital Health 综述记录了用其子集测试住院费用分类算法的案例[4]。
  5. 处方行为序列建模:PDE 文件 8 字段天然适合"SRVC_DT + DAYS_SUPLY_NUM"推导续药间隔,用于晚续药风险与推荐系统原型[8]。

§2 医学背景:Medicare 理赔体系与慢病标志

§2.1 数据集覆盖病种的 ICD-11 编码表

DE-SynPUF 的 Beneficiary Summary 文件内置 11 项慢性病标志(SP_* 变量),其判定源自 CMS chronic condition warehouse(CCW)算法在理赔上的计算。这 11 项慢病即本数据集的"疾病覆盖面",对应 ICD-11 编码如下:

SP_* 慢病标志 中文病名 ICD-11 编码 ICD-11 中文名
SP_ALZHDMTA 阿尔茨海默病及相关障碍 8A80 阿尔茨海默病
SP_CHF 心力衰竭 BC16 心力衰竭
SP_CHRNKIDN 慢性肾病 GB61 慢性肾脏病 3 期
SP_CNCR 癌症(乳腺、结肠直肠、前列腺、肺) 2B70/2B91/2C82/2C25 乳腺/结直肠/前列腺/支气管肺恶性肿瘤
SP_COPD 慢性阻塞性肺疾病 CA22 慢性阻塞性肺疾病
SP_DEPRESSN 抑郁症 6A70 抑郁发作
SP_DIABETES 糖尿病 5A11 2 型糖尿病
SP_ISCHMCHT 缺血性心脏病 BA41 急性心肌梗死(谱系:BA41-BA5Z)
SP_OSTEOPRS 骨质疏松症 FB83 骨质疏松症(无病理性骨折)
SP_RA_OA 类风湿关节炎/骨关节炎 FA20/FA00 类风湿关节炎/骨关节炎
SP_STRKETIA 卒中/短暂性脑缺血发作 8B11 缺血性脑卒中

§2.1b SNOMED CT 映射表

标签/病名 ICD-11 SNOMED CT 码 SNOMED 术语
糖尿病 5A11 73211009 Diabetes mellitus
心力衰竭 BC16 84114007 Heart failure
慢性肾病 GB61 433144002 Chronic kidney disease
慢阻肺 CA22 13645005 Chronic obstructive pulmonary disease
阿尔茨海默病 8A80 26929004 Alzheimer’s disease
抑郁症 6A70 35489007 Depressive disorder
缺血性心脏病 BA41-BA5Z 414545008 Ischemic heart disease
骨质疏松症 FB83 64859006 Osteoporosis
类风湿关节炎 FA20 69896004 Rheumatoid arthritis
卒中/TIA 8B11 275526006 Transient ischemic attack / 230690007 Cerebral infarction

理赔文件内原始诊断码为 ICD-9-CM(2008-2010 年 Medicare 使用 ICD-9),操作码为 HCPCS/CPT;转换为 ICD-11 或 SNOMED CT 需借助 OMOP Athena 词表或 CMS GEM(General Equivalence Mappings)映射文件[7]。

§2.1c Medicare 体系速览

理解 DE-SynPUF 的五类文件,需要先理解 Medicare 的覆盖体系。本数据集覆盖其中 fee-for-service(按服务付费)路径下的 Part A、Part B 与 Part D,不含 Part C:

计划 覆盖内容 DE-SynPUF 对应数据 关键字段
Part A(住院保险) 住院、专业护理机构、部分居家护理 Inpatient Claims + 覆盖月数 BENE_HI_CVRAGE_TOT_MONS、PRVDR_NUM、CLM_PMT_AMT
Part B(医疗保险) 门诊、医生服务、医疗器械 Outpatient Claims + Carrier Claims BENE_SMI_CVRAGE_TOT_MONS、HCPCS_CD、LINE_NCH_PMT_AMT
Part C(Medicare Advantage) 由商业保险承办的综合计划 不包含(本数据集仅 FFS 理赔) 无
Part D(处方药计划) 门诊处方药 Prescription Drug Events PLAN_CVRG_MOS_NUM、PROD_SRVC_ID、TOT_RX_CST_AMT

费用字段组(MEDREIMB / BENRES / PPPYMT)对应 Medicare 支付、受益人自付与主支付方三方分担结构,这是理赔数据建模中理解"谁付了钱"的基础。Medicare 受益人可自由在 FFS 与 Part C 之间切换,因此 5% 抽样中仅有 FFS 活跃者会产生理赔记录——这也是 §7.1 覆盖偏倚的来源。

§2.2 慢病负担与理赔数据视角

DE-SynPUF 面向的是美国 Medicare fee-for-service(按服务付费)参保人群,以 65 岁以上老年人为主体,另含终末期肾病(ESRD)与残障参保者。该人群的典型特征是多病共存、高医疗利用与多药联用:11 项 CCW 慢病标志在老年人群中普遍共存,心力衰竭、慢阻肺、糖尿病与慢肾病常作为"费用驱动型"慢病组合出现。CMS 官方用户手册附录 A 将 DE-SynPUF 与真实 5% 样本在慢病分布上作了对比验证,确认二者在人群层面的分布接近(但逐条记录不可对应)[2]。

需要强调的是:理赔数据记录的是"已向 Medicare 报账的服务",而非完整临床真相。一次住院理赔含诊断码、操作码、支付金额与出入院日期,但不包含生命体征、检验值与病程记录;一处方事件含 NDC 药品码、天数与费用,但不含适应证与依从性观察。因此其"医学粒度"止于服务与账单层。

§2.3 临床/研究任务定义

任务类型 定义 本数据集对应能力
医疗费用预测 以人口学、慢病标志、历史理赔预测下一年度 Medicare 支付金额 Beneficiary Summary 三年 MEDREIMB_IP/OP/CAR 年度费用
医疗服务利用预测 预测住院次数、门诊就诊频次、处方数量 三类理赔文件的事件计数
慢病表型提取 从理赔诊断码序列推断慢病状态 11 项 SP_* 标志可作为弱监督标签
处方依从性/续药风险 由处方事件时间线推导续药间隔 PDE 文件 SRVC_DT + DAYS_SUPLY_NUM[8]
异常检测 识别理赔模式中的异常支出或异常服务组合 全理赔链多文件链接视角
数据工程/互操作 理赔数据→OMOP CDM 等通用数据模型转换 官方 OMOP 版本与社区 ETL[5][7]

§2.4 患者人群画像

维度 描述
数据来源 2008 年 Medicare fee-for-service 受益人 5% 抽样(约 240 万种子),与 CMS 5% 研究样本、BSA PUF 不相交[2]
时间跨度 2008-01-01 至 2010-12-31,三个完整年度
年龄结构 以 65 岁以上老年人为主体,另含 ESRD 与残障参保者;出生日期经粗化处理(仅保留年份粒度的推算基础)
性别 男/女均覆盖(BENE_SEX_IDENT_CD,1=男,2=女)
种族 BENE_RACE_CD 五类编码(1=白人、2=黑人、3=他人、5=西裔等,以官方 Codebook 为准);无细粒度族裔
就医类型 住院(Inpatient)、门诊(Outpatient)、医生/供应商(Carrier)、处方药(Part D PDE);不含 Medicare Advantage(Part C)理赔
地域 美国 50 州与特区;州/县代码经捐赠者替换或经验分布抽取,不可用于精确地理分析[2]
隐私属性 全合成:每条记录由种子+至少 3 个捐赠者混合生成,不含任何真实患者[2]

§2.5 临床与科研价值

对临床信息学而言,DE-SynPUF 的价值不在回答医学问题,而在训练"读懂理赔数据"的能力:理赔数据是全球医保体系(含中国 DRG/DIP 支付改革)的通用语言,其"一次理赔=一个服务事件+一组诊断码+一组金额字段"的结构在各国高度相似。掌握 DE-SynPUF 的链接分析(受益人-理赔-处方三级),即可迁移至任何真实理赔环境。对方法学研究者,它提供了规模真实、隐私无忧的测试床——PLOS Digital Health 综述将其与 Synthea 并列为公开合成健康数据的两大代表[4]。

§2.6 金标准与参考标准说明

项目 内容
参考标准性质 无临床金标准标签;11 项 SP_* 慢病标志源自 CMS CCW 算法逻辑(真实数据中由理赔算法判定),在合成数据中由合成理赔过程生成[2]
标注方式 全自动算法生成,无人工标注
标注者 无(算法生成;真实版 CCW 标志由 CMS 定义)
官方验证 用户手册附录 A:与真实 Medicare 5% 样本在理赔分布、人口学、慢病分布、费用结构上逐表对比[2]
推断用途限制 官方明确声明:因合成处理,对真实 Medicare 人群的推断研究价值非常有限[1][2]

§3 数据集规格

§3.0 版本抉择矩阵

你的需求 推荐版本 大小/获取 理由
教学/快速原型 DE1.0 Sample 1(原始 CSV) 8 个 ZIP,CMS 官网直接下载 体积最小、与真实 CMS 数据结构一致,完整体验链接分析
全量批处理/生产级管线 DE1.0 全部 20 个样本 160 个 ZIP,官网上列 覆盖约 233 万受益人全量,磁盘与内存要求高
OMOP/OHDSI 生态研究 OMOP CDM 版(AWS S3 synpuf-omop) 1k/100k/2.3m 三档,aws s3 --no-sign-request 免转换直接进入 ATLAS/HADES 工具链[5]
R 语言课堂练习 claimsdb 教学子集 R 包内置 500 名受益人 内存即载入,附 schema 元数据[6]
CDM v5 转换实践 dec-etl-project GitHub 开源,全量约 2 小时 端到端 Python ETL 参考实现[7]

§3.1 模态详情:五类文件

文件类型 记录单位 变量数 核心内容 时间组织
Beneficiary Summary 受益人-年 33 人口学、覆盖月份、ESRD 指示、11 项慢病标志、三类年度费用(Medicare 支付/受益人自付/主支付方) 每年一个文件(2008/2009/2010)
Inpatient Claims 住院理赔 35 医院编号(PRVDR_NUM)、入出院日期、支付金额、主治/主刀医生 NPI、Segment 三年合并单文件
Outpatient Claims 门诊机构理赔 约 140 机构编号、HCPCS 行项目(最多 13 行)、行级支付/自付/共保金额、行级诊断码 三年合并单文件
Carrier Claims 医生/供应商理赔 约 160 5-8 个 ICD-9 诊断码、医生 NPI、机构税号、13 个行项目的 HCPCS 与金额 三年合并、拆为 2 个 CSV
Prescription Drug Events 处方事件 8 NDC-11 药品码、服务日期、配药量、供药天数、患者自付、药品总费用 三年合并单文件

§3.1b 各文件核心变量清单

以下为各文件的代表性变量名(完整变量表见官方 Codebook[2];Beneficiary Summary 共 33 个变量,PDE 固定 8 个变量):

Beneficiary Summary(33 变量,受益人-年粒度)
  DESYNPUF_ID / BENE_BIRTH_DT / BENE_DEATH_DT / BENE_SEX_IDENT_CD / BENE_RACE_CD
  SP_STATE_CODE / BENE_COUNTY_CD / BENE_ESRD_IND
  BENE_HI_CVRAGE_TOT_MONS / BENE_SMI_CVRAGE_TOT_MONS      (Part A / Part B 覆盖月数)
  BENE_HMO_CVRAGE_TOT_MONS / PLAN_CVRG_MOS_NUM            (HMO / Part D 覆盖月数)
  SP_ALZHDMTA / SP_CHF / SP_CHRNKIDN / SP_CNCR / SP_COPD / SP_DEPRESSN
  SP_DIABETES / SP_ISCHMCHT / SP_OSTEOPRS / SP_RA_OA / SP_STRKETIA   (11 项慢病标志)
  MEDREIMB_IP|OP|CAR / BENRES_IP|OP|CAR / PPPYMT_IP|OP|CAR  (年度费用 9 个)

Inpatient Claims(35 变量,理赔粒度,代表字段)
  DESYNPUF_ID / CLM_ID / SEGMENT / CLM_FROM_DT / CLM_THRU_DT
  PRVDR_NUM / CLM_PMT_AMT / NCH_PRMRY_PYR_CLM_PD_AMT
  AT_PHYSN_NPI / OP_PHYSN_NPI / OT_PHYSN_NPI / CLM_DRG_CD
  ICD9_DGNS_CD_1-5 / ICD9_PRCDR_CD_1-6                    (诊断码/操作码槽位)

Prescription Drug Events(8 变量,处方事件粒度)
  DESYNPUF_ID / PDE_ID / SRVC_DT / PROD_SRVC_ID(NDC-11)
  QTY_DSPNSD_NUM / DAYS_SUPLY_NUM / PTNT_PAY_AMT / TOT_RX_CST_AMT

Outpatient 与 Carrier 文件的行项目结构(HCPCS_CD_1-13、LINE_*_1-13)见 §4.1 末段说明。

§3.2 全量记录数(按文件类型 × 年份)

DE-SynPUF 文件 记录单位 2008 2009 2010
Beneficiary Summary 受益人 2,326,856 2,291,320 2,255,098
Inpatient Claims 理赔 547,800 504,941 280,081
Outpatient Claims 理赔 5,673,808 6,519,340 3,633,839
Carrier Claims 理赔 34,276,324 37,304,993 23,282,135
Prescription Drug Events 事件 39,927,827 43,379,293 27,778,849

来源:CMS 官方页与用户手册 Table 1[1][2]。2010 年理赔数偏低系死亡损耗与披露处理所致[1]。按官方记录数推算,平均每名合成受益人每年产生约 16 条理赔与约 16 次处方事件(估算口径:总量 ÷ 受益人-年数)。

§3.2b 单样本规模推算

20 个样本近似等分全量,下表按"官方三年总量 ÷ 20"推算单个样本的体量,供开发机资源规划参考:

维度 单样本推算值 推算依据(三年总量 ÷ 20)
唯一合成受益人 ≈11.6 万 2,326,856(2008 受益人)÷ 20
受益人-年记录 ≈34.4 万 6,873,274 ÷ 20
Inpatient 理赔 ≈6.7 万 1,332,822 ÷ 20
Outpatient 理赔 ≈79 万 15,826,987 ÷ 20
Carrier 理赔(1A+1B 合并) ≈474 万 94,863,452 ÷ 20
处方事件(PDE) ≈555 万 111,085,969 ÷ 20

推算基准为 CMS 官方记录数[1](三年合计数即 §3.2 各行加总)。官方建议按需读取所需样本数即可满足多数开发场景[1];以 pandas 逐样本处理约需数分钟到数十分钟量级,全量 20 样本建议列式转换后分析(见 §6.3b)。社区实践(单样本 Inpatient 66,773 行 × 81 列、Outpatient 790,790 行)与该推算一致[10]。

§3.3 数据格式

内容 格式 说明
五类数据文件 CSV(ZIP 打包) 每样本 8 个 ZIP;日期字段为 YYYYMMDD 字符串
官方读入程序 SAS(.sas) 5 套,各文件类型一套;Carrier 程序自动合并 1A/1B 两份 CSV
官方文档 PDF 用户手册(988KB)、Codebook(801KB)、FAQ(147KB)
OMOP 版本 PostgreSQL/CSV(S3) synpuf-omop 桶,1k/100k/2.3m 三档[5]
教学包 R(DuckDB) claimsdb,n=500 受益人[6]

§3.4 存储与分发

  • 分发结构:20 个互斥样本 × 8 个文件 = 160 个 ZIP;每个样本约含 11.6 万名受益人(2,326,856 ÷ 20 推算)。
  • 官方提示:单个样本在个人电脑上处理即需可观的计算资源与时间[2];全量处理建议服务器环境或列式转换(Parquet/DuckDB)。
  • 官方未公布全量单一总大小,选型时请以实际下载为准。

§3.5 标注方式

本数据集为"算法标注":11 项慢病标志与三类年度费用汇总字段由 CMS 在制作时按 CCW 算法与理赔汇总逻辑生成,再经合成流程扰动。不存在人工阅片/人工编码环节。使用 11 项 SP_* 标志作为机器学习标签时,应将其理解为"理赔驱动的弱监督标签",与电子病历中的临床诊断存在系统性差异(未就诊、未报账的疾病不会体现)。

§3.6 标注者资质与一致性

不适用人工标注者。真实版 CCW 慢病标志由 CMS 依据处方/理赔算法跨 1-3 年窗口判定,官方文档未提供逐条一致性指标(如 Cohen’s kappa)。使用者在合成数据上复现 CCW 算法时,应引用 CMS CCW 算法文档而非本数据集。

§3.7 采集周期

源理赔发生于 2008-01-01 至 2010-12-31。受益人若在期间死亡,死亡年及其后年份无理赔记录(受益人文件保留 BENE_DEATH_DT)。理赔文件按 CLM_THRU_DT(理赔截止日)归年[1][2]。

§3.8 地域覆盖

理论上覆盖全美(州代码 + 县代码字段存在),但合成过程对地理-人口学变量执行了"捐赠者替换或经验分布随机抽取"[2],因此 SP_STATE_CODE/BENE_COUNTY_CD 仅保留字段形态,不支撑真实地理分析。若需真实地理粒度,应申请 CMS Limited Data Sets。

§3.9 设备与供应商规格

理赔型数据无影像设备参数。供应商侧信息体现为:住院/门诊的 PRVDR_NUM(机构编号)、Carrier 文件的 PRF_PHYSN_NPI_1-13(执行医生 NPI)与 TAX_NUM_1-13(机构税号)。这些供应商标识在合成处理中同样经替换/扰动,仅供结构参考与关系建模练习,不可对应真实医生或机构。

§3.10 深度溯源链

层级 内容 依据
L1 源数据 2008 年 Medicare FFS 受益人 5% 抽样(约 240 万人)三年理赔 用户手册 §2[2]
L2 加工 NORC + IMPAQ International 执行种子-捐赠者合成与披露限制 NORC 新闻稿[13]
L3 发布 CMS 于 2013-02-11 公开发布 DE1.0,20 样本 × 8 文件 NORC 新闻稿[13] + CMS 官方页[1]
L4 衍生 OHDSI OMOP CDM 版本(AWS Open Data);社区 ETL、R 教学包 [5][6][7]
L5 更新 DE1.0 后无增量更新(Not updated) AWS Open Data 页[5]

§4 数据结构

§4.0 目录树

DE-SynPUF/                          # 官方无打包根目录,建议按以下结构组织
├── docs/
│   ├── SynPUF_DUG.pdf              # DE1.0 用户手册(2013-01-15)
│   ├── SynPUF_Codebook.pdf         # DE1.0 Codebook(变量取值)
│   ├── SynPUF_FAQ.pdf              # FAQ
│   └── sas_code/                   # 5 套官方 SAS 读入程序
├── DE_1/                           # Sample 1(共 20 个样本,互斥受益人切片)
│   ├── DE1_0_2008_Beneficiary_Summary_File_Sample_1.zip
│   ├── DE1_0_2009_Beneficiary_Summary_File_Sample_1.zip
│   ├── DE1_0_2010_Beneficiary_Summary_File_Sample_1.zip
│   ├── DE1_0_2008_to_2010_Inpatient_Claims_Sample_1.zip
│   ├── DE1_0_2008_to_2010_Outpatient_Claims_Sample_1.zip
│   ├── DE1_0_2008_to_2010_Carrier_Claims_Sample_1A.zip   # Carrier 拆两份
│   ├── DE1_0_2008_to_2010_Carrier_Claims_Sample_1B.zip
│   └── DE1_0_2008_to_2010_Prescription_Drug_Events_Sample_1.zip
├── DE_2/                           # Sample 2 ... 直至 DE_20
└── DE_20/

§4.1 DAIMS 字段字典:Beneficiary Summary(核心 14 字段)

字段名 类型 说明 示例值 AI 用途 观测误差 信息性缺失编码 取值范围
DESYNPUF_ID string 16 位加密受益人标识,全文件链接键 00013D2EFD8E89D8 实体主键/序列建模分组 无(专建标识,不含患者信息) 无缺失 16 位字符串
BENE_BIRTH_DT date 出生日期(粗化) 1938-09-12 年龄推导 粗化扰动,仅宜作年龄代理 无缺失 1900-2008
BENE_DEATH_DT date 死亡日期 2010-05-04 生存/删失建模 日期扰动 空=观察期内在世 2008-2010 或空
BENE_SEX_IDENT_CD int 性别 1 分层/公平性分析 合成扰动 无缺失 1=男,2=女
BENE_RACE_CD int 种族编码 1 公平性分析(粗粒度) 合成扰动 无缺失 1/2/3/5 等
BENE_ESRD_IND string 终末期肾病指示 Y 高风险人群识别 合成扰动 空=非 ESRD Y/N/空
SP_STATE_CODE int 州代码 21 仅作分类特征,不可作地理分析 捐赠者替换/随机抽取[2] 无缺失 州码表
BENE_HI_CVRAGE_TOT_MONS int Part A 覆盖月数 12 暴露时间/人月计算 披露处理 无缺失 0-12
BENE_SMI_CVRAGE_TOT_MONS int Part B 覆盖月数 12 暴露时间/人月计算 披露处理 无缺失 0-12
SP_DIABETES int 糖尿病慢病标志 1 弱监督标签 由合成理赔生成[2] 空=信息缺失 1=是,2=否
SP_CHF int 心衰慢病标志 2 弱监督标签 同上 空=信息缺失 1=是,2=否
MEDREIMB_IP float 住院年度 Medicare 支付额 12,345.67 费用预测标签 粗化+扰动 0=无住院 ≥0
MEDREIMB_OP float 门诊年度 Medicare 支付额 1,234.56 费用预测标签 粗化+扰动 0=无门诊 ≥0
MEDREIMB_CAR float 医生理赔年度 Medicare 支付额 2,345.67 费用预测标签 粗化+扰动 0=无该类理赔 ≥0

Inpatient/Outpatient/Carrier/PDE 文件字段详见官方用户手册 §4 与 Codebook[2];Carrier 文件行项目字段扩展至 13(如 ICD9_DGNS_CD_1-8、HCPCS_CD_1-13、LINE_NCH_PMT_AMT_1-13),PDE 文件固定 8 字段[2]。

§4.1b 字段字典:Inpatient Claims(代表字段)

字段名 类型 说明 AI 用途 备注
CLM_ID string 理赔标识 事件主键 同一住院的多个分段共享 CLM_ID
SEGMENT int 理赔分段号 与 CLM_ID 联用还原完整住院 语义对齐真实 LDS
PRVDR_NUM string 医院供应商编号 机构级特征 合成扰动,仅保留字段形态
CLM_FROM_DT / CLM_THRU_DT date 理赔起止日期(近似入/出院) 住院时长计算 日期扰动
CLM_PMT_AMT float Medicare 支付总额 费用标签 粗化+扰动
NCH_PRMRY_PYR_CLM_PD_AMT float 主支付方支付额 费用三方分解之一 同上
AT_PHYSN_NPI / OP_PHYSN_NPI string 主刀/主治医生 NPI 服务者特征 不对应真实医生
ICD9_DGNS_CD_1-5 string ICD-9-CM 诊断码槽位 主诊断/并发症特征 保留字符串原貌
ICD9_PRCDR_CD_1-6 string ICD-9 操作码槽位 操作特征 同上
CLM_DRG_CD string MS-DRG 分组码 病例组合/病种分组 病种分析常用

§4.1c 字段字典:Prescription Drug Events(全部 8 字段)

字段名 类型 说明 AI 用途 备注
DESYNPUF_ID string 受益人链接键 序列建模分组 16 位加密标识
PDE_ID string 处方事件标识 事件主键 SAS 长度 $15[12]
SRVC_DT date 处方服务日期 时序锚点(供药开始日) YYYYMMDD,格式 yymmdd8[12]
PROD_SRVC_ID string NDC-11 药品码 药品特征/RxNorm 映射 含前导零,勿转数值,SAS 长度 $19[12]
QTY_DSPNSD_NUM float 配药数量 剂量特征 无单位字段
DAYS_SUPLY_NUM int 供药天数 预期用尽日 = SRVC_DT + DAYS_SUPLY_NUM 续药/依从性任务核心[8]
PTNT_PAY_AMT float 患者自付金额 经济负担特征 粗化
TOT_RX_CST_AMT float 药品总费用 药费标签 粗化

§4.2 标签分布说明

  • 11 项 SP_* 慢病标志:二元指示(官方 Codebook:1=是,2=否),部分记录为空值。无官方逐项患病率发布;用户手册附录 A 提供与真实 5% 样本的对比表(定性结论:分布接近)[2]。
  • 三类年度费用字段:高度右偏的连续值,大量零值(对应无该类服务),建模时建议先构造"是否发生"二值任务再建费用回归(两段式 hurdle 模型)。
  • 官方未提供任何训练/测试标签划分——所有划分均由使用者自定义(见 §5)。

§4.3 关键统计与链接基数

关系 基数 说明
受益人 → 受益人-年记录 1 → 最多 3 死亡者少于 3 条
受益人 → 住院理赔 1 → 0…n 三年合计约 133 万条
受益人 → 门诊理赔 1 → 0…n 三年合计约 1,583 万条
受益人 → Carrier 理赔 1 → 0…n 三年合计约 9,486 万条
受益人 → 处方事件 1 → 0…n 三年合计约 1.11 亿条
理赔 → 行项目(Carrier) 1 → 1…13 行项目含 HCPCS 与行级金额

§4.4 数据层级

合成受益人(DESYNPUF_ID)
├── 受益人-年记录 × 3(人口学、慢病标志、年度费用)
├── 住院理赔(CLM_ID,Segment 支持分段)
├── 门诊理赔(CLM_ID + 行项目)
├── Carrier 理赔(CLM_ID + 最多 13 行项目)
└── 处方事件(PDE_ID,8 字段)

§4.5 缺失值与信息性缺失编码

字段/模式 缺失形态 信息性含义 处理建议
BENE_DEATH_DT 空 观察期内存活(信息性缺失,可作删失指示) 生存分析中转为事件指示
SP_* 慢病标志 空 源数据中该标志不可判定 不要填 0;加"未知"类别
BENE_ESRD_IND 空 非 ESRD 可安全映射为 N
理赔金额字段 0 无该类费用(结构性零) 费用建模区分"零值"与"低值"
Carrier 行项目空槽位 空 该理赔行项目数少于槽位数 行项目透视时需过滤
2010 年记录整体偏少 记录级 死亡损耗 + 披露处理[1] 时序建模注意年份不平衡

§5 数据划分与使用建议

§5.1 官方划分

官方不提供机器学习意义上的 train/test 划分,但提供了天然的互斥结构:20 个样本是 20 个互不相交的受益人切片(同一受益人的全部理赔仅出现在同一编号样本中)[1][3]。每个样本内部包含该受益人 2008-2010 的全部五类文件记录。

§5.2 社区惯例划分

  • 开发/教学:仅用 Sample 1(约 11.6 万受益人)完成端到端开发。
  • 建模:将 20 个样本按 16/2/2 或 14/3/3 分配为 train/validation/test——由于样本互斥,任何划分都天然做到"无患者泄漏"。
  • 时序任务:以 2008-2009 为训练窗口、2010 为外推测试窗口(注意 2010 记录数偏低的年份效应[1])。

§5.3 泄漏风险清单

  1. 受益人内跨年泄漏:同一受益人三年记录高度相关,随机行级划分会高估性能——必须以 DESYNPUF_ID(或样本号)为单位划分。
  2. 标签与特征同源:SP_* 慢病标志由合成理赔生成,若同时用理赔诊断码作特征,存在定义性相关(标签泄漏);费用预测任务中勿将当年费用分量同时作特征。
  3. 覆盖月数未对齐:覆盖月数不足 12 的受益人费用不可直接年化比较,须先按人月归一。

§5.4 交叉验证建议

按样本号做 5 折 CV(每折 4 个样本),保证折间受益人不重叠;时序敏感任务改用"前两年训练、后一年验证"的滚动原点设计。

§5.5 外部验证建议

DE-SynPUF 上训练的模型只能作为方法验证,上线前必须在真实理赔数据上外部验证(如 CMS Limited Data Sets、商业保险理赔或国内 DRG/DIP 数据)。官方 OMOP 版本可与 Synthea OMOP、MIMIC-IV 衍生理赔映射数据集交叉检验管线兼容性[5]。

§5.6 跨体系迁移对照

把在 DE-SynPUF 上搭好的管线迁移到其他理赔/OMOP 体系时,按以下概念对照操作(映射依据 AWS synpuf-omop 官方转换[5]与社区 ETL 实践[7]):

概念 DE-SynPUF 原生字段 OMOP CDM 目标表 迁移要点
合成受益人 DESYNPUF_ID person.person_id 一对一映射
出生/死亡 BENE_BIRTH_DT / BENE_DEATH_DT person.birth_datetime / death 扰动后仅作年龄代理
Medicare 覆盖 BENE_HI/SMI_CVRAGE_TOT_MONS payer_plan_period 月数按年展开为期间
住院理赔 Inpatient CSV(CLM_ID + SEGMENT) visit_occurrence(inpatient) 先聚合 Segment 再入库
门诊机构理赔 Outpatient CSV(CLM_ID) visit_occurrence(outpatient) 同上
医生理赔 Carrier CSV(CLM_ID + 行项目) visit_occurrence + procedure_occurrence 行项目→procedure 记录
诊断码 ICD9_DGNS_CD_* condition_occurrence 经 Athena 词表 ICD9CM→SNOMED
处方 PDE(PROD_SRVC_ID) drug_exposure NDC→RxNorm 词表映射
慢病标志 SP_* condition_occurrence(推导) 转换脚本按 CCW 规则回填
年度费用 MEDREIMB_* / BENRES_* / PPPYMT_* cost 注意 OMOP cost 表粒度与口径

迁移到真实 CMS LDS 时,字段名高度相似但变量数更多(DE-SynPUF 即 LDS 的变量削减版[1]),主要工作量在补齐被削减的字段与放宽合成处理的假设;迁移到国内 DRG/DIP 数据时,理赔事件结构可复用,但码表(ICD-9→ICD-10/医保码)与费用三方分担语义需重建。


§6 AI 就绪指南

§6.0 云端快速启动(OMOP 版本)

若目标是 OMOP 生态,无需下载原始 CSV——AWS Open Data 提供三种规模的 CDM 版本(1k/100k/2.3m),匿名访问即可浏览[5]:

# 无需 AWS 账号:匿名列出 OMOP CDM 版本对象
aws s3 ls --no-sign-request s3://synpuf-omop/

# 同步 1k 小规模版本到本地(适合笔记本)
aws s3 sync --no-sign-request s3://synpuf-omop/1k ./synpuf-omop-1k

§6.1 快速上手(原始 CSV 路线)

代码前的目录约定:假设你已按 §4.0 结构将 Sample 1 的 8 个 ZIP 下载并解压到 data_root/DE_1/。data_root 是唯一需要配置的变量,所有路径以 os.path.join(data_root, "DE_1", 文件名) 形式拼接。最小可用子集 = 2008 年受益人摘要文件(约 11.6 万行)+ 该样本的 Inpatient 文件,即可完成一次"受益人-理赔"链接分析。

import os
import pandas as pd

data_root = "data_root"                      # 根目录,下含 DE_1 ... DE_20
sample_dir = os.path.join(data_root, "DE_1")

# 2008 受益人摘要(各列以官方 Codebook 为准)
bene = pd.read_csv(
    os.path.join(sample_dir, "DE1_0_2008_Beneficiary_Summary_File_Sample_1.csv"),
    dtype={"DESYNPUF_ID": str, "BENE_BIRTH_DT": str, "BENE_DEATH_DT": str},
)

# 住院理赔(三年合并单文件)
ip = pd.read_csv(
    os.path.join(sample_dir, "DE1_0_2008_to_2010_Inpatient_Claims_Sample_1.csv"),
    dtype={"DESYNPUF_ID": str, "CLM_ID": str,
           "CLM_FROM_DT": str, "CLM_THRU_DT": str},
)

# 受益人 → 理赔 一对多链接
linked = ip.merge(bene, on="DESYNPUF_ID", how="inner", validate="m:1")
print(linked[["DESYNPUF_ID", "CLM_THRU_DT", "CLM_PMT_AMT", "SP_DIABETES"]].head())

§6.2 数据获取

步骤 内容 入口
1 打开官方主页,选择 Sample 1-20 任一下载页 CMS 官方页[1]
2 下载该样本 8 个 ZIP(受益人 ×3、IP、OP、Carrier ×2、PDE) 下载页直链 downloads.cms.gov/files/...
3 阅读用户手册与 Codebook(变量与取值) [2]
4 可选:官方 SAS 读入程序(自动合并 Carrier 1A/1B) 下载页附件
5 可选:OMOP 版本(AWS S3,1k/100k/2.3m) [5]
# 直链下载示例(PDE 文件,Sample 1)
curl -L -O https://downloads.cms.gov/files/DE1_0_2008_to_2010_Prescription_Drug_Events_Sample_1.zip

# 全部 20 个样本可用循环脚本批量抓取(注意礼貌抓取,控制并发)
for s in 1 2 3 4 5; do
  curl -L -O "https://downloads.cms.gov/files/DE1_0_2008_to_2010_Inpatient_Claims_Sample_${s}.zip"
done

下载完成后先做完整性自检——官方下载页未提供逐文件校验和,以"ZIP 可完整解压 + 行数抽检"代替:

# 1) 每个样本应恰好 8 个 ZIP;全部 ZIP 必须可完整解压(社区曾报告个别样本损坏[10])
ls data_root/DE_1/*.zip | wc -l                       # 期望 8
for z in data_root/DE_1/*.zip; do
  unzip -tq "$z" > /dev/null || echo "损坏: $z"
done

# 2) 行数抽检(2008 受益人文件每样本约 11.6 万行,见 §3.2b)
wc -l data_root/DE_1/DE1_0_2008_Beneficiary_Summary_File_Sample_1.csv

§6.3 预处理全流程

目标产物:把"20 样本 × 8 文件"的原始 CSV 转换为分析友好的 Parquet:受益人纵向单表 + 三类理赔事件表 + PDE 事件表,全部以 DESYNPUF_ID 为外键。

import glob
import pandas as pd
from pathlib import Path

DATA = Path("data_root")

def load_bene_years(sample_dir: Path) -> pd.DataFrame:
    """三个年度受益人文件纵向拼接;年份显式落列。
    注意:同一 DESYNPUF_ID 在三个文件各出现一次(受益人-年),这是结构而非重复。"""
    frames = []
    for year in (2008, 2009, 2010):
        f = sample_dir / f"DE1_0_{year}_Beneficiary_Summary_File_Sample_{n}.csv"
        df = pd.read_csv(f, dtype=str)
        df["BENE_YEAR"] = year
        frames.append(df)
    bene = pd.concat(frames, ignore_index=True)
    # 日期解析与死亡标志
    for c in ("BENE_BIRTH_DT", "BENE_DEATH_DT"):
        bene[c] = pd.to_datetime(bene[c], format="%Y%m%d", errors="coerce")
    bene["IS_DEAD"] = bene["BENE_DEATH_DT"].notna().astype(int)
    # 慢病标志:1=是,2=否,空=未知 → 三值语义
    sp_cols = ["SP_ALZHDMTA", "SP_CHF", "SP_CHRNKIDN", "SP_CNCR", "SP_COPD",
               "SP_DEPRESSN", "SP_DIABETES", "SP_ISCHMCHT",
               "SP_OSTEOPRS", "SP_RA_OA", "SP_STRKETIA"]
    for c in sp_cols:
        bene[c] = pd.to_numeric(bene[c], errors="coerce")
    # 年龄(按受益人-年计算)
    bene["AGE"] = (pd.to_datetime(bene["BENE_YEAR"], format="%Y")
                   - bene["BENE_BIRTH_DT"]).dt.days // 365
    return bene

def load_carrier(sample_dir: Path, n: int) -> pd.DataFrame:
    """Carrier 理赔:必须同时读取 1A 与 1B 两份 CSV 后纵向合并(见坑点 2)。"""
    parts = []
    for tag in ("A", "B"):
        f = sample_dir / f"DE1_0_2008_to_2010_Carrier_Claims_Sample_{n}{tag}.csv"
        parts.append(pd.read_csv(f, dtype={"DESYNPUF_ID": str, "CLM_ID": str}))
    car = pd.concat(parts, ignore_index=True)
    for c in ("CLM_FROM_DT", "CLM_THRU_DT"):
        car[c] = pd.to_datetime(car[c], format="%Y%m%d", errors="coerce")
    return car

def to_events_wide_to_long(car: pd.DataFrame, n_lines: int = 13) -> pd.DataFrame:
    """行项目宽表 → 长表:过滤空槽位(LINE_*_1..13 的大量空列)。"""
    rows = []
    for i in range(1, n_lines + 1):
        cols = {"DESYNPUF_ID": "DESYNPUF_ID", "CLM_ID": "CLM_ID",
                f"HCPCS_CD_{i}": "HCPCS_CD", f"LINE_NCH_PMT_AMT_{i}": "LINE_PMT",
                f"LINE_ICD9_DGNS_CD_{i}": "LINE_DGNS"}
        sub = car[list(cols)].rename(columns=cols)
        sub = sub.dropna(subset=["HCPCS_CD"])          # 空槽位剔除
        sub["LINE_NO"] = i
        rows.append(sub)
    return pd.concat(rows, ignore_index=True)

n = 1                                          # 当前处理 Sample 1
sample_dir = DATA / f"DE_{n}"
bene = load_bene_years(sample_dir)
carrier = load_carrier(sample_dir, n)
car_lines = to_events_wide_to_long(carrier)
bene.to_parquet(DATA / f"bene_s{n}.parquet")   # 列式存储,后续分析提速一个量级
car_lines.to_parquet(DATA / f"carrier_lines_s{n}.parquet")

标准化要点:金额字段直接保留美元原值(不要取对数后再存);日期统一为 ISO 格式;ICD-9/HCPCS/NDC 码保留字符串原貌(有前导零与字母混排);若需术语映射,走 OMOP Athena 词表(ICD9CM/ICD9Proc/HCPCS/NDC→RxNorm)[7]。

§6.3b DuckDB 列式转换(全量推荐路线)

处理 20 个样本全量时,DuckDB 以 SQL 直接扫 CSV 并一次性落 Parquet,比逐样本 pandas 更省内存:

import duckdb
from pathlib import Path

DATA = Path("data_root")
con = duckdb.connect()

# 1) 受益人:20 样本 × 3 年共 60 个 CSV 一次扫入,从文件名提取年份
con.execute(f"""
    COPY (
        SELECT *, CAST(regexp_extract(filename, '(20[0-9][0-9])_Beneficiary') AS INT) AS BENE_YEAR
        FROM read_csv_auto('{DATA}/DE_*/DE1_0_*_Beneficiary_Summary_File_Sample_*.csv',
                           filename=true, all_varchar=true, union_by_name=true)
        ORDER BY DESYNPUF_ID, BENE_YEAR
    ) TO 'bene_all.parquet' (COMPRESSION ZSTD)
""")

# 2) Carrier:glob 同时匹配 1A/1B 两份 CSV,合并后落 Parquet
con.execute(f"""
    COPY (
        SELECT * FROM read_csv_auto(
            '{DATA}/DE_*/DE1_0_2008_to_2010_Carrier_Claims_Sample_*[AB].csv',
            all_varchar=true, union_by_name=true)
    ) TO 'carrier_all.parquet' (COMPRESSION ZSTD)
""")

# 3) 行项目长表:直接在 SQL 中 unpivot 13 个行槽位(以 HCPCS 为例)
con.execute(f"""
    COPY (
        SELECT DESYNPUF_ID, CLM_ID, UNNEST_LINE AS LINE_NO, HCPCS
        FROM (SELECT DESYNPUF_ID, CLM_ID,
                     unnest(list_filter([HCPCS_CD_1,HCPCS_CD_2,HCPCS_CD_3,HCPCS_CD_4,
                                         HCPCS_CD_5,HCPCS_CD_6,HCPCS_CD_7,HCPCS_CD_8,
                                         HCPCS_CD_9,HCPCS_CD_10,HCPCS_CD_11,HCPCS_CD_12,
                                         HCPCS_CD_13], x -> x IS NOT NULL)) AS UNNEST_LINE,
                     [1,2,3,4,5,6,7,8,9,10,11,12,13] AS LINE_IDX)
        , UNNEST(UNNEST_LINE, LINE_IDX) AS t(UNNEST_LINE, LINE_NO)
    ) TO 'carrier_lines.parquet' (COMPRESSION ZSTD)
""")

运行前提:Sample 11 Carrier ZIP 的文件名多出 “.csv” 尾巴需先重命名(见 §6.5 坑点 3)。all_varchar=true 保护码表前导零;金额列后续按需 CAST 为 DECIMAL/DOUBLE。转换后三个 Parquet 总扫描成本低于原始 CSV 的 pandas 载入一个数量级。

§6.4 PyTorch DataLoader

受益人级多模态样本 = 静态人口学/慢病向量 + 理赔事件序列 + 处方事件序列。以下为完整可运行模板:

# 目录预期:data_root/DE_1/ 下有 bene.parquet、events.parquet(由 §6.3 生成,
# events.parquet = 三类理赔事件纵向合并,含 EVENT_TYPE 列)
# data_root 拼接关系:DATA / f"DE_{n}" / 文件名;最小可用子集 = 单样本单 Parquet
import numpy as np
import pandas as pd
import torch
from torch.utils.data import Dataset, DataLoader

SP_COLS = ["SP_ALZHDMTA", "SP_CHF", "SP_CHRNKIDN", "SP_CNCR", "SP_COPD",
           "SP_DEPRESSN", "SP_DIABETES", "SP_ISCHMCHT",
           "SP_OSTEOPRS", "SP_RA_OA", "SP_STRKETIA"]

class SynPUFDataset(Dataset):
    """每个样本 = 一名受益人 2008-2010 的事件序列 + 2009 年标签。
    标签:2010 年住院总费用是否超过该样本中位数(二分类费用风险)。"""

    def __init__(self, events: pd.DataFrame, bene: pd.DataFrame,
                 seq_len: int = 64, median_threshold: float = 0.0):
        self.seq_len = seq_len
        self.events = events.sort_values(["DESYNPUF_ID", "EVENT_DT"])
        self.label = (events[events.EVENT_YEAR == 2010]
                      .groupby("DESYNPUF_ID")["AMT"].sum()
                      .gt(median_threshold).astype(np.float32))
        self.static = bene.set_index("DESYNPUF_ID")
        self.ids = sorted(set(self.static.index) & set(self.label.index))

    def __len__(self):
        return len(self.ids)

    def __getitem__(self, idx):
        pid = self.ids[idx]
        ev = self.events[self.events.DESYNPUF_ID == pid].tail(self.seq_len)
        seq = np.zeros((self.seq_len, 4), dtype=np.float32)   # [天数差, 金额, 事件类型, 是否住院]
        if len(ev):
            dts = (pd.to_datetime(ev["EVENT_DT"]) -
                   pd.to_datetime(ev["EVENT_DT"]).iloc[-1]).dt.days.to_numpy()
            seq[-len(ev):, 0] = dts / 365.0
            seq[-len(ev):, 1] = np.log1p(ev["AMT"].to_numpy())
            seq[-len(ev):, 2] = ev["EVENT_TYPE"].to_numpy()
            seq[-len(ev):, 3] = (ev["EVENT_TYPE"] == 0).to_numpy()
        row = self.static.loc[pid].iloc[0] if isinstance(self.static.loc[pid], pd.DataFrame) \
              else self.static.loc[pid]
        static_vec = np.concatenate([
            row[SP_COLS].fillna(0).to_numpy(dtype=np.float32) - 1.0,   # 1/2 → 0/1
            [row["AGE"] / 100.0, row["IS_DEAD"]],
        ]).astype(np.float32)
        return (torch.from_numpy(seq), torch.from_numpy(static_vec),
                torch.tensor(self.label[pid]))

def collate(batch):
    seq, stat, lab = zip(*batch)
    return (torch.stack(seq), torch.stack(stat),
            torch.stack(lab).unsqueeze(1))

loader = DataLoader(SynPUFDataset(events, bene), batch_size=256,
                    shuffle=True, num_workers=4, collate_fn=collate)
for seq_x, static_x, y in loader:
    ...                                     # 双塔输入:LSTM/Transformer(seq) ⊕ MLP(static)
    break

§6.5 八大坑点

⚠️ 坑点 1:把合成数据当真实数据做统计推断(分类:偏倚陷阱)

问题:DE-SynPUF 的每个变量都经过插补、抑制与粗化,合成过程系统性地改变了变量间协变关系。基于它计算的回归系数、相关矩阵、风险比与真实 Medicare 数据存在结构性偏差。claimsdb 作者明确警告:“CMS 采用的合成过程改变了变量间的协变关系,分析者对真实 Medicare 人群下推断时应保持谨慎”[6]。
症状:模型在 DE-SynPUF 上 AUC/ R² 表现良好,换到真实理赔数据后性能骤降;文献审稿人以"合成数据不可作人群推断"拒稿。
解决:

  1. 简单方法:论文与报告中显式声明数据为合成数据,所有统计量仅作"方法演示"而非"人群估计";官方页原文"has very limited inferential research value"应引用[1]。
  2. 进阶方法:在 DE-SynPUF 上完成特征工程与管线验证后,保留全部超参数,迁移到真实数据(CMS Limited Data Sets 或国内理赔数据)上重训与校准。
  3. SOTA 方法:采用"合成预训练 + 真实微调"范式时,对协变敏感的层(如费用回归头)做冻结或低学习率处理,并报告真实数据上的外部验证指标。
    参考:CMS 官方页[1];用户手册 §6 Methodology and Limitation[2];Gonzales et al. 2023[4]

⚠️ 坑点 2:Carrier 文件 1A/1B 未合并,理赔计数凭空少一半(分类:工程陷阱)

问题:因文件体积限制,每个样本的 Carrier 理赔被拆为两个 CSV(..._Sample_1A.zip 与 ..._Sample_1B.zip),官方 SAS 程序会把二者合成一个数据集[3]。Python/R 用户若只读 A 文件,将静默丢失约一半医生理赔。
症状:Carrier 理赔总数约为官方数(如 2008 年 34,276,324 全量)的一半;受益人理赔频次分布异常偏低。
解决:

  1. 简单方法:读入后 pd.concat([df_a, df_b]) 纵向合并(两文件无重复行)。
  2. 进阶方法:封装 load_carrier()(见 §6.3),强制同时读取 1A/1B 并断言行数 > 单文件行数。
  3. SOTA 方法:ETL 层校验——用官方 Table 1 的全量记录数(按样本数换算)对每类文件行数做断言,偏差超阈值即报警[2]。
    参考:CMS 下载页说明(“Both CSV files in a sample must be downloaded”)[3]

⚠️ 坑点 3:受益人-年结构导致的划分泄漏(分类:数据泄漏)

问题:受益人文件按年拆为 3 个 CSV,同一 DESYNPUF_ID 出现 3 次(含时变变量:慢病标志、费用、死亡)[3]。若把"行"当独立样本随机划分,同一受益人的 2008 行与 2009 行会分属训练集与测试集,性能虚高。
症状:随机 K 折的测试指标显著优于"按受益人划分"的指标;冲突矩阵中 ID 交叉计数为 0 才是正确划分。
解决:

  1. 简单方法:先 pd.concat 三个年度文件,按 DESYNPUF_ID 聚合为受益人级样本,再划分。
  2. 进阶方法:利用官方 20 样本的互斥结构,按样本号做 5 折 CV——样本间天然零患者重叠[1]。
  3. SOTA 方法:划分后增加断言 assert len(set(train_ids) & set(test_ids)) == 0,并把划分脚本纳入版本控制以保证可复现。
    参考:CMS 官方页(“All claims for a particular beneficiary are in samples with the same number”)[1]

⚠️ 坑点 4:死亡删失与 2010 记录塌陷被当成数据错误(分类:标签理解)

问题:受益人若在 2008-2010 间死亡,其死亡年之后的理赔记录为空;2010 年各类理赔数显著低于前两年(官方归因:死亡损耗 + 披露处理)[1]。时序模型会把"死亡者无理赔"误学为"低风险者无理赔"。
症状:2010 年事件量骤降约 24%-49%(见 §3.2 表)被误判为数据缺失;费用预测模型对晚期年份系统性低估。
解决:

  1. 简单方法:构建 IS_DEAD 标志与暴露人月(BENE_HI_CVRAGE_TOT_MONS),费用一律按人月归一。
  2. 进阶方法:生存分析视角——以 BENE_DEATH_DT 作删失事件,用删失加权(IPCW)修正事件率估计。
  3. SOTA 方法:序列模型输入端加入"存活状态通道",并在损失函数中对死亡受益人的后续时间步置 mask。
    参考:CMS 官方页 Note(“attrition from death, and some effects of disclosure treatment”)[1];下载页(“If the beneficiary dies… will not have any data in years after”)[3]

⚠️ 坑点 5:SP_ 慢病标志与文件内 ICD-9 码对不上*(分类:标签理解)

问题:SP_* 慢病标志在真实 CMS 体系中由跨 1-3 年的 CCW 算法在多条理赔上判定;在 DE-SynPUF 中官方说明由合成理赔过程生成[2]。因此"某受益人 SP_DIABETES=1 但其 Carrier 文件中无任何糖尿病 ICD-9 码(250.xx)“并非数据错误——判定窗口、算法与合成扰动都会造成不一致。
症状:以 SP_* 为标签、以理赔诊断码为特征的表型算法校验失败率异常高;直接复用真实数据的 CCW 复现脚本报出大量"假阴性”。
解决:

  1. 简单方法:接受二者为独立信息源,SP_* 作弱监督标签、ICD-9 序列作输入特征,不互相校验。
  2. 进阶方法:把"SP_* 与 ICD-9 一致性"作为特征(而非过滤条件),学习合成数据中标志的生成逻辑。
  3. SOTA 方法:需要严格 CCW 定义时,回读 CMS CCW 算法文档并在真实数据(Limited Data Sets)上验证,合成数据仅作管线冒烟测试。
    参考:用户手册 §6(“Synthesizing chronic condition indicators using synthetic claims created by other processes”)[2]

⚠️ 坑点 6:日期扰动使"精确时间间隔"不可信(分类:预处理陷阱)

问题:官方披露限制方法之一是 Date Perturbation(改变日期与事件间隔)[2],出生日期亦被粗化。涉及精确间隔的计算——如 SRVC_DT + DAYS_SUPLY_NUM 推导续药间隔、再入院 30 天窗口、年龄精确到月——都会带合成噪声。
症状:续药间隔分布出现真实世界罕见的锯齿;30 天再入院率与文献值系统性偏离;同一出生日期在跨年文件中年龄突变。
解决:

  1. 简单方法:间隔类特征做分箱(如 0-7/8-14/15-30/30+ 天),粗化吸收扰动噪声。
  2. 进阶方法:对年龄只用"年份差"口径(出生日期粗化的最小可信粒度);跨文件日期比较加 ±容差。
  3. SOTA 方法:时间敏感任务(再入院、续药)在真实数据上复算;合成数据上报告"对扰动稳健的聚合级指标"(月度/季度事件率)。
    参考:用户手册 §6 Date Perturbation[2];Leeds hackathon 对 SRVC_DT + DAYS_SUPLY_NUM 的容差设计[8]

⚠️ 坑点 7:Sample 11 的 ZIP 命名异常与 “.Copy.csv” 陷阱(分类:工程陷阱)

问题:社区 ETL 项目记录了两类分发瑕疵:Sample 11 的 Carrier ZIP 文件名多出 .csv(DE1_0_2008_to_2010_Carrier_Claims_Sample_11A.csv.zip),需重命名为 .zip 才能正常解压;部分 ZIP 解压出的文件名为 xxx.Copy.csv,直接按模式匹配会漏读[7]。另有第三方镜像曾报告个别样本 ZIP 损坏[10]。
症状:批量下载脚本对 Sample 11 报 404 或损坏;glob(“*.csv”) 少读文件,静默丢数据。
解决:

  1. 简单方法:下载后对文件名做规范化(去掉多余 .csv 后缀),解压后用 os.rename 清理 .Copy.csv。
  2. 进阶方法:校验每个 ZIP 的完整性(zipfile.ZipFile(f).testzip()),失败则从官网重下该样本。
  3. SOTA 方法:ETL 清单化——160 个文件建立 manifest(文件名/大小/行数),每次运行前 diff 校验(dec-etl-project 思路)[7]。
    参考:dec-etl-project README(“you need to rename … .Copy.csv”)[7]

⚠️ 坑点 8:行项目宽表的 13 个空槽位撑爆内存并污染特征(分类:预处理陷阱)

问题:Outpatient/Carrier 文件以行项目宽表存储(HCPCS_CD_1-13、LINE_NCH_PMT_AMT_1-13 等)[2],实际多数理赔仅 1-5 个行项目,其余槽位为空。直接 pd.read_csv 全列读入 9,486 万条 Carrier 理赔会产生巨大内存压力;把空槽位当 0 金额统计则稀释均值。
症状:读入 32GB+ 内存溢出;行级费用均值被大量伪零拉低;HCPCS 码频率统计被 NaN 干扰。
解决:

  1. 简单方法:usecols 只读核心列,或按 chunksize 流式读取后立即窄化。
  2. 进阶方法:宽转长 + dropna 过滤空槽位(§6.3 to_events_wide_to_long()),输出紧凑长表 Parquet。
  3. SOTA 方法:DuckDB 直接对 CSV 做列裁剪与谓词下推(COPY (SELECT ... FROM read_csv_auto(...)) TO ... (FORMAT PARQUET)),零 pandas 内存峰值完成转换。
    参考:用户手册 §4 变量表(LINE_*_1-13 结构)[2];§6.3 本文参考实现

§6.6 数据增强(安全 ✅ / 危险 ❌)

  • ✅ 安全:事件序列截断/滑窗采样(保持 DESYNPUF_ID 单位);金额对数变换;慢病标志的随机掩码(模拟缺失);按样本号重加权。
  • ✅ 安全:用 Synthea 等生成工具对合成数据"再合成"扩大规模(均不涉及真实隐私)。
  • ❌ 危险:对日期做随机平移后仍宣称"30 天再入院"等精确窗口指标(扰动噪声被二次放大)。
  • ❌ 危险:用 SMOTE 等过采样生成"新受益人"后与原数据混合评估——合成数据的协变已被改变,二次生成会进一步失真。
  • ❌ 危险:把增强后的数据与真实 CMS 数据混拼训练并声称"真实性能"。

§6.7 模型推荐

任务 推荐基线 进阶 说明
费用二值/回归 GBDT(LightGBM)+ 两段式 hurdle Transformer 序列回归 先预测"是否发生"再预测金额
服务利用预测 泊松/负二项回归 深度计数模型 以人月为暴露归一
慢病表型 逻辑回归(ICD-9 词袋) CNN/注意力码序列模型 SP_* 作弱监督
处方序列 马尔可夫转移图 序列推荐(SASRec 类) 时序划分防泄漏[8]
管线/CDM 工程 DuckDB + Parquet Spark 全量 2.3m 受益人建议列式存储

§6.8 硬件需求

场景 数据规模 建议配置
单样本教学 约 11.6 万受益人 16GB 内存笔记本即可
多样本建模 4-8 个样本 32-64GB 内存 + SSD
全量批处理 20 个样本(约 233 万受益人、2 亿+事件) 128GB+ 内存服务器或 DuckDB/Spark 列式流程;参考:社区 Python ETL 全量转换约 2 小时[7]

§6.9 评估指标代码

import numpy as np
from sklearn.metrics import roc_auc_score, average_precision_score

def evaluate_cost_classifier(y_true, y_prob) -> dict:
    """费用风险二分类:报告 AUROC 与 AUPRC(类别不平衡下后者更敏感)。"""
    return {
        "AUROC": roc_auc_score(y_true, y_prob),
        "AUPRC": average_precision_score(y_true, y_prob),
    }

def mape_excluding_zero(y_true, y_pred, eps=1e-8):
    """费用回归 MAPE——必须剔除真实零费用样本,
    否则结构性零值(无该类服务)会把 MAPE 推向无穷大。"""
    mask = y_true > 0
    return float(np.mean(np.abs((y_true[mask] - y_pred[mask]) /
                                (y_true[mask] + eps))) * 100)

§6.10 MLOps 笔记

  1. 数据版本:以样本号 + 文件 manifest(文件名/行数/大小)作为数据版本锚点;DE-SynPUF 为静态终版(DE1.0,Not updated[5]),风险在分发瑕疵而非更新漂移(坑点 7)。
  2. 合成声明入 metadata:把"fully synthetic"写入模型卡与数据卡,防止下游误用作真实性能证据。
  3. 迁移检查点:记录从合成到真实数据的特征清单差异(ICD-9 vs ICD-10、费用口径),迁移时逐项对照。
  4. 管线冒烟测试:CI 中固定跑 Sample 1 的"读入-链接-汇总"断言(行数、ID 唯一性、金额非负),防止 ETL 回归。

§6.11 快问快答(FAQ)

  • Q:需要注册、申请或签数据使用协议吗?
    A:不需要。DE-SynPUF 为公有领域(Public Domain)公开使用文件,无需注册即可直链下载[1][4]。
  • Q:只处理一个样本够用吗?
    A:多数开发场景够用。官方设计即支持按需读取任意样本子集[1];单样本约 11.6 万受益人(§3.2b),可独立完成"受益人-理赔-处方"全链路开发。
  • Q:为什么 2010 年的记录数明显少于 2008/2009?
    A:官方说明系死亡损耗与披露处理的影响[1],属结构性现象而非数据缺陷(坑点 6)。
  • Q:能在论文中下结论说"Medicare 人群的糖尿病患病率是 X%"吗?
    A:不能。官方明确声明因合成处理,该数据对真实 Medicare 人群的推断研究价值非常有限[1][2];患病率结论需真实数据(如 LDS 或学术申请数据)。
  • Q:DESYNPUF_ID 能关联回真实患者或 CMS 其他数据吗?
    A:不能。DESYNPUF_ID 专为 DE-SynPUF 创建,不含任何患者信息,且与真实 CMS 受益人无对应关系[1]。
  • Q:官方提供 Python/SQL 读入工具吗?
    A:官方仅提供 SAS 读入程序(可自动合并 Carrier 1A/1B)[1];Python/DuckDB 路线见 §6.3 与 §6.3b,OMOP 版本由 AWS 托管[5],社区 ETL 参考 [7]。
  • Q:SP_ 慢病标志与理赔文件里的 ICD-9 码对不上是坏数据吗?*
    A:不是。标志由合成理赔过程按 CCW 算法生成,判定窗口与合成扰动都会造成记录级不一致(坑点 5)[2]。
  • Q:数据以后会更新到 2010 年以后吗?
    A:不会。DE1.0 为终版,AWS OMOP 镜像状态标注 Not updated[5];后续年份请关注 CMS 其他公开文件。

§7 质量评估与局限性

§7.1 已知偏倚

偏倚类型 描述 严重程度 缓解
合成协变偏倚 种子-捐赠者混合改变变量间真实关联[2][6] 高 仅作方法演示;真实数据外部验证
抑制偏倚 k-匿名规则删除稀有记录与稀有诊断/操作码[2] 中 罕见事件分析一律降权或不做
年份流失偏倚 2010 记录数因死亡损耗与披露处理显著偏低[1] 中 人月归一 + 删失建模
覆盖偏倚 仅 FFS 理赔,不含 Medicare Advantage;源为 2008 年 5% 抽样 中 明确目标人群后再迁移
地理失真 州/县码被替换或随机抽取[2] 高(对地理任务) 禁止地理粒度分析
粒度偏倚 240→32(受益人)与 611→81(住院)变量削减[2] 中 按可用字段设计任务,不臆测缺失字段

§7.2 标注质量

11 项 SP_* 标志为算法生成的弱监督标签,无人工标注一致性可言;其"金标准"地位仅相对于真实 CCW 算法逻辑成立,且经合成扰动。年度费用字段由理赔汇总生成,官方附录 A 显示其与真实 5% 样本在分布层面接近[2]。建议将标签质量定位为"分布级可信、记录级不可信"。

§7.3 泛化性评估

目标场景 失效风险 证据
迁移到真实 Medicare 理赔 中-高:协变改变、ICD-9 时代差异 官方限制声明[1][2];claimsdb 警告[6]
迁移到 ICD-10 时代数据(2015 后) 高:编码体系变更 美国于 2015-10 切换 ICD-10,本数据止于 2010
迁移到非美国理赔体系(如 DRG/DIP) 高:字段语义不同 结构可类比,码表需重映射
软件工程/管线验证 低 官方设计目标即对齐 Limited Data Sets[1]
教学与竞赛 低 claimsdb、hackathon 等成熟案例[6][8]

§7.4 伦理考量

DE-SynPUF 是"隐私保护技术产物"而非"脱敏真实数据":它以真实受益人为种子,经多捐赠者混合、抑制、扰动与粗化后发布,且为公有领域。这带来独特伦理位置:使用者无需 IRB、无需 DUA,但误用风险反而更高——常见误用包括:(1) 在论文中把合成统计量当作真实 Medicare 人群结论发表;(2) 用合成数据训练面向患者的决策工具并暗示有真实证据支撑;(3) 将合成数据的费用分布用于现实定价或政策论证。本页 §7.1 与坑点 1 的所有缓解措施应视为使用义务而非可选建议。

§7.5 公平性

种族字段仅 4-5 个粗类且经扰动,性别仅二元;使用公平性指标(如分组 AUC)时结果只反映合成分布,不代表真实人群差异。若公平性是研究核心,应使用真实数据源,DE-SynPUF 仅可作方法调试。

§7.6 数据漂移

数据为静态快照(2008-2010 理疗理赔,Not updated[5]),不存在持续采集漂移;真正的"漂移"发生在迁移时:ICD-9→ICD-10(2015)、理赔制度与支付政策演变、人群结构老化。建议把 2008/2009/2010 三年间差异作为"受控漂移"样本,练习漂移检测流程(PSI、分布监控)。

§7.7 DAIMS 数据质量 24 项评估

# 检查项 状态 说明
1 宽格式 ✅ 全部文件为标准 CSV 宽表
2 唯一标识 ✅ DESYNPUF_ID 全局唯一、跨文件可链接[1]
3 特殊字符 ⚠️ ID 含字母数字混排;日期为 YYYYMMDD 字符串需显式解析
4 重复行 ⚠️ 受益人-年重复为结构性设计,须理解后聚合而非去重[3]
5 缺失编码 ✅ 空值语义规律清晰(死亡日期空=在世等)
6 标签标识 ✅ SP_* 前缀命名统一,语义明确
7 罕见类分组 ⚠️ k-匿名抑制使稀有码缺失,罕见类不可分析[2]
8 偏倚评估 ✅ 官方附录 A 提供与真实 5% 样本的系统对比[2]
9 数据字典 ✅ 用户手册 + Codebook + FAQ 三件套齐全[2]
10 信息性缺失解释 ⚠️ 死亡/ESRD 缺失语义明确,但部分字段未逐一说明
11 设备记录 ❌ 理赔数据无设备参数(模态属性,非缺陷)
12 共线性 ⚠️ MEDREIMB/BENRES/PPPYMT 三组费用存在会计恒等关系,建模需防共线
13 编码映射 ✅ ICD-9/HCPCS/NDC 为标准码表,可映射至 OMOP 词表[7]
14 时间戳处理 ✅ CLM_FROM/THRU_DT、SRVC_DT 全日期可解析
15 划分建议 ✅ 20 样本互斥结构天然支持无泄漏划分[1]
16 泄漏讨论 ✅ 官方样本设计 + 本页 §5.3 完整讨论
17 标签分布 ⚠️ 官方未发布逐项慢病率表,仅有附录 A 对比表
18 测量偏倚 ⚠️ 理赔=报账视角,未报账疾病不可见
19 外部验证建议 ✅ 官方与社区均给出向真实数据的迁移路径[1][5]
20 版本记录 ✅ DE1.0 单版本文档日期明确(2013-01-15)[2]
21 预处理脚本 ⚠️ 官方仅 SAS 读入程序,无 Python 参考实现(本页 §6.3 补足)
22 合规要求 ✅ 公有领域,无使用协议负担
23 多模态对齐 ✅ 五类文件经 DESYNPUF_ID 严格可链接[1]
24 去标识化 ✅ 全合成 + 专建加密标识,隐私风险最低等级[2]

DAIMS 评分:19.0 / 24(15 项 ✅ ×1 + 8 项 ⚠️ ×0.5 + 1 项 ❌ ×0)

评分解读:19.0/24 在公开医疗数据中属于第一梯队。扣分集中在三点:理赔数据固有视角(设备记录、测量偏倚)、合成处理引入的罕见类与分布失真、以及官方工程支持停留在 SAS 时代。这些扣分项大多可通过本页 §6 的参考实现与使用纪律对冲。

对你意味着什么:(1) 你可以放心把它当"结构真实"的理赔数据做一切工程与教学活动——链接、转换、建模管线全部成立;(2) 任何将进入论文或产品的数字结论,必须走"合成预演 → 真实复算"两步流程;(3) 涉及稀有疾病、地理分析、精确时间间隔的任务,请直接换真实数据源,本数据集会在这些维度误导你。

§7.8 外部验证矩阵

外部数据集/场景 来源机构 评估任务 性能指标 相对内部变化 关键发现
真实 Medicare 5% 受益人样本 CMS(官方附录 A) 理赔分布/人口学/慢病分布/费用结构对比 分布级一致性 记录级不可比(合成) 官方确认分布接近,但明确否认记录级与研究级推断价值[2]
住院费用分类算法研究 学术应用(PLOS Digital Health 综述收录) 住院费用预测的多分类算法测试 算法间相对比较 未报告真实数据对照 DE-SynPUF 被用作费用预测算法的测试床[4]
异常活动检测框架 学术应用(综述收录) 特定患者群异常检测 方法学演示 未报告真实数据对照 验证理赔异常检测框架可行性[4]
多数据模型查询测试 学术应用(综述收录) OMOP 等多 CDM 查询方法学 查询一致性 工程级验证 验证跨 CDM 查询工具链[4]
Leeds Data & AI Hackathon 2026 University of Leeds PDE 续药风险/推荐 PR-AUC、Recall@K 竞赛口径 展示 PDE 时序任务的标准做法(时序划分)[8]

§8 基准表现与生态

§8.1 应用全景与"排行榜"说明

DE-SynPUF 不是竞赛基准数据集,没有统一测试集、固定指标与官方排行榜;各研究的任务定义、子集规模与划分方式互不相同,任何跨研究数值比较都无意义。下表按任务类别收录有据可查的代表性应用(不并列性能名次):

任务类别 代表应用 产出方 关键技术/做法 完整引用 代码可得性
费用预测 住院费用增加者的分类算法测试 学术研究(综述收录) 多分类算法横向比较 Gonzales S, Guruswamy G, Smith SR. Synthetic data in health care: a narrative review. PLOS Digital Health. 2023;2(1):e0000082. doi:10.1371/journal.pdig.0000082[4] 未公开
异常检测 特定患者群异常活动检测框架 学术研究(综述收录) 理赔模式异常框架 同上[4] 未公开
数据互操作 多数据模型查询方法学测试 学术研究(综述收录) 跨 CDM 查询 同上[4] 未公开
CDM 转换 DE-SynPUF → OMOP CDM v5 全量 ETL 社区开源 Python 流水线,全量约 2 小时 saywurdson. dec-etl-project. GitHub. https://github.com/saywurdson/dec-etl-project[7] 开源
教学/续药风险 PDE 晚续药预测与序贯推荐 Leeds Data & AI Hackathon 2026 SRVC_DT+DAYS_SUPLY_NUM 窗口、时序划分、PR-AUC luisacutillo78. DATA-AI-Hackathon-Track-1. GitHub. https://github.com/luisacutillo78/DATA-AI-Hackathon-Track-1[8] 开源

§8.2 任务选型建议

在本数据集上"刷分"没有意义,选型建议按目的分三档:(1) 工程验证——任何能跑通五类文件链接的管线即达标;(2) 方法演示——选择对协变失真稳健的任务(分类优于精确回归,聚合指标优于记录级指标);(3) 迁移准备——把超参数与特征清单做成可配置资产,真实数据到位后一键重训。避免在合成数据上追求 SOTA 数字:这是官方与社区的一致立场[1][6]。

§8.3 评测协议建议

若需公开可比较的结果,建议协议:固定使用 Sample 1-14 训练、15-17 验证、18-20 测试(或声明等价的按样本划分);报告 AUROC/AUPRC(分类)与人月归一后的费用 MAE(回归);声明"fully synthetic data, no real-world inference"。

数据集 关系 模态 许可/获取
Synthea/SyntheticMass 并列的公开合成健康数据代表[4] 合成 EHR(FHIR) 开源生成器+公开数据
SynPUF-OMOP(AWS Open Data) 本数据集的 CDM 衍生版[5] OMOP CDM 匿名 S3 访问
Medicare Claims SynPUF(新版) CMS 后续合成数据产品 合成理赔(新变量体系) ResDAC 渠道
Blue Button 2.0 Sandbox CMS 合成 FHIR 沙箱(约 3 万受益人)[4] FHIR 理赔 沙箱注册
MIMIC-III/IV 真实 EHR 数据(互补视角) ICU EHR 凭证化申请

§8.5 关键文献 Top 5

  1. Centers for Medicare & Medicaid Services. CMS Linkable 2008-2010 Medicare Data Entrepreneurs’ Synthetic Public Use File (DE-SynPUF) User Manual. 2013-01-15. https://www.cms.gov/Research-Statistics-Data-and-Systems/Downloadable-Public-Use-Files/SynPUFs/Downloads/SynPUF_DUG.pdf — 官方权威文档:规模、方法与局限的唯一一手来源[2]。
  2. NORC at the University of Chicago. Access to Medicare Claims Data Increased With Release of the DE-SynPUF by CMS. 2013-02-11 新闻稿. https://norc.org/research/library/access-to-medicare-claims-data-increased-with-release-of-the-dat.html — 发布背景与制作方(NORC+IMPAQ)的一手记录[1]。
  3. Gonzales S, Guruswamy G, Smith SR. Synthetic data in health care: a narrative review. PLOS Digital Health. 2023;2(1):e0000082. doi:10.1371/journal.pdig.0000082 — 将 DE-SynPUF 列为代表数据集并系统梳理其应用与局限的同行评审综述[4]。
  4. Sahni GR, et al. (临床预测工具数据与算法专题). Clinical prediction tool pitfalls and considerations: Data and algorithms. Journal of Surgical Research. 2023. doi:10.1016/j.jss.2023.08.024 — 以 DE-SynPUF 为理赔合成数据示例讨论"合成数据用于训练准备而非直接部署"[11]。
  5. Fangmeier J. claimsdb: Relational Data from the CMS DE-SynPUF for Learning and Teaching. GitHub/R 包. https://github.com/jfangmeier/claimsdb — 提供教学子集与字段 schema 的社区标准包[6]。

§8.6 社区活跃度

DE-SynPUF 的社区活动集中在三处:OHDSI 生态(官方 OMOP 版本与 ETL 规范,AWS 长期托管[5]);教学工具链(R 包 claimsdb、SAS 社区脚本、DuckDB 教程[6][12]);数据科学竞赛与课堂(大学 hackathon 与健康服务研究课程)。CMS 官方对该数据集的支持停留在文档层面(FAQ + 手册),无活跃论坛;新问题一般绕道 OHDSI 论坛或 GitHub issue 解决。

§8.7 生态快照

资源 类型 链接 状态(截至 2026-09) 推荐理由
CMS 官方页与 20 样本下载 官方数据 官方页 可下载(DE1.0 终版) 一手数据与文档
SynPUF_DUG.pdf 用户手册 官方文档 PDF 在线可读 方法与局限唯一权威来源
SynPUF-OMOP AWS Open Data registry.opendata.aws Not updated(托管稳定) OMOP 生态即插即用[5]
claimsdb R 教学包 GitHub 社区维护 500 受益人子集即装即用[6]
dec-etl-project Python ETL GitHub Python 3.11 兼容 CDMv5 转换参考实现[7]
milwaukeedata/desynpuf 社区数据镜像 GitHub 历史项目(曾跳过损坏样本 11/17) 批处理脚本参考[10]
utl-Medicare-SynPUFs SAS 工具集 GitHub 社区脚本 SAS 读入与字段精度参考[12]

§9 相关资源与引用

§9.1 官方资源清单

§9.2 BibTeX 完整引用

@manual{cms_desynpuf_2013,
  title  = {Centers for Medicare and Medicaid Services (CMS) Linkable 2008-2010
            Medicare Data Entrepreneurs' Synthetic Public Use File (DE-SynPUF)
            User Manual},
  author = {{Centers for Medicare \& Medicaid Services}},
  year   = {2013},
  month  = {January},
  url    = {https://www.cms.gov/Research-Statistics-Data-and-Systems/Downloadable-Public-Use-Files/SynPUFs/Downloads/SynPUF_DUG.pdf}
}

@article{gonzales_2023_synthetic,
  title   = {Synthetic data in health care: A narrative review},
  author  = {Gonzales, Stephanie and Guruswamy, Ganesan and Smith, Alexander R.},
  journal = {PLOS Digital Health},
  volume  = {2},
  number  = {1},
  pages   = {e0000082},
  year    = {2023},
  doi     = {10.1371/journal.pdig.0000082}
}

@misc{norc_2013_release,
  title       = {Access to Medicare Claims Data Increased With Release of the
                 Data Entrepreneurs' Synthetic Public Use File (DE-SynPUF) by the
                 Centers for Medicare and Medicaid Services (CMS)},
  author      = {{NORC at the University of Chicago}},
  year        = {2013},
  month       = {February},
  howpublished = {Press release},
  url         = {https://norc.org/research/library/access-to-medicare-claims-data-increased-with-release-of-the-dat.html}
}

@misc{aws_synpuf_omop,
  title        = {CMS 2008-2010 Data Entrepreneurs' Synthetic Public Use File
                  (DE-SynPUF) in OMOP Common Data Model},
  author       = {{OHDSI community, hosted on AWS Open Data}},
  year         = {2021},
  howpublished = {Amazon S3, registry of open data},
  url          = {https://registry.opendata.aws/cmsdesynpuf-omop/}
}

@misc{fangmeier_claimsdb,
  title        = {claimsdb: Relational Data from the CMS Data Entrepreneurs'
                  Synthetic PUF for Learning and Teaching},
  author       = {Fangmeier, Josh},
  howpublished = {R package},
  url          = {https://github.com/jfangmeier/claimsdb}
}

§9.3 引用指南

学术论文引用本数据集时,推荐主引 CMS 用户手册(@cms_desynpuf_2013),综述语境补引 Gonzales 2023(@gonzales_2023_synthetic);使用 OMOP 版本时补引 @aws_synpuf_omop;使用教学子集时补引 @fangmeier_claimsdb。正文务必同时声明数据为全合成数据、不可用于真实人群推断。

§9.4 术语表

术语 全称 / 含义
CMS Centers for Medicare & Medicaid Services,美国联邦医保与医助服务中心
Medicare 美国联邦医疗保险,覆盖 65 岁以上老人与特定残障/ESRD 人群
Part A / Part B 住院保险 / 医疗保险,分别对应覆盖月数字段 BENE_HI/SMI_CVRAGE_TOT_MONS
Carrier Claims 医生与供应商按服务付费理赔(Part B 的 physician/supplier 账单)
PDE Prescription Drug Event,Part D 处方事件
CCW Chronic Condition Warehouse,CMS 慢病标志算法仓库
LDS Limited Data Sets,CMS 提供的去标识真实理赔数据集
NPI National Provider Identifier,医生/机构 10 位标识(不对应真实人员)
NDC-11 11 位国家药品代码(PDE 的 PROD_SRVC_ID)
HCPCS Healthcare Common Procedure Coding System,服务/操作编码
ICD-9-CM 本数据集诊断(DGNS)与操作(PRCDR)码所用版本
MS-DRG Medicare Severity Diagnosis Related Groups,住院分组(CLM_DRG_CD)
ESRD End Stage Renal Disease,终末期肾病(BENE_ESRD_IND)
Hot-deck imputation 热卡插补,本数据集 seed-donor 合成法的核心机制
k-匿名 k-anonymity,披露控制策略:稀有记录被抑制或合并
粗化 Coarsening,金额/日期等连续量按区间或粒度扰动
行项目 Claim line item,一条 Carrier 理赔内最多 13 个服务明细行

§10 AI 使用声明卡

§10.1 AI 模型列表

本页面由千方病案医数集生产管线生成,写作阶段使用大语言模型(CodeBuddy Code,fast-model)辅助完成结构撰写、代码示例与语言润饰。

§10.2 AI 参与范围

AI 参与:资料检索归纳、章节初稿、代码模板编写、表格整理与语言统一。AI 不参与:事实终审(所有硬数字需回溯至检索来源)、医学与数据工程交叉审核、发布决策。

§10.3 输入来源列表(本页事实依据)

  1. Centers for Medicare & Medicaid Services. CMS 2008-2010 Data Entrepreneurs’ Synthetic Public Use File (DE-SynPUF). https://www.cms.gov/Research-Statistics-Data-and-Systems/Downloadable-Public-Use-Files/SynPUFs/DE_Syn_PUF.html
  2. CMS. DE-SynPUF User Manual (DE1.0), 2013-01-15. https://www.cms.gov/Research-Statistics-Data-and-Systems/Downloadable-Public-Use-Files/SynPUFs/Downloads/SynPUF_DUG.pdf
  3. CMS. 2008-2010 Data Entrepreneurs Synthetic PUF Download Page (DE1.0 Sample 11). https://www.cms.gov/Research-Statistics-Data-and-Systems/Downloadable-Public-Use-Files/SynPUFs/DESample11.html
  4. Gonzales S, Guruswamy G, Smith SR. Synthetic data in health care: a narrative review. PLOS Digital Health. 2023;2(1):e0000082. https://dx.plos.org/10.1371/journal.pdig.0000082
  5. AWS Open Data Registry. CMS DE-SynPUF in OMOP Common Data Model. https://registry.opendata.aws/cmsdesynpuf-omop/
  6. Fangmeier J. claimsdb(R/data.R 与 README). https://rdrr.io/github/jfangmeier/claimsdb/src/R/data.R
  7. saywurdson. dec-etl-project(SynPUF→CDMv5 ETL). https://github.com/saywurdson/dec-etl-project
  8. luisacutillo78. DATA-AI-Hackathon-Track-1(Leeds 2026). https://github.com/luisacutillo78/DATA-AI-Hackathon-Track-1
  9. Open Big Data 目录条目(首发日期 2011 记录). https://openbigdata.org/resource/cms-de-synpuf-2008-2010-synthetic-medicare-beneficiary-claims-and-prescription-event-records-from-2008-2010
  10. milwaukeedata/desynpuf 社区镜像 README. https://github.com/milwaukeedata/desynpuf
  11. Journal of Surgical Research. Clinical prediction tool pitfalls and considerations: Data and algorithms. 2023. https://www.journalofsurgicalresearch.com/article/S0039-6060(23)00498-1/fulltext
  12. rogerjdeangelis. utl-Medicare-Claims-Synthetic-Public-Use-Files-SynPUFs(SAS 读入参考). https://github.com/rogerjdeangelis/utl-Medicare-Claims-Synthetic-Public-Use-Files-SynPUFs
  13. NORC at the University of Chicago. DE-SynPUF 发布新闻稿, 2013-02-11. https://norc.org/research/library/access-to-medicare-claims-data-increased-with-release-of-the-dat.html
  14. PMC Table 2(合成数据集特征汇总). https://pmc.ncbi.nlm.nih.gov/articles/PMC9931305/table/pdig.0000082.t002/
  15. CMS 新版下载中心(Sample 1 文件列表与直链). https://www.cms.gov/data-research/statistics-trends-and-reports/medicare-claims-synthetic-public-use-files/cms-2008-2010-data-entrepreneurs-synthetic-public-use-file-de-synpuf/de10-sample-1

§10.4 人工校验记录

内容模块 审核者 审核方式 审核状态
§1 概览与版本时间轴 千方病案医学编辑部 数字逐项回溯 CMS 官方页与 NORC 新闻稿 ✅ 已通过
§2 医学背景(ICD-11/SNOMED 映射) 千方病案医学编辑部 对照 ICD-11/SNOMED CT 标准术语表逐码核对 ✅ 已通过
§3-§4 规格、目录树与字段字典 千方病案医学编辑部 对照官方用户手册 §4 变量表与 Codebook ✅ 已通过
§5 划分策略与泄漏清单 千方病案医学编辑部 按官方 20 样本设计复核 ✅ 已通过
§6 预处理代码与 8 坑点 千方病案医学编辑部 代码走查 + 坑点来源回溯(官方文档/社区项目) ✅ 已通过
§7 DAIMS 24 项与偏倚分析 千方病案医学编辑部 逐项对照官方局限声明与社区证据 ✅ 已通过
§8-§9 生态与引用 千方病案医学编辑部 链接可达性与 BibTeX 格式核查 ✅ 已通过
frontmatter 与 JSON-LD 千方病案医学编辑部 与 schema_org 序列化一致性比对 ✅ 已通过

§10.5 AI 生成章节标注

本页全部章节均由 AI 辅助生成初稿,经人工交叉审核后发布;无纯人工撰写或纯 AI 直发的章节。

§10.6 最后人工审核日期

2026-09-05(与 §0.3 审核日期一致)

页面状态:published(全部内容已完成审核并发布)


相关数据集导航

以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:

  • meps — 共享标签:公共卫生与流行病学 / 医保理赔 / 卫生服务研究
  • cms-medicare-lds — 共享标签:公共卫生与流行病学 / 医保理赔 / 卫生服务研究
  • healthdata-gov — 共享标签:公共卫生与流行病学 / 医保理赔
  • optum-clinformatics — 共享标签:公共卫生与流行病学 / 医保理赔 / 卫生服务研究
  • hcup-nis — 共享标签:医保理赔 / 卫生服务研究
  • who-gho — 共享标签:公共卫生与流行病学 / 卫生服务研究
  • mdvr-kcl — 共享标签:公共卫生与流行病学 / 卫生服务研究
  • nhis-nhid — 共享标签:公共卫生与流行病学 / 医保理赔 / 卫生服务研究
  • marketscan — 共享标签:公共卫生与流行病学 / 医保理赔 / 卫生服务研究
  • seer-medicare — 共享标签:公共卫生与流行病学 / 医保理赔 / 卫生服务研究

导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

返回 AI-Ready 数据集