信息速览
美国医院每年要向联邦医疗保险提交一份成本报告。这份报告不是账单,也不是病历,而是一整套按科室、按成本中心铺开的年度账:急诊多少人、病房住了多少天、洗衣房花了多少、护士工资多少、慈善医疗做了多少、年底账上还剩多少现金。三十年来,这些报告被收进同一个库,也就是 HCRIS。
它的价值不在于"大"。以行数论,一个财年的数据解压后也不过千万行级别;以字段论,绝大部分内容是一家医院的内部会计科目。真正稀缺的是它的计量单位:一家医院的一个财年。全美没有第二个公开数据源,能长期、统一、按同一套科目把成本和服务量钉在同一家机构身上。
所以要读它,先要把"机构"和"人"这两把尺子分开。下面这张表先给出规模、结构与边界的骨架,细节留到后面各节,一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 全称 | Healthcare Cost Report Information System(HCRIS),医院子集常称 Hospital Provider Cost Report |
| 维护机构 | 美国联邦医疗保险与医疗补助服务中心(CMS) |
| 计量单位 | 医院 × 财年(医院-财年),不是患者、不是就诊、不是理赔 |
| 覆盖机构 | 每个财年约六千家持有 CMS 认证号(CCN)的医院 |
| 年份跨度 | 原始文件自 1996 财年起;官方抽取版自 2011 财年起 |
| 报表代际 | 2552-96(1996–2011 财年)与 2552-10(2010 财年至今)并行两年 |
| 核心容器 | 报告表 RPT、数值表 NMRC、字母数值表 ALPHA,另有汇总表 Rollup |
| 数据形态 | 长表:工作表代码 + 行号 + 列号 + 值,需自行透视 |
| 工作表 | A 试算与成本中心、B 工资指数、C 成本分摊、D 结算、E 上年调整、G 财务报表、S 系列机构特征与未补偿医疗 |
| 字段规模 | 工作表代码逾千个,唯一行列组合超过二十万个 |
| 文件体积 | 单个财年压缩包约百兆,解压后可超过一吉字节 |
| 更新节奏 | 每季度入库、按财年打包发布,最新一版发布于 2026 年 10 月 |
| 许可 | 公有领域,免费下载,无需注册 |
| 主要替代品 | 官方抽取版宽表、NBER 整理版、商业整理版 |
| 最强用途 | 医院财务压力、成本收费比、未补偿医疗、机构层面的成本与服务量对照 |
§1 它要解决的具体麻烦
1.1 一个所有人都想知道、却没人公开的答案:一家医院到底花多少钱
医院的价格是公开的,医院的收费单是公开的,医院从医保拿到的钱在部分文件里也能查到,但"这家医院提供这些服务花了多少成本"长期是一个黑箱。原因很实在:成本是医院的内部会计信息,散在总账、科室账、工资表、折旧表里,没有任何一条对外披露义务要求它按统一科目公开。
HCRIS 就是那个例外。它把"成本核算"这件事变成了法定义务:凡参加 Medicare 的医院,每个报告期都要按 CMS 规定的表单,把试算平衡表拆到几十个成本中心,把每个成本中心的直接成本、间接成本、可报销比例算清楚,再连同床位、床日、出院人次、工资、全职当量人数一起报上去。这套表单不是为了统计而设计,是为了付钱而设计——Medicare 按成本报销的部分,靠这份报告结算。
于是出现一个有意思的副产品:一份原本只服务于支付方的会计文件,变成了学术界唯一能长期追踪医院成本的公开数据。研究医院利润率的、研究乡村医院倒闭风险的、研究并购后价格变化的、研究慈善医疗是否兑现的,最后都会回到这里。原因不是它好用,而是没有第二个。
1.2 三条常见的错误期待
第一条,把它当成"医院的账本复印件"。它不是。成本报告是一份按规定科目重排过的报表,医院内部管理会计的科目与 CMS 的成本中心并非一一对应,很多医院要在填报时做映射。你看到的是"按 CMS 语言翻译过的成本",不是医院自己看的成本。
第二条,把它当成"全美医疗机构名录"。它只收参加 Medicare 并且需要提交成本报告的机构。联邦系统的医院(如退伍军人医疗系统)不在其中,只看门诊的独立诊所不在其中,很多不涉住院支付的机构也不在其中。用它算"全美医院总数",得到的会是一个偏低的数。
第三条,把它当成"财务真相"。它是自报数据,主要校验发生在结算环节,且只针对可报销成本。一间医院把管理费用分摊到哪个成本中心,把多少成本记为慈善医疗,很大程度上是会计判断。跨医院比较时必须假定口径一致,而这个假定只在同一代表单、同一年份、同一类机构内部才勉强成立。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 一家医院某年的总成本、总收费、净患者收入 | 直接给,按成本中心还给明细 | 够 |
| 一家医院某年的床位、床日、出院人次、按付款方拆分 | 给,且与成本同表 | 够,这是它最独特的地方 |
| 成本收费比(CCR) | 可从工作表算出,官方抽取版也有现成列 | 够 |
| 慈善医疗与坏账 | 工作表 S-10 给成本口径,早期年份缺失严重 | 部分年份够 |
| 一家医院的利润率 | 给分子分母,但分母口径要自己选 | 够,前提是先定口径 |
| 单个患者的费用与结局 | 完全没有 | 不够,且永远不会有 |
| 单次就诊的诊断、操作、药品 | 完全没有 | 不够 |
| 医院集团(母公司)层级 | 只有机构认证号与一个自由文本的总部名 | 不够,需外部对照表 |
| 医生个人或人员名单 | 公开文件里没有 | 不够 |
| 医院服务质量、再入院、星级 | 不在本库,属另一类数据集 | 不够 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 要评估一批医院三年内的财务恶化速度 | 提供逐年的成本、收入、床日,可算利润率与周转 | 先固定分母口径,再决定是否并入非患者收入 |
| 要研究乡村医院关闭前的共同特征 | 关闭前后都有报告,形成天然的前后对照 | 用认证号对齐机构名录,确认关闭年份 |
| 要给一个成本模型找机构级标定值 | 按成本中心给成本与服务量,可直接算单位成本 | 注意成本中心口径随代际变化,跨代际需映射 |
| 要检验某地慈善医疗承诺是否兑现 | 工作表 S-10 给慈善医疗成本与坏账 | 先确认该州是否在 S-10 强制填报范围内 |
| 要把医院财务与服务量放进同一个模型 | 两者在同一行、同一机构、同一财年 | 直接可用,无需外部连接键 |
| 要做患者层面的费用预测 | 帮不上,粒度不对 | 改用理赔或病历数据,把它当机构侧特征 |
| 要比较不同国家的医院成本 | 只覆盖美国,且科目体系是美国支付制度的产物 | 换国际口径数据,或只做方法参照 |
1.5 一句话判断
它是唯一能把"这家医院花了多少"和"这家医院做了多少"写在同一行里的公开数据;代价是这一行只代表一家机构的一年,不代表任何一个人。
1.6 不适合谁:四条边界
第一条边界是粒度。任何以患者、以就诊、以处方为单位的问题,都不该从这里开始。它的最小单位是一家医院的一个报告期,往下再拆不存在。
第二条边界是准时性。报告期结束后数月才填报,入库还要再等,最新财年在很长一段时间里只是部分机构的部分数据。做当年监测的,用它必然滞后。
第三条边界是可比性。跨机构比较依赖"成本中心分摊规则一致"这个强假定,而分摊规则在代际之间改过,在同一代际内也允许医院按自身情况处理。比较的组越杂,误差越大。
第四条边界是覆盖。它不是全美医疗机构的全集,只是"参加 Medicare 且需提交成本报告的机构"这一子集。用它做分母统计机构数量,会系统性偏低。
§2 数据构成与规格
2.1 一个压缩包里到底装了什么
官方发布方式是按财年打包:一个财年一个压缩文件,医院的两代表单各有一条独立的文件序列。包内不是一张宽表,而是四类表:
| 表 | 内容 | 粒度 | 主键 |
|---|---|---|---|
| 报告表(RPT) | 报告元数据:机构号、报告期起止、表单版本、处理状态 | 一行一份报告 | 报告记录号 |
| 数值表(NMRC) | 数值型工作表数据 | 一行一个"工作表-行-列"位置 | 报告记录号 + 三元组 |
| 字母数值表(ALPHA) | 文本型工作表数据 | 同上 | 同上 |
| 汇总表(Rollup) | 官方预先算好的常用指标 | 一行一个指标 | 报告记录号 + 指标名 |
这个设计有一个直接后果:你想要的"总成本"不是一个字段,而是一个坐标。它在某张工作表的某一行、某一列。要把它变成一列数据,必须先知道坐标,再做透视。这就是为什么几乎所有使用者都会先写一段脚本,把长表转成宽表——不转就没法做任何统计分析。
另一层后果是体量。单个财年的压缩包约百兆,解压后超过一吉字节,其中绝大部分是数值表与字母数值表的长表行。这也是为什么官方另出一个抽取版:把最常用的几十个坐标提前取出来,拼成一行一家医院。
2.2 字段与记录的完整字典
下表给出报告级字段与最常用的工作表坐标。坐标写法为"工作表-行-列",实际文件里是三个独立字段,这里合并书写以便阅读。
| 字段或坐标 | 含义 | 所在位置 | 使用注意 |
|---|---|---|---|
| 报告记录号 | 一份报告的唯一编号 | 报告表 | 跨表连接的唯一键,不是机构号 |
| 机构认证号(CCN) | 医院在 Medicare 的六位认证号 | 报告表 | 第六位含机构类型信息,前两位是州码 |
| 报告期起始日 | 财年开始日 | 报告表 | 各机构不统一,常见非日历财年 |
| 报告期截止日 | 财年结束日 | 报告表 | 做年度对齐必须用它,不能用发布年份 |
| 表单版本 | 2552-96 或 2552-10 | 报告表 | 决定列号宽度与成本中心编码规则 |
| 处理状态 | 已结算、已修改、已重报等 | 报告表 | 同一报告期可能多行,需去重 |
| 工作表代码 | 如 A、G、S-10 等 | 数值表与字母数值表 | 千余个代码,需查组合清单 |
| 行号 | 工作表内的行 | 同上 | 96 版成本编码表已换成成本中心码 |
| 列号 | 工作表内的列 | 同上 | 96 版四位、10 版五位 |
| 数值 | 该坐标的数值 | 数值表 | 单位不统一:美元、天数、人次混排 |
| 字母数值 | 该坐标的文本 | 字母数值表 | 10 版的成本中心名称就存在这里 |
| A 表合计 | 可报销成本总额 | A 表尾行 | 与 G 表总费用的差异是常见困惑点 |
| 床位与床日 | 总床位、可用床日 | S-3 与 A 表 | 床日分母要与成本同期间 |
| 住院日与出院人次 | 按付款方拆分 | S-3 | 付费方口径跨年有调整 |
| 总收费 | 毛收费(挂账价) | C 表与 G 表 | 不是收入,不能当收入用 |
| 净患者收入 | 扣减后的患者收入 | G-3 | 不含非患者收入 |
| 总运营费用 | 运营口径的费用合计 | G-3 | 与 A 表可报销成本不同口径 |
| 慈善医疗成本 | 按成本计的慈善医疗 | S-10 | 2010 年后才有,早期缺失多 |
| 坏账 | 计为坏账的应收 | S-10 与 A 表 | 与慈善医疗分开,不可相加当同一概念 |
| 工资总额 | 全院工资 | S-3 与 A 表 | 含与不含福利是两个口径 |
| 全职当量人数 | 自有员工折算人数 | S-3 | 不含合同工,与人事数据不同 |
| 总资产与基金余额 | 资产负债表科目 | G 表 | 只有部分机构填全 |
2.3 一条记录的完整解剖
一份报告在文件里是这样落地的:报告表里一行元数据,然后数值表与字母数值表里各自几十到几千行长表记录。下面是一份虚构但结构完全真实的片段。
#-- 报告表 RPT:一家医院的一个报告期
RPT_REC_NUM PRVDR_NUM FY_BGN_DT FY_END_DT RPT_STUS FORM
000123456 131234 2022-07-01 2023-06-30 1 2552-10
#-- 数值表 NMRC:只列四个坐标,实际每份报告有上千行
RPT_REC_NUM WKSHT_CD LINE_NUM CLMN_NUM VALUE
000123456 G300000 00100 00100 48215000 #-- 净患者收入(美元)
000123456 G300000 00400 00100 51980000 #-- 总运营费用(美元)
000123456 S300001 00100 00100 412 #-- 总床位(张)
000123456 S300001 00200 00100 118340 #-- 年度住院日(天)
#-- 字母数值表 ALPHA:同一坐标位置也可能有文本
RPT_REC_NUM WKSHT_CD LINE_NUM CLMN_NUM VALUE
000123456 A000000 00100 00000 急诊科 #-- 10 版用此记录成本中心名称
三个细节值得记住。第一,连接键是报告记录号,不是机构号:同一家医院跨年会有不同的报告记录号,做面板要先按机构号与报告期重建索引。第二,数值与文本分表存放,同一坐标两侧都可能有值,取数时不能只看一张表。第三,代码块里的坐标是示例,真实坐标必须查官方的工作表行列组合清单,凭记忆写坐标是最常见的静默错误来源。
2.4 规模核对:三个数字,三种口径
关于"有多大",常被引用的三个数字口径并不相同,混用会得出互相矛盾的结论。
| 口径 | 数值 | 含义 | 出处 |
|---|---|---|---|
| 机构规模 | 每财年约六千家医院 | 提交报告的机构数,含急症、关键准入、精神、康复、长期照护等 | 官方下载页未给统一数,第三方整理与文献描述一致 |
| 单年机构数(日历年口径) | 6,064 家 | 某商业整理版按日历年归并后的 2023 年机构数 | 整理方更新日志 |
| 机构规模(另一口径) | 约六千五百家 | 按"提交 Medicare 成本报告的医院"统计 | 州政策机构的项目说明 |
| 年份跨度(原始文件) | 1996 财年起 | 旧代表单的起始年 | 官方文件表 |
| 年份跨度(抽取版) | 2011 财年起 | 官方宽表的起始年,晚十五年 | 数据门户元数据 |
| 坐标规模 | 超过 200,000 个唯一行列组合 | 单是数值表的坐标数 | NBER 整理说明 |
| 工作表代码 | 千余个 | 含分表、子表、附表的代码总量 | NBER 整理说明 |
| 单包体量 | 约百兆压缩、解压超一吉字节 | 一个财年 | NBER 整理说明 |
三个口径的差额来源官方没有逐项说明:一是"机构"是否含关键准入与专科机构,二是按报告期还是按日历年归并,三是是否剔除当年未完成填报者。写论文时把口径写在脚注里,比追求一个"正确数字"更重要。
2.5 与同类资源的字段差异
同样描述医院,不同数据源给的字段几乎是互补而非重叠的。
| 资源类型 | 代表 | 粒度 | 有什么 | 缺什么 |
|---|---|---|---|---|
| 本库 | HCRIS | 医院-财年 | 成本、收费、净收入、床日、出院、工资、资产负债 | 患者、诊断、单次就诊 |
| 住院样本 | HCUP 各州住院数据库 | 出院人次 | 诊断、操作、费用、付款方、患者特征 | 医院真实成本、资产负债表 |
| 急诊样本 | HCUP 急诊数据库 | 就诊 | 就诊原因、处置、费用 | 医院成本、年度财务 |
| 支出面板调查 | 美国医疗支出面板调查 | 人-年 | 个人自付、保险、健康与利用 | 医院侧成本与财务 |
| 医保理赔 | Medicare 限用数据 | 理赔行 | 每一次服务、诊断、支付金额 | 医院真实成本、未补偿医疗 |
| 医院行政名录 | CMS 机构名录 | 机构 | 类型、地址、认证状态、所属集团 | 任何财务与利用率 |
| 国际统计 | OECD 卫生账户、WHO 全球卫生观察 | 国家-年 | 跨国可比的卫生支出与利用 | 机构级、成本中心级 |
这张表的用法很直接:需要"钱"的时候来这里,需要"人"的时候去理赔或病历,需要"机构身份"的时候去名录。三者用认证号连接,是本库最常用的组合方式。
§3 它是什么:身份层
3.1 一份法定义务,不是一次数据开放
HCRIS 的存在前提是支付制度。Medicare 对部分服务按成本补偿,要补偿就必须知道成本;要知道成本,就必须要求机构报账。成本报告因此是参与条件的一部分,而不是自愿提交的统计报表。这条性质决定了三件事:覆盖面由支付规则决定、字段由结算需要决定、时点由报告期决定。
也正因如此,它的"目录"其实是一张表单清单。官方页面按机构类型列出表单:医院旧版 2552-96 覆盖 1996 至 2011 财年,新版 2552-10 覆盖 2010 财年至今;护理机构、家庭健康机构、透析机构、临终关怀机构、社区健康中心、农村健康诊所、社区精神卫生中心、器官获取组织各有自己的表单序列与年份区间。做医院研究,只需要医院那两条序列。
3.2 两代表单:不是改名,是换了坐标系
2010 年的换代不是把表头换个名字。旧版把成本编码工作表的行号直接换成成本中心代码,新版保留行号,把"行号对应哪个成本中心"另存为一条字母数值记录;列号宽度从四位变五位;成本中心的分组也做过调整。这三处变化加在一起,意味着跨代际合并不能只是纵向拼接。
| 项目 | 2552-96(旧版) | 2552-10(新版) |
|---|---|---|
| 适用报告期 | 起始日早于 2010 年 5 月 1 日 | 起始日为该日及之后 |
| 官方文件覆盖 | 1996–2011 财年 | 2010 财年至今 |
| 列号宽度 | 四位 | 五位 |
| 成本编码行号 | 直接换成成本中心码 | 保留行号,另表映射 |
| 汇总表可靠性 | 官方认为不可靠 | 2014 年 4 月起提供官方汇总 |
| 坏账明细文件 | 官方曾单独发布 | 官方未发布,需自行从工作表取 |
| 填报说明书 | 第 36 章 | 第 40 章 |
两代在 2010 与 2011 两个财年并行,这是最容易被忽略的陷阱:如果同时下载两套文件并按年拼接,这两年会有一批医院被算两遍。正确做法是先按机构号与报告期去重,或在合并时以表单版本为优先规则二选一。
3.3 认证号是这个库的身份证
每家机构在库里的身份是一个六位认证号。它不只是编号:前两位标识州,第六位标识机构类型,中间位在部分州还编码了机构序列。这意味着很多机构类型信息可以直接从号码读出来,而不必依赖另一张名录。
但它也有明确的局限。认证号绑定的是"参与 Medicare 的机构",机构被收购、合并、拆分、改变类型时,号码可能保留、可能换发、可能作废。做机构层面的纵向研究,认证号必须与机构名录、并购事件表一起用,否则会把"换了老板的同一家医院"当成两家,或把"换了号码的同一家医院"当成消失。
3.4 报告期:一年不是日历年
成本报告的报告期由机构自己的财年决定,绝大多数医院用七月一日或一月一日为起点,也有用其他月份的。这带来两个后果:一是"2023 年数据"实际上混合了不同起止的报告期;二是同一个日历年里,不同医院的报告期长度可能不同(新开、关闭、改变财年时会出现短报告期)。
做时间序列时必须用报告期截止日对齐,并在方法里明确是按财年、按日历年归并,还是按"最近一个完整报告期"取数。这三种处理在同一批数据上会给出不同的一阶差分,尤其是转折年份。
§4 它的可信度从哪来:质量层
4.1 三层校验,三种强度
成本报告的可信度不是一个开关,而是三层不同强度的校验叠起来的。
| 校验层 | 做什么 | 强度 | 对使用者的意义 |
|---|---|---|---|
| 填报完整性校验 | 检查必填项、勾稽关系、合计是否等于分项之和 | 强 | 明显的算术错误会被拦下 |
| 结算审核 | 核对可报销成本、成本收费比、 disproportionate share 相关数据 | 强,但只针对结算相关字段 | 与钱直接相关的字段最可靠 |
| 统计口径复核 | 无系统复核 | 弱 | 分摊方法、慈善医疗认定基本靠自报 |
这张表解释了为什么同一个库里,有些字段好用得惊人,有些字段脏得惊人。凡进入结算公式的(可报销成本、成本收费比、出院人次),经过对抗性核对;凡只用于披露的(慈善医疗、坏账、资产负债表明细),基本是原样收录。
4.2 官方自己列出的已知问题
官方在成本报告页面上附了一份常见问题文档,说明数据文件与填报流程。官方同时明确表态:旧版的汇总表不可靠,新版的汇总表自 2014 年 4 月起才提供。这个表态很重要——它等于告诉使用者,1996 至 2013 年间的"现成汇总指标"没有官方背书,要么自己从工作表算,要么用第三方整理版并注明来源。
另一个官方层面的诚实之处是坏账文件的处理:旧版曾单独发布坏账明细,新版没有发布,只留下了从工作表取数的路径。这意味着跨代际的坏账序列在 2010 年前后不是同一个东西,直接相接会产生一个假的断点。
4.3 案例:一家关键准入医院的三个财年
设想一家中西部关键准入医院,四十张床位,认证号以州码开头、以类型位结尾。它在库里连续三年有完整报告。把它当作贯穿全文的例子,能看清这套数据真正的用法与真正的边界。
第一年,它的总运营费用略高于净患者收入,差额由一笔来自地区的补助填平;第二年,门诊量上升而住院日下降,总成本几乎不变,单位床日成本因此明显上升;第三年,它把一部分原来记在急性护理成本中心的费用改记到摇摆床,导致两个成本中心的成本同时跳变,而全院总成本只动了很小的幅度。如果只看全院合计,这三年几乎是一条平线;如果看成本中心,会看到两次结构性重排。
这个案例说明三件事。成本中心级的明细比全院合计更接近真相,但也更容易被分摊规则干扰。慈善医疗与坏账在同一家机构内部可以互相替代(把一笔应收划为慈善还是坏账,结果对报表影响很大),跨机构比较时这个自由度会被放大。以及,短报告期与财年变更会让某一年的数字看起来异常,这通常不是数据错误,而是期间长度不同。
§4.3 的案例在后面还会出现两次:一次在取数层,说明如何用认证号把三年接成面板;一次在质量层,说明为什么这家医院的成本收费比不能直接与其他州比较。
4.4 三处必须自己验证的地方
第一处是合计的勾稽。A 表的可报销成本合计与 G 表的总费用合计不是同一个概念,两者差额来自不可报销项目与统计口径差异。用哪个当"总成本",会直接影响利润率的分子。
第二处是成本中心的口径漂移。同一家医院在不同年份把同一笔费用记在不同成本中心,是常见现象,尤其在换财务系统或换外包服务商之后。做成本中心级的纵向比较,必须先检查该机构的分摊表是否连续。
第三处是报告状态。同一报告期可能存在原始申报、修正申报、重报等多个版本,报告表里的状态字段与接收日期是唯一可靠的判别依据。只按机构号与年份取数,很可能取到最早那版而不是最终版。
§5 怎么把它拿到手并用起来:取数层
5.1 三条入口,三种代价
同一个库有三条入口,代价与灵活度正好成反比。
| 入口 | 形态 | 起止 | 灵活度 | 代价 |
|---|---|---|---|---|
| 官方按财年打包 | 压缩包,内含报告表、数值表、字母数值表、汇总表 | 1996 财年至今 | 最高,全部坐标都在 | 需自行透视,单年解压超一吉字节 |
| 官方抽取版 | 一行一家医院一个财年的宽表,可按接口查询 | 2011 财年至今 | 中,只有被挑中的字段 | 看不到成本中心明细,早年被截断 |
| 学术整理版 | 预合并、统一标签的长表与扁表 | 1996 财年至今 | 高,标签已统一 | 依赖第三方维护,需注明整理方 |
选择逻辑很简单:要做十年以上的纵向研究,或要某个具体成本中心,走第一条;只做近十年的常见财务指标,走第二条;想省掉透视这一步又不想丢年份,走第三条。三条路的数据在重叠区间应当一致,不一致时要先怀疑自己的坐标而非官方。
5.2 先把一个压缩包拆开看清楚
下面这段命令把某一财年的医院压缩包下载并列出内部结构。文件名遵循"医院新版 + 财年"的命名习惯,旧版是另一条序列。
#-- 下载某一财年的医院新版成本报告(体积约百兆,先确认磁盘)
curl -L -o HOSP10FY2023.zip "https://downloads.cms.gov/files/hcris/HOSP10FY2023.zip"
#-- 解压到独立目录,避免多年份混在一起
mkdir -p hcris/2023 && unzip -o HOSP10FY2023.zip -d hcris/2023
#-- 看清包内到底有哪几类文件
ls -lh hcris/2023
#-- 报告表通常最小,先读它确认字段与行数
head -3 hcris/2023/*rpt*.csv
wc -l hcris/2023/*nmrc*.csv
读完之后通常会看到一个反直觉的事实:报告表只有几行字段,而数值表的行数是报告数的上千倍。这就是长表的代价——信息全在,但每取一个指标都要一次筛选。
5.3 用报告表建立面板骨架
import pandas as pd
#-- 报告表字段少,全部按字符串读入,避免认证号前导零被吃掉
rpt = pd.read_csv(
"hcris/2023/hosp_2023_rpt.csv",
dtype=str,
encoding="latin-1",
low_memory=False,
)
#-- 统一列名大小写,官方文件在不同年份的大小写并不完全一致
rpt.columns = [c.strip().upper() for c in rpt.columns]
rpt["FY_BGN_DT"] = pd.to_datetime(rpt["FY_BGN_DT"], errors="coerce")
rpt["FY_END_DT"] = pd.to_datetime(rpt["FY_END_DT"], errors="coerce")
#-- 一个报告期可能有多条申报,按接收日期保留最新一条
rpt["RPT_RECV_DT"] = pd.to_datetime(rpt["RPT_RECV_DT"], errors="coerce")
rpt = (
rpt.sort_values("RPT_RECV_DT")
.drop_duplicates(subset=["PRVDR_NUM", "FY_BGN_DT", "FY_END_DT"], keep="last")
)
#-- 只留完整报告期,短报告期单独存一份供敏感性分析
days = (rpt["FY_END_DT"] - rpt["FY_BGN_DT"]).dt.days
full = rpt[days.between(300, 430)].copy()
short = rpt[~days.between(300, 430)].copy()
print(full.shape, short.shape)
这段代码里有三个关键判断:认证号必须按字符串读,否则以零开头的号码会变形;同一报告期可能存在多个版本,必须按接收日期取最后一次;报告期长度需要单独检查,否则短报告期会让单位成本出现假峰值。
5.4 把长表透视成宽表
长表转宽表的关键是"先选坐标,再透视"。不要试图把整张数值表透视开——那会得到一张几十万列的表。
import pandas as pd
#-- 只读需要的列,数值表很大
nmrc = pd.read_csv(
"hcris/2023/hosp_2023_nmrc.csv",
dtype={"RPT_REC_NUM": str, "WKSHT_CD": str, "LINE_NUM": str, "CLMN_NUM": str},
usecols=["RPT_REC_NUM", "WKSHT_CD", "LINE_NUM", "CLMN_NUM", "VALUE"],
encoding="latin-1",
)
nmrc["VALUE"] = pd.to_numeric(nmrc["VALUE"], errors="coerce")
#-- 目标坐标:财务报表的收入与费用,以及机构特征表的床位与住院日
targets = {
("G300000", "00100", "00100"): "net_patient_rev",
("G300000", "00400", "00100"): "total_oper_exp",
("S300001", "00100", "00100"): "beds",
("S300001", "00200", "00100"): "inpatient_days",
}
sub = nmrc[
nmrc.set_index(["WKSHT_CD", "LINE_NUM", "CLMN_NUM"]).index.isin(targets)
].copy()
sub["field"] = list(
sub.set_index(["WKSHT_CD", "LINE_NUM", "CLMN_NUM"]).index.map(targets)
)
#-- 同一坐标偶尔重复出现,先聚合再透视
wide = (
sub.groupby(["RPT_REC_NUM", "field"], as_index=False)["VALUE"].sum()
.pivot(index="RPT_REC_NUM", columns="field", values="VALUE")
.reset_index()
)
panel = full.merge(wide, on="RPT_REC_NUM", how="left")
panel["cost_per_day"] = panel["total_oper_exp"] / panel["inpatient_days"]
print(panel[["PRVDR_NUM", "cost_per_day"]].head())
坐标必须来自官方的工作表行列组合清单,不能凭记忆。清单本身很大——单是数值表的唯一组合就超过二十万个——所以实践中的做法是先按机构类型与问题挑出十来个坐标,写成一个小字典,而不是一次性全量透视。
5.5 用官方接口取抽取版宽表
如果只需要近十年的常见指标,官方接口可以按页取数,不需要注册。
import requests
import pandas as pd
BASE = "https://data.cms.gov/data-api/v1/dataset/44060663-47d8-4ced-a115-b53b4c270acb/data"
rows, offset, page = [], 0, 5000
while True:
r = requests.get(BASE, params={"size": page, "offset": offset}, timeout=60)
r.raise_for_status()
chunk = r.json()
if not chunk:
break
rows.extend(chunk)
offset += page
print(f"已取 {offset} 行")
df = pd.DataFrame(rows)
df.to_parquet("hcris_flat.parquet", index=False)
print(df.shape, df.columns[:12].tolist())
这条路的优点是省掉全部透视工作,缺点是字段集合被官方固定的那几十个锁死,且起始年是 2011 而非 1996。同一份研究里混用两条入口时,务必在重叠年份做一次对账:随机取一百家医院,比较同一个指标在两条路上的值,差异应当为零或仅来自四舍五入。
5.6 跨代际拼接与去重
旧版与新版的并行区间是 2010 与 2011 两个财年。下面的写法把两代读成一张表,并按"新版优先"的规则去重。
-- 用 DuckDB 直接读压缩包外的 CSV,先拼两代再按机构号与报告期去重
CREATE OR REPLACE VIEW rpt AS
SELECT *, '2552-10' AS FORM_GEN
FROM read_csv_auto('hcris/2011/hosp_2011_rpt.csv', all_varchar = true)
UNION ALL
SELECT *, '2552-96' AS FORM_GEN
FROM read_csv_auto('hcris/2011/hosp96_2011_rpt.csv', all_varchar = true);
CREATE OR REPLACE TABLE rpt_dedup AS
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY PRVDR_NUM, FY_BGN_DT, FY_END_DT
ORDER BY CASE WHEN FORM_GEN = '2552-10' THEN 0 ELSE 1 END,
RPT_RECV_DT DESC
) AS rn
FROM rpt
)
WHERE rn = 1;
-- 核对两代在同一机构上的重叠程度
SELECT FORM_GEN, COUNT(*) AS reports, COUNT(DISTINCT PRVDR_NUM) AS hospitals
FROM rpt_dedup
GROUP BY FORM_GEN;
去重规则没有唯一正确答案,但必须有明文规则。按"新版优先"处理的好处是保留了更细的成本中心;按"旧版优先"则在跨年可比性上更稳。无论选哪种,都应在方法里写清,并报告被舍弃的行数。
§6 与库内条目的关系
6.1 关系图谱
库内与医院、卫生经济相关的篇目已经不少,但它们几乎全部以"人"或"事件"为单位,只有本篇以"机构-年"为单位。这个差别不是程度差别,是种类差别。
| 篇目 | 计量单位 | 它回答什么 | 与 HCRIS 的边界 |
|---|---|---|---|
| 本篇 HCRIS | 医院-财年 | 一家医院一年花了多少、收了多少、做了多少 | 机构级财务与利用率,不含任何个体 |
| 合成医保理赔(SynPUF 系) | 受益人-理赔 | 理赔长什么样、管线怎么跑 | 合成、无真实机构财务,不能与真实成本对账 |
| Medicare 限用数据 | 受益人-理赔 | 每一次服务的支付与利用 | 有支付无成本,需与本篇连接才能算毛利 |
| 住院样本(HCUP 住院库) | 出院人次 | 某次住院的诊断、操作、费用 | 费用是收费口径,非成本;无资产负债表 |
| 急诊样本(HCUP 急诊库) | 就诊 | 急诊就诊原因与处置 | 同上,且不含住院转化后的成本 |
| 美国医疗支出面板调查 | 人-年 | 个人自付、保险覆盖、自评健康 | 无机构侧成本,只有个人视角支出 |
| 英格兰医院事件统计 | 住院事件 | 英国医院的诊疗活动 | 另一国支付制度,科目不可直接对照 |
| OECD 卫生统计 | 国家-年 | 跨国可比的卫生支出与利用 | 国家聚合,无法落到机构 |
| WHO 全球卫生观察 | 国家-年 | 全球卫生指标时间序列 | 同上,且口径更粗 |
| CMS 机构名录 | 机构 | 类型、地址、认证状态、所属集团 | 只有身份,无任何财务与利用率 |
这张表的核心结论是:HCRIS 的独占点不是"医院数据",而是"机构财务成本"。同样是医院,住院样本告诉你这次住院收了多少费,理赔告诉你医保付了多少钱,只有 HCRIS 告诉你这家医院为提供这些服务花了多少成本。三者相乘或相减,才能得到毛利;缺了成本这一项,任何"医院赚不赚钱"的问题都无从回答。
另一个独占点是服务量与成本的同表性。床位、床日、出院人次、按付款方拆分的住院日,与成本科目在同一份报告里、同一个报告期内、同一个认证号下。这意味着单位成本(每床日成本、每出院成本)可以直接算,不需要跨库连接,也不需要假定时间对齐。其他任何公开数据要做到这一点,都得先做一次带误差的连接。
第三个独占点是三十年的连续性。两代表单虽然换了坐标系,但成本中心的骨架没有推翻重来:试算表还在、成本分摊还在、财务报表还在。这使得 1996 年与 2023 年的同一家医院,理论上可以放在同一条时间轴上。跨代际的可比性有损,但不为零,这在公开数据里相当罕见。
区隔上还要说清一件容易混淆的事:本篇不提供任何"服务量"的患者侧解释。它能告诉你一家医院做了多少台住院日,不能告诉你这些住院日里有多少是肺炎、多少是心衰。要后者,必须接住院样本或理赔;而一旦接上,本篇的角色就固定为"机构侧分母",不再是分析主体。
6.2 检索路径
按问题类型找入口,比按数据名找入口更省时间。下面四条是最常用的路径。
| 你要回答的问题 | 先看哪篇 | 再补哪篇 | 连接键 |
|---|---|---|---|
| 这家医院今年亏不亏 | 本篇 | 无需补 | 认证号 + 报告期 |
| 这批医院的成本比邻州高多少 | 本篇 | 机构名录(类型、城乡) | 认证号 |
| 某类手术的医院成本是多少 | 住院样本 | 本篇(提供机构成本) | 认证号 |
| 医保支付能否覆盖成本 | 医保理赔 | 本篇(提供成本) | 认证号 + 年份 |
| 患者自付与医院成本的关系 | 支出面板调查 | 本篇 | 州 + 年份(只能粗连) |
| 跨国比较医院成本 | OECD 卫生统计 | 本篇(仅作方法参照) | 无,需自建映射 |
检索关键词方面,“成本报告”“医院财务”“成本收费比”“未补偿医疗”"慈善医疗"这五个词在本篇内都能定位到具体章节;“理赔”“受益人”“患者"这三个词在本篇内只会出现在边界说明里,出现即意味着讨论的是"它给不了什么”。
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
多数数据集的评价框架是"准不准",因为它们的价值在于测量某个人、某次事件。成本报告不适合套这个框架,套上去就会误判。
原因在于它的生成机制:数据由机构自己填写,用途是结算,校验集中在与钱相关的字段。所以正确的问法不是"它准不准",而是"它对我这个字段的校验强度够不够"。同样一份报告,可报销成本可能精确到经得起审计,慈善医疗成本可能只是一次会计判断。把两者放进同一个模型,等于把两种不同强度的证据当成同一种。
还有一个更容易犯的误判:把"官方发布"当成"官方背书"。官方明确说明旧版汇总表不可靠、新版汇总表只从 2014 年起提供。这两句话本身就是质量声明,忽略它们会让整个分析建立在一层没有背书的数据上。
7.1 五维评分
| 维度 | 评分 | 依据 |
|---|---|---|
| 覆盖广度 | 5/5 | 覆盖全美参加 Medicare 的医院,含急症、关键准入与专科机构,三十年连续 |
| 机构级唯一性 | 5/5 | 成本与服务量同表同机构,公开数据中无替代 |
| 字段深度 | 5/5 | 成本中心级明细,千余工作表代码,二十余万坐标 |
| 口径一致性 | 3/5 | 代际换版、成本中心分摊自由度高、报告期不统一 |
| 时效性 | 2/5 | 报告期结束后数月至一年多才完整,最新财年长期不全 |
| 个体可追溯性 | 1/5 | 完全没有,且设计上就不打算有 |
| 获取门槛 | 4/5 | 免费、免注册、公有领域,但解析成本高 |
七项里没有一项低于 1 分,说明它在自己的定位上没有短板;两项低于 3 分,说明它一旦被拉出定位就会立刻失效。评分表读法应当是:前四项决定了它值不值得用,后三项决定了它能不能单独用。
7.1b DAIMS 质量六维打分
换一套评估框架再走一遍,落点略有不同,但结论一致:强项集中在"结构与可获取",弱项集中在"时效与个体精度"。
| DAIMS 维度 | 本数据集的状况 | 分数 |
|---|---|---|
| 数据来源与谱系 | 法定填报,来源明确到机构与报告期,可回溯到原始表单 | 5/5 |
| 数据建模与结构 | 四类表、单一主键、跨年结构稳定,代价是长表需要透视 | 4/5 |
| 数据定义与元数据 | 有官方数据字典与表单说明书,坐标含义可查 | 4/5 |
| 数据质量与内容真实性 | 结算相关字段强校验,披露类字段弱校验 | 3/5 |
| 数据保护与访问控制 | 机构级聚合、无个人信息,公开下载无风险 | 5/5 |
| 使用与许可透明度 | 公有领域、无注册、官方明示已知缺陷 | 5/5 |
DAIMS 这套框架把"保护"与"真实性"分开列,正好点出本库的特殊之处:它的保护分高不是因为做了脱敏,而是因为它压根不含个体;它的真实性分不满,也不是因为造假,而是因为一半字段本来就不进入任何校验。使用者看到"保护 5 分"时不该放松警惕,因为这里没有可泄漏的个人,也就没有"因保护而损失精度"的补偿逻辑。
7.2 从填报到入库:一条可预期的延迟链
时间线是可以推算的,这对规划研究窗口很有用。报告期结束后,机构通常有数月时间完成填报;行政承包商审核后进入数据库;数据库按季度刷新;再按财年打包发布。官方页面在 2026 年 9 月底更新的那一批,实际发布于 10 月初,覆盖到 2026 财年,但最新财年里的机构数远少于成熟年份。
这条链带来三个可操作的推论。做当年监测,本库只能提供滞后一年半以上的图景;做政策评估,要预留"最新一年不完整"的余量,通常做法是把最近一年标为暂定并在敏感性分析里剔除;做机构层面的存活分析,要意识到"某年没有报告"既可能是机构关闭,也可能只是还没填报,两者必须用外部名录区分。
7.3 已知的、可枚举的偏差
偏差要枚举,因为每一条都对应一类会出错的分析。
| 偏差 | 来源 | 受影响的分析 | 应对 |
|---|---|---|---|
| 自报偏差 | 机构自行填报,分摊方法自选 | 跨机构成本比较 | 限定同类机构、同代际、同年份 |
| 选择性缺失 | 部分机构长期不填某些工作表 | 慈善医疗、资产负债表分析 | 报告填报率,缺失不按零处理 |
| 代际断点 | 2010 年换版,列号与成本中心规则变更 | 跨 2010 年的纵向研究 | 建立映射表,或分两段建模 |
| 并行重复 | 两代在 2010 与 2011 财年并行 | 拼接后的总量与均值 | 按机构号与报告期去重 |
| 期间不等长 | 财年不同、存在短报告期 | 单位成本、增长率 | 用天数归一,或只留完整期 |
| 付款方口径漂移 | 住院日按付款方拆分的类别跨年调整 | 付款方结构的时间序列 | 合并为"医保/非医保"两分类 |
| 覆盖缺口 | 联邦医院、非认证机构不在库内 | 全美总量、市场份额 | 用名录做分母,明确排除项 |
| 州级申报差异 | 部分州的医疗补助出院数系统性低于另一套数据 | 付款方结构、安全网医院研究 | 与另一套住院数据交叉验证 |
最后一行的证据来自 2026 年发表的一项比较研究:作者把本库的医疗补助出院数与另一套以理赔为基础的住院数据对照,发现在二十五个州里存在部分医院的后者高于前者,提示按州分组的付款方结构可能被系统性低估。这类偏差不会在数据内部留下痕迹,只能靠外部数据发现。
7.4 外部验证矩阵
| 验证方式 | 怎么做 | 能发现什么 | 局限 |
|---|---|---|---|
| 与机构名录对照 | 用认证号连接名录,比机构类型与地址 | 认证号复用、类型错标 | 名录本身也有滞后 |
| 与另一套住院数据对照 | 比出院人次与住院日 | 付款方口径差异、漏报 | 两套数据的期间定义不同 |
| 与公开财报对照 | 取非营利机构年报,比总收入与总资产 | 自报口径与审计口径的差 | 只有部分机构有公开年报 |
| 与支付数据对照 | 比医保支付额与可报销成本 | 成本与支付的比例关系 | 支付含政策调整,不等于成本 |
| 内部勾稽 | 检查合计是否等于分项之和 | 填报算术错误 | 无法发现系统性偏移 |
| 时间序列突变检测 | 找同一机构同比异常跳变 | 换系统、换外包、重报 | 真实事件也会造成跳变 |
矩阵里最有用的是第二行与第六行。前者能发现口径层面的系统偏差,后者能发现机构层面的数据事故。两者都不需要额外授权,成本很低,应当成为任何基于本库的研究的标配。
§4.3 的案例在这里正好用得上:那家关键准入医院第三年的成本中心跳变,在时间序列突变检测里会被标出来,但它是真实的记账重排,不是错误。这提示检测只能提示"需要看",不能自动判定"是脏数据"。
7.5 它为何能持续:因为它不是为研究而存在的
它活得久,原因很朴素:它是支付流程的一部分。只要 Medicare 还有按成本补偿的部分,只要结算还需要成本报告,这个库就会继续被填报、继续被审核、继续被发布。研究价值是副产品,副产品不会因为没人用而消失,也不会因为有人用而变好。
这也解释了它的两个长期特征。第一,字段修订跟着支付规则走,不跟着研究需求走:研究者想要的字段如果与结算无关,通常不会被加进去。第二,文档质量参差:与钱相关的部分有详尽说明书,纯披露部分只有数据字典。
对使用者的含义是,不要期待它变友好。它会在结构上一直保持"长表 + 坐标"的形态,因为那是结算系统需要的形态;它也会一直保持"最新一年不完整",因为填报本身就是滞后的。适应这两点,比等待它改善要现实得多。
§8 生态位与历史
8.1 三个时间点决定了今天的形状
| 时间 | 事件 | 留下的痕迹 |
|---|---|---|
| 1996 财年 | 旧代表单的文件序列开始 | 本库的最早年份,此前的电子文件不成体系 |
| 2010 年 5 月 | 新代表单启用,适用报告期起始日在该日之后 | 两代并行两年,列号宽度与成本中心编码改变 |
| 2014 年 4 月 | 官方开始提供新版汇总表 | 2014 年前无官方背书的现成指标 |
| 2010 年代 | 未补偿医疗工作表进入常规填报 | 慈善医疗与坏账有了统一坐标,但早期缺失多 |
| 2020 年代 | 数据门户提供按认证号组织的抽取版 | 降低了入门门槛,但只到 2011 年 |
四个节点里,2010 年那次最要紧。它不是一次单纯的表格改版,而是把"成本中心如何编码"这件事从行号里剥离出来,改成一条独立记录。这个设计更干净,却让跨代际合并必须多写一步映射。
8.2 在数据生态里的位置
把它放进美国卫生数据的版图,会看到一个清晰的三角:支付数据回答"钱从哪来",临床数据回答"发生了什么",而本库回答"花了多少"。三者缺一,卫生系统的账就算不平。
这也解释了为什么它的使用者高度集中在三类人:做医院财务与并购分析的、做卫生政策评估的、做成本建模的。第一类要的是利润率与成本结构,第二类要的是政策前后对比,第三类要的是单位成本的标定值。三类人的共同点是:他们的问题都以机构为单位,不以人为单位。
8.3 被谁用、用在哪些环节
从公开文献看,最常见的四类用法是:医院财务困境与关闭风险、成本收费比与价格研究、未补偿医疗与慈善医疗的履行情况、以及按成本中心拆分的部门级成本分析。近年还多了一类用法:把本库作为机构侧特征,接进以理赔为基础的模型,用来解释同一支付水平下的成本差异。
这四类用法的共同前提是横向可比。而横向可比恰恰是本库最需要人工把关的地方——同一年、同一代际、同一类机构,才能勉强假定口径一致。跨州比较时,还要考虑州政策对医疗补助覆盖与慈善医疗认定的影响。
8.4 与商业整理版的分工
市面上有若干商业整理版,把长表透视好、把机构类型补上、把并购关系接好,按年收费。它们的存在说明一件事:本库的原始形态对多数使用者来说太贵——不是钱贵,是时间贵。
分工因此很自然:需要可复现、可审计、可写进方法学的研究,走原始文件;需要快速探索、快速出图、快速做行业对比的,走整理版。两者不冲突,但引用时必须写清是哪一层:是官方原始文件,还是某方的加工产物。混着写,等于把一个可复现的结果建立在一个不可复现的中间层上。
§9 使用指引
9.1 三种角色的路径
| 角色 | 起点 | 关键动作 | 常见坑 |
|---|---|---|---|
| 政策研究者 | 官方按财年打包 | 先建面板骨架,再选十来个坐标 | 忽略报告期不统一,直接按年聚合 |
| 医院财务分析人员 | 官方抽取版宽表 | 先定利润率分母,再比同业 | 把净患者收入当全部收入 |
| 数据工程师 | 原始长表 | 先写透视管线,再谈建模 | 坐标凭记忆写,静默取错列 |
三类角色的分界线是"要不要明细"。要成本中心明细的,只能走原始文件;只要机构级总量的,抽取版足够;要建管线的,必须先把长表转宽表这一步做成可复用的函数,否则每换一个指标就要重写一遍。
9.2 一条最短的可用流程
#-- 1 取一年数据,先只取报告表与数值表
curl -L -o HOSP10FY2023.zip "https://downloads.cms.gov/files/hcris/HOSP10FY2023.zip"
unzip -o HOSP10FY2023.zip -d hcris/2023
#-- 2 确认三类文件都在
ls hcris/2023 | grep -E "rpt|nmrc|alpha"
#-- 3 跑透视脚本,输出一家医院一个财年一行
python3 pivot_hcris.py --year 2023 --out panel_2023.parquet
#-- 4 抽样核对:随机十家医院,手工比一份原始工作表
python3 check_sample.py --panel panel_2023.parquet --n 10
#-- 5 与上一年拼接,检查同一机构的同比跳变
python3 build_panel.py --years 2019 2023 --out panel_2019_2023.parquet
这条流程的关键在第 4 步。透视脚本最容易犯的错不是报错,而是安静地取错坐标——结果看起来完全正常,只是数值对应的是另一行。抽样手工核对十分钟,能省掉后面几周的返工。§4.3 的案例里那家关键准入医院,就是靠这一步才发现第三年的成本中心金额被挪到了另一行。
9.3 引用方式
引用要区分三层:数据本身、整理版本、方法说明。三层写清,别人才能复现。
#-- 数据层
Centers for Medicare & Medicaid Services. Healthcare Cost Report Information
System (HCRIS), Hospital Form CMS-2552-10, Fiscal Year 2023.
Accessed via https://www.cms.gov/data-research/statistics-trends-and-reports/cost-reports
#-- 整理层(如使用第三方透视版,必须写明)
[整理方名称]. HCRIS Hospital Cost Report, processed extract, version [版本号],
retrieved [取数日期].
#-- 方法层(如使用工作表坐标,写明坐标来源)
Worksheet coordinates per CMS Provider Reimbursement Manual Part 2,
Chapter 40 (Form CMS-2552-10).
§10 AI 使用声明
| 项目 | 说明 |
|---|---|
| 数据是否含个人身份信息 | 不含。最小单位为机构-财年,公开文件已剔除填报人姓名与联系方式 |
| 是否可用于模型训练 | 可以。公有领域,无使用限制,但需自行承担口径风险 |
| 训练时的标签来源 | 无标注标签,标签需从工作表坐标派生,派生规则应随模型一并发布 |
| 适合的建模任务 | 机构级回归、面板预测、异常检测、单位成本标定 |
| 不适合的建模任务 | 患者级预测、单次就诊分类、个体风险分层 |
| 偏倚风险 | 自报偏差、覆盖缺口、代际断点三类,需在模型卡中显式声明 |
| 可解释性 | 高。每个特征都能追到一张工作表的一行一列 |
| 再分发要求 | 无许可限制,建议注明官方来源与本篇所述的整理步骤 |
常见误读(避坑清单)
| 常见说法 | 实际 | 证据 |
|---|---|---|
| 这是全美医院的花名册 | 只收参加 Medicare 且需提交成本报告的机构,联邦医院不在内 | 官方文件表按机构类型列表单,无联邦医院序列 |
| 数据从 1996 年一路到现在,可以直接拼 | 两代在 2010 与 2011 财年并行,直接拼接会重复计数 | 官方文件表两代年份区间重叠 |
| 官方抽取版就是全量数据 | 抽取版只保留被挑中的字段,且从 2011 财年才开始 | 数据门户元数据的时间范围 |
| 总成本就是 A 表合计 | A 表是可报销成本,G 表才是财务报表口径,两者不等 | 两份工作表的定义不同 |
| 净患者收入等于总收入 | 不含非患者收入,用其做分母会低估利润率 | 财务报表工作表分列患者与非患者收入 |
| 慈善医疗与坏账可以相加 | 两者是不同概念,混加会高估未补偿医疗 | 未补偿医疗工作表分列两项 |
| 报告里没有就是零 | 缺失与零是两件事,多数缺失是未填报 | 填报率随工作表与年份差异很大 |
| 数据经过审计,可以直接引用 | 只有结算相关字段经核对,披露类字段基本原样收录 | 官方明示旧版汇总表不可靠 |
| 最新财年已经可用 | 最新财年长期不完整,机构数远少于成熟年份 | 官方发布说明与季度刷新节奏 |
| 可以用它算市场份额 | 分母不含非认证机构,得到的份额偏高 | 覆盖缺口见偏差表 |
FAQ
Q1:HCRIS 覆盖多少家医院?
每个财年约六千家持有 CMS 认证号的医院提交报告。官方下载页不给统一机构数,第三方按日历年整理的版本在 2023 年给出六千零六十四家,另有"约六千五百家"的口径。差异来自是否含关键准入与专科机构、按报告期还是日历年归并。
Q2:为什么有两代表单?
成本报告表单在 2010 年换代。旧版适用于报告期起始日早于 2010 年 5 月 1 日的周期,新版适用于此后。官方文件表因此让两代在 2010 与 2011 两个财年并行,这一段是拼接时最容易出错的地方。
Q3:它能替代索赔数据吗?
不能。它没有患者、没有单次就诊、没有诊断与操作编码,只有机构级年度汇总。它回答的是一家医院一年花了多少、收了多少、服务了多少,而不是某个患者发生了什么。两者是互补关系,用认证号连接。
Q4:可以直接算医院利润率吗?
可以算,但要先明确口径。报告里有净患者收入与总运营费用,也能从财务报表工作表取到非患者收入。只用患者收入做分母会系统性低估利润率,两种分母得出的结论经常相反。
Q5:数据有许可限制吗?
没有。作为美国联邦政府作品,它属于公有领域,数据门户标注为政府作品,可自由下载、再分发与商用,无需注册,也不含患者个人信息。
Q6:为什么不直接用现成的宽表?
官方抽取版只保留被挑中的字段,且从 2011 年才开始,覆盖不到更早的年份。要做十年以上的纵向研究,或要某一个成本中心的明细,仍然得回到按财年打包的原始长表。
Q7:一个压缩包里有多少张表?
四类:报告表、数值表、字母数值表、汇总表。前两类是长表,需要按工作表代码、行号、列号透视;汇总表是官方预先算好的指标,但旧版的汇总表官方认为不可靠。
Q8:为什么同一个指标在不同年份的坐标不一样?
因为 2010 年换版时改了列号宽度,也改了成本编码工作表的行号规则。旧版把行号换成成本中心码,新版保留行号并另存映射。跨代际取数必须先建坐标映射表。
Q9:慈善医疗数据可信吗?
可信度低于结算类字段。它不进结算公式,主要靠机构按自身政策认定。跨机构比较时要假定认定标准一致,而这个假定在州与州之间很难成立。与税务报表对照是常见的交叉验证方式。
Q10:数据有多新?
报告期结束后数月至一年多才完整入库,数据库按季度刷新,官方按财年打包发布。最新财年长期处于不完整状态,做当年监测会滞后一年半以上。
Q11:能用来做机器学习吗?
可以,适合机构级的面板预测、异常检测与单位成本标定。不适合任何以患者为单位的任务。特征工程的关键是把坐标映射做对,模型本身通常不是瓶颈。
Q12:为什么它的字段看起来这么乱?
因为它是结算系统的副产品,不是为分析设计的。科目按支付规则组织,单位混排(美元、天数、人次),长表形态便于系统扩展而不便于人阅读。这种"乱"是结构性的,不会随时间改善。
术语表
| 术语 | 含义 |
|---|---|
| HCRIS | 成本报告信息系统,本文讨论的数据库 |
| 成本报告 | 机构按表单填报的年度会计报告 |
| CMS-2552-96 | 旧版医院成本报告表单,1996 至 2011 财年 |
| CMS-2552-10 | 新版医院成本报告表单,2010 财年至今 |
| 认证号(CCN) | 机构在 Medicare 的六位标识,前两位为州码 |
| 报告记录号 | 一份报告的唯一编号,跨表连接键 |
| 报告期 | 机构自定的财年区间,不等于日历年 |
| 短报告期 | 因开业、关闭或改财年导致的不完整期间 |
| 工作表 | 表单中的一张子表,如 A、C、G、S-10 |
| 成本中心 | 成本归集的科室内单位,如急诊、手术室、洗衣房 |
| 试算表 | 记录各成本中心直接成本的底表,A 表主体 |
| 成本分摊 | 把间接成本按比例摊到各成本中心的过程 |
| 成本收费比 | 成本与毛收费之比,常用于把收费换算为成本 |
| 可报销成本 | 按 Medicare 规则认定的、可参与结算的成本 |
| 净患者收入 | 扣除合同折让与坏账后的患者收入 |
| 毛收费 | 挂账价合计,不是实际收入 |
| 未补偿医疗 | 慈善医疗与坏账的合计概念,口径有争议 |
| 慈善医疗 | 按机构财务援助政策减免的部分 |
| 坏账 | 应收回款失败的部分,与慈善医疗不同 |
| 全职当量人数 | 按工时折算的自有员工人数,不含合同工 |
| 关键准入医院 | 一类小型乡村医院,按成本加成获得支付 |
| 摇摆床 | 小医院中可灵活转为住院护理的床位 |
| 长表 | 一行一个坐标的存储形态,需透视成宽表 |
| 透视 | 把坐标行转成指标列的过程 |
| 汇总表 | 官方预先计算的指标表,旧版可靠性存疑 |
| 结算 | 按报告数据核定医保应付金额的过程 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 旧版医院文件起始年 | 1996 财年 | 官方成本报告页文件表 | 官方页面 |
| 旧版文件截止年 | 2011 财年 | 同上 | 官方页面 |
| 新版文件起始年 | 2010 财年 | 同上 | 官方页面 |
| 新版文件截止年 | 2026 财年 | 同上 | 官方页面 |
| 新版适用报告期规则 | 起始日 2010 年 5 月 1 日起 | 表单说明书章节划分 | 官方文档 |
| 官方汇总表起始 | 2014 年 4 月 | 整理方对官方说明的转述 | 二手转述 |
| 每财年机构数 | 约六千家 | 文献与整理方描述 | 二手转述 |
| 某整理版单年机构数 | 6,064 家(2023 日历年) | 整理方更新日志 | 二手转述 |
| 唯一行列组合数 | 超过 200,000 | 整理方技术说明 | 二手转述 |
| 单财年压缩包体积 | 约百兆,解压超一吉字节 | 整理方技术说明 | 二手转述 |
| 抽取版年份范围 | 2011 至 2023 | 数据门户元数据 | 官方页面 |
| 更新频率 | 年度发布、季度入库 | 数据门户元数据 | 官方页面 |
| 许可 | 政府作品,公有领域 | 数据门户许可字段 | 官方页面 |
| 州级申报差异例证 | 二十五个州存在部分医院低估 | 2026 年比较研究摘要 | 论文摘要 |
附录 B:数字的来源分层
| 层级 | 数字 | 说明 |
|---|---|---|
| 官方页面 | 两代文件的起止财年、抽取版年份范围、更新时间、许可 | 直接来自 CMS 成本报告页与数据门户元数据 |
| 官方文档 | 新版适用报告期的日期规则、两代列号宽度差异、汇总表可靠性表态 | 来自表单说明书与整理方对官方文档的引用 |
| 论文摘要 | 州级付款方结构低估、按成本中心做部门成本分析的做法 | 来自同行评议期刊摘要,未逐篇核对全文 |
| 二手转述 | 每财年机构数、单年机构数、坐标数量、压缩包体积 | 来自整理方技术页与咨询机构说明,官方未逐项公布 |
| 未核实 | "约六千五百家"这一口径的构成 | 仅在项目说明中出现,未见方法说明 |
分层的意义在于:写作与研究时,只有前两层可以当作确定事实引用;第三层要写明"据某项研究";第四层要写明"据某整理方";第五层只能作为待核实的线索。
附录 C:完整参考文献
| 编号 | 文献 | 用途 |
|---|---|---|
| R1 | CMS, Cost Reports 下载页(按机构类型与表单列出年份区间) | 两代年份、发布节奏 |
| R2 | CMS, Hospital Provider Cost Report 数据门户页 | 抽取版字段范围、更新时间、许可 |
| R3 | CMS, Cost Report Data Dictionary | 字段定义 |
| R4 | CMS, Provider Reimbursement Manual Part 2, Chapter 36 与 Chapter 40 | 工作表结构与填报规则 |
| R5 | NBER, HCRIS Hospital 数据整理说明 | 表结构、列号宽度、汇总表时点、坐标规模 |
| R6 | 《Hospitals in Some States Under Report Medicaid Discharge Counts in Cost Report Data》, Health Services Research, 2026 | 州级付款方结构偏差 |
| R7 | 《Inpatient psychiatric bed capacity within CMS-certified U.S. hospitals, 2011-2023》, PLoS Medicine, 2025 | 长期面板用法示例 |
| R8 | 《Who measures the measurers: administrative accountability gap in non-profit acute care hospitals》, BMC Health Services Research, 2026 | 按成本中心取数的示例 |
附录 D:任务代码
下面这段脚本把"取数、透视、算单位成本、标出异常"四步串起来,可直接改坐标复用。
import pandas as pd
RPT = "hcris/2023/hosp_2023_rpt.csv"
NMRC = "hcris/2023/hosp_2023_nmrc.csv"
rpt = pd.read_csv(RPT, dtype=str, encoding="latin-1")
rpt.columns = [c.strip().upper() for c in rpt.columns]
rpt["FY_END_DT"] = pd.to_datetime(rpt["FY_END_DT"], errors="coerce")
nmrc = pd.read_csv(
NMRC,
dtype={"RPT_REC_NUM": str, "WKSHT_CD": str, "LINE_NUM": str, "CLMN_NUM": str},
usecols=["RPT_REC_NUM", "WKSHT_CD", "LINE_NUM", "CLMN_NUM", "VALUE"],
encoding="latin-1",
)
nmrc["VALUE"] = pd.to_numeric(nmrc["VALUE"], errors="coerce")
coord = {
("G300000", "00100", "00100"): "net_patient_rev",
("G300000", "00400", "00100"): "total_oper_exp",
("S300001", "00100", "00100"): "beds",
("S300001", "00200", "00100"): "inpatient_days",
}
idx = nmrc.set_index(["WKSHT_CD", "LINE_NUM", "CLMN_NUM"]).index
sub = nmrc[idx.isin(coord)].copy()
sub["field"] = list(sub.set_index(["WKSHT_CD", "LINE_NUM", "CLMN_NUM"]).index.map(coord))
wide = (
sub.groupby(["RPT_REC_NUM", "field"], as_index=False)["VALUE"].sum()
.pivot(index="RPT_REC_NUM", columns="field", values="VALUE")
.reset_index()
)
df = rpt.merge(wide, on="RPT_REC_NUM", how="inner")
df = df[(df["inpatient_days"] > 0) & (df["net_patient_rev"] > 0)].copy()
df["cost_per_day"] = df["total_oper_exp"] / df["inpatient_days"]
df["margin"] = (df["net_patient_rev"] - df["total_oper_exp"]) / df["net_patient_rev"]
#-- 用中位数绝对偏差找异常,避免均值被极端值带偏
med = df["margin"].median()
mad = (df["margin"] - med).abs().median()
df["flag"] = ((df["margin"] - med).abs() > 4 * mad).astype(int)
print(df.groupby("flag")[["margin", "cost_per_day"]].median())
df.to_parquet("panel_2023_profiled.parquet", index=False)
这段代码保留了三个刻意的设计:只保留完整报告期、用中位数与绝对偏差而不是均值与标准差、把异常单独打标而不直接删除。第三点尤其重要——异常往往就是最有价值的那几家机构。
附录 E:如果只记五件事
| 序号 | 要点 |
|---|---|
| 一 | 它的单位是医院-财年,任何个体层面的问题都不归它管 |
| 二 | 它唯一不可替代的地方,是成本与服务量写在同一家机构的同一行 |
| 三 | 两代在 2010 与 2011 财年并行,拼接前必须去重 |
| 四 | 结算是强校验,披露是弱校验,同一张表里的字段可信度可以差一个量级 |
| 五 | 最新财年长期不完整,做监测要预留一年半以上的滞后 |
编辑说明
本篇的事实核对完成于 2026 年 10 月底,核对对象为 CMS 成本报告下载页、数据门户元数据、数据字典说明、第三方整理方技术页,以及三篇同行评议期刊摘要。CMS 站点与数据门户对部分网络出口返回访问拒绝,页面内容改用检索索引中的原文摘录与元数据镜像核对,凡属此类均已在附录 B 标为二手转述。
未覆盖的内容包括:各州具体的成本中心分摊实践、商业整理版之间的字段差异、以及 2010 年之前的电子文件在个别年份的完整性。写作上遵循"只收规模、结构、边界三类数字"的原则,分布类统计一律未纳。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- openprescribing — 共享标签:公共卫生与流行病学 / 卫生服务研究 / 真实世界数据
- gemini — 共享标签:公共卫生与流行病学 / 卫生服务研究 / 真实世界数据
- cms-medicare-lds — 共享标签:公共卫生与流行病学 / 卫生服务研究 / 真实世界数据
- nhs-hes — 共享标签:公共卫生与流行病学 / 卫生服务研究 / 真实世界数据
- ncdb — 共享标签:公共卫生与流行病学 / 卫生服务研究 / 真实世界数据
- ghed — 共享标签:公共卫生与流行病学 / 卫生服务研究
- marketscan — 共享标签:公共卫生与流行病学 / 卫生服务研究 / 真实世界数据
- optum-clinformatics — 共享标签:公共卫生与流行病学 / 卫生服务研究 / 真实世界数据
- seer-medicare — 共享标签:公共卫生与流行病学 / 卫生服务研究 / 真实世界数据
- premier-pinc-ai — 共享标签:公共卫生与流行病学 / 卫生服务研究 / 真实世界数据
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

