信息速览
重症监护室里产生的数据密度极高:每小时的生命体征、每天的检验、随时下达的医嘱、床旁的护理记录。这些数据在西方有 MIMIC、eICU 等公开库可以复用,在中国却长期缺少同等可及的资源。研究者要么用自己医院的内部数据、无法复现,要么拿西方数据训练模型、再假设它能迁移过来。
这份数据库是补这个缺口的一次尝试。四川省自贡市第四人民医院把 2019 年 1 月至 2020 年 12 月连续收治的 2,790 例成人重症感染患者的数据整理出来,整合成七张表,涵盖基线、医嘱、诊断、检验、转科、护理记录与结局,并提供出院回家后的 SF-36 生活质量随访。院内死亡 161 例,死亡率 5.8%。
需要先说明它的定位。这不是一个大样本库,也不是一个设计精良的前瞻队列,而是一个真实的、回顾性的、单中心的临床数据整理。它的价值在于「中国成人重症感染」这个位置上此前几乎没有公开数据,而不在于规模或设计精度。
§1 它是什么:一家医院两年内的重症感染切片
1.1 一句话定义与三条边界
这是一套以住院为单位、以感染为纳入条件、整合四类信息系统的单中心重症数据库。
「以住院为单位」意味着主键是住院号而非患者。同一位患者可能多次入院,每次入院都是独立记录。做患者级分析时需要先按患者标识聚合。
「以感染为纳入条件」意味着这不是全部 ICU 患者,而是其中一个子集。纳入靠出院诊断描述中的关键词识别,因此边界由关键词规则划定,而不是由临床判据划定。这个细节决定了后续所有分析的适用范围。
「整合四类信息系统」是它相对原始病历的核心加工。电子病历、医院信息系统、检验信息系统与重症护理记录系统各有各的存储格式与标识体系,把它们对齐到同一个患者、同一条时间轴上,是这项工作的主要工作量所在。
1.2 七张表的结构
| 表名 | 内容 | 粒度 | 关键用途 |
|---|---|---|---|
| dtBaseline | 基线特征 | 一人一行 | 人群画像、协变量 |
| dtDrugs | 医嘱 | 一条医嘱一行 | 用药模式、治疗强度 |
| dtICD | 诊断编码与描述 | 一条诊断一行 | 疾病谱、院内死亡判定 |
| dtLab | 检验值与参考范围 | 一次检验一行 | 实验室指标时序 |
| dtTransfer | 转科记录 | 一次转科一行 | 科室流向、入 ICU 时点 |
| dtNursingChart | 护理记录 | 一次记录一行 | 生命体征、中文病程文本 |
| dtOutcome | 结局与随访 | 一人一行 | 院内转归、SF-36 |
七张表通过 PATIENT_ID 与 INP_NO 两个键连接。前者是患者标识,后者是住院号。区分这两个键很重要:按 INP_NO 聚合得到的是住院次,按 PATIENT_ID 聚合得到的才是人。
1.3 纳入与排除的实际含义
纳入条件是三条:年龄大于 18 岁、转入重症监护室、出院诊断描述中含感染相关关键词。
关键词规则本身需要仔细理解。官方给出的判据是描述中含 infection、pneumonia 或表示炎症的后缀 -itis。由于原始记录是简体中文,实际检索的是对应的中文词拼音形式,文中举的例子是表示「感染」的拼音与表示「炎」的字。此外还手工排除了部分自身免疫病与结缔组织病,以避免把非感染性炎症误纳。
这条规则的效果是:凡是诊断描述里明确写了感染部位或感染性质的病例,会被纳入;凡是只在病程记录里提到感染、而诊断栏没写的,可能不会被纳入。这意味着纳入的人群偏向「出院时被明确诊断为感染」的患者,而不是「住院期间曾发生感染」的患者。
这个偏向会带来一个不易察觉的后果:如果某位患者入院时是感染、住院期间痊愈、出院诊断里感染被列为次要诊断,他仍会被纳入;而另一位患者入院时非感染、住院期间发生院内感染但出院诊断未突出,他可能被漏掉。做「院内感染」相关研究时,这个偏向必须说清。
1.4 死亡率的两个数字
官方给出的院内死亡率是 5.8%,即 161 例死亡除以总例数。
这个数字看起来偏低——很多 ICU 队列的死亡率在两位数。官方给了两条解释。
第一条是人群构成。本库纳入的是「感染」而非「脓毒症休克」。感染是一个宽泛的谱系,从社区获得性肺炎到脓毒性休克都在内,轻中度占多数,整体死亡率自然被拉低。这与 MIMIC 这类以「ICU 住院」为纳入条件的库不同,后者包含大量非感染的重症患者,两头都有。
第二条更值得注意。官方指出,非幸存者的住院时间与 ICU 停留时间反而比幸存者短,原因是有相当一部分重症患者在治疗数日后家属选择撤除生命支持、随后死亡。这个现象在中国 ICU 里并不罕见,但它对数据分析的影响常被忽略:这些患者的病程被人工截断,他们的检验序列、护理记录、医嘱序列都比自然病程短得多。若模型把「记录条数少」当成风险信号,学到的可能是「撤除治疗」这个决策,而不是病情本身。
因此 5.8% 不能被解读为「这家医院救治水平高」。它是一个特定纳入规则下的特定人群的特定转归比例,引用时必须带上这三重限定。
1.5 与 MIMIC 系列的定位差异
| 维度 | MIMIC-IV | 本库 |
|---|---|---|
| 来源 | 美国波士顿学术医疗中心 | 中国四川三级医院 |
| 时段 | 2008–2019 主表延伸至 2022 | 2019–2020 |
| 纳入 | 全部 ICU 住院 | 仅感染相关 |
| 规模 | 数十万住院次 | 两千余例 |
| 波形 | 有(部分模块) | 无 |
| 随访 | 有限 | SF-36 生活质量 |
| 访问 | 凭证式 | 凭证式 |
差异集中在三点。人群不同,这是最核心的;纳入条件不同,本库是感染子集;结局维度不同,本库有生活质量随访而 MIMIC 没有。
第三点值得单独说。绝大多数重症数据库的结局是死亡或住院时长,而患者真正关心的是「活着出院之后过得怎么样」。SF-36 测的是生理功能、角色限制、疼痛、总体健康等八个维度,能刻画出院后的功能状态。这一维度在本库里有,虽然覆盖率未公布。
1.6 两年时间窗的含义
2019 年 1 月到 2020 年 12 月,恰好覆盖了新冠疫情暴发前后的转折点。
这个时间窗带来一个必须注意的问题:2020 年的患者与 2019 年的患者可能系统不同。疫情初期,医院的收治流程、探视制度、感染防控措施、甚至患者就诊延迟都发生了剧烈变化。若把两年数据混在一起分析,年份就成了一个未控制的混杂因素。
官方没有说明是否做过年份分层。使用者的对策有两条:把入院年份作为协变量纳入模型;或者做敏感性分析,两年分别建模再看结论是否一致。后者成本更低,建议至少做一次。
具体到操作层面,做分年分析还有一个好处:它能暴露数据导入的时间断点。两家系统在不同年份可能升级过,字段名、单位、取值范围都可能变。若某个变量在 2020 年突然出现大量异常值或缺失,很可能不是临床变化而是系统变更。这类问题在混合分析里会被平滑掉、看不出来,分年一拆就露出来了。
还有一处需要单独确认:2020 年 1 月之后的新冠病例。官方没有说明这类患者是否进了数据库、若进了用什么诊断描述。这不影响数据可用性,但影响解释——2020 年的感染谱与 2019 年不同,若新冠患者被纳入,重症比例、住院时长、死亡率的分布都会变。做趋势类结论时必须把这一点写在限制里。
§2 数据构成:七张表的实际用法
2.1 表的连接关系
七张表的连接键是两级的。
PATIENT_ID 是患者级标识,一位患者一个值,跨多次住院不变。INP_NO 是住院级标识,一次住院一个值。两键的关系是一对多:一位患者可以有多个 INP_NO。
连接时的选择取决于分析单位。做「这位患者的预后」,按 PATIENT_ID 聚合;做「这次住院的转归」,按 INP_NO。混淆两者会导致重复计数或错误合并。
还有一层连接需要注意:dtTransfer 表记录科室转移,其中包含「转入 ICU」这一事件。这个事件的时点决定了所有其他表的时间零点是否一致。若零点定义有偏差,整条时间轴都会错位。
2.2 基线表的定位
dtBaseline.csv 是一人一行,记录基线人口学与病情。官方描述简短,只说「包含个体患者的基线特征」,没有逐列列出字段。
这意味着字段名需要下载后自行核对。根据同类数据库的惯例,可能包含年龄、性别、入 ICU 类型(内科/外科)、入 ICU 来源(急诊/病房/手术室)、主要诊断、APACHE II 或 SOFA 之类的病情评分。但这些是推测,不能当作已知事实引用。
有一点可以确定:年龄字段做过特殊处理。官方说明 89 岁以上的患者年龄被赋予 90 到 120 之间的随机数。这是去标识的标准做法(超过 89 岁的人群太小,具体年龄可能指向特定个体),但它带来一个分析后果——「90 岁以上」这个组内部的年龄不可信,任何以年龄为连续变量的模型都会在最老的这一端引入噪声。
这个随机化的具体后果值得算清楚。假定真实年龄分布在 90 至 100 岁之间(ICU 人群很少更老),而记录值在 90 至 120 之间均匀抽取。那么这一组的记录年龄均值约为 105,比真实均值高出一大截。若模型把年龄当连续变量,它会从这一组学到一个虚高的「高龄」效应——不是因为这些人真的 105 岁,而是因为随机数把均值抬上去了。这属于经典的测量误差,但方向是系统的而非随机的,因此不会像随机噪声那样在样本量增大时被平均掉。
更麻烦的是这种误差与死亡率正相关。能活到 90 岁以上又进了 ICU 的人,本身就经过了极强的生存筛选;而随机数把它们的年龄标得更高,模型于是把「特别老」与「结局相对好」联系起来,产生方向错误的关联。这种偏倚在小样本上尤其难察觉。
处理办法有四种,代价各不相同。
一是把年龄截断在 90。 所有 90 及以上的记录统一改为 90,另加一个「是否 ≥90」的二值指示变量。这样连续部分保持单调可信,超出部分由指示变量承接。代价是 90 岁以上内部的剂量反应关系完全丢失,且截断点附近会有堆积。
二是分箱而非连续。 用 <40 / 40–64 / 65–79 / 80–89 / ≥90 这样的区间,最后一箱吸收所有随机化的值。这是最常用的做法,稳健、可解释、不需要假设。代价是损失了箱内信息,且箱边界的选择会影响结果,需要在敏感性分析里换几组边界验证。
三是直接把年龄从模型里去掉。 听起来激进,但在以生理指标为主的预测任务里,年龄的边际贡献往往不如 SOFA 单项。去掉它换来的是一份不需要解释测量误差的干净模型。适合变量少、可解释性优先的场景。
四是在建模前做多重插补式的处理。 把「≥90」视为区间删失,用区间回归或贝叶斯方法估计真实年龄的分布,再抽样填充。这最接近统计上正确的做法,但需要额外的分布假设,且实施成本高,在探索性分析里通常不值得。
选择哪一条取决于任务。做评分外部验证这类需要与已发表口径对齐的工作,用第二种(分箱,且分组切点与原文献一致);做纯预测任务,第一种或第三种更省事;做方法学研究,第四种才有意义。
还有一点容易被忽略:随机化是患者级的还是记录级的。若同一位患者的不同表里年龄字段各自独立随机,那么跨表连接时会出现同一人两个年龄的矛盾。核对方法是按 PATIENT_ID 分组、对年龄取唯一值计数,若不等于 1,说明随机化在表间不联动,连接后必须固定取某一张表的年龄值作为准。
2.3 医嘱表的时间陷阱
dtDrugs.csv 有一个极易被误用的字段:datatime。
官方明确说明,datatime 是医生开具医嘱的时间,不一定是给药时间。这个区别在临床上有实质意义:医嘱可能在上午开立、下午执行,也可能开立后因故未执行。
若把 datatime 当作给药时间做药物暴露分析,会得到系统性偏差。例如分析「抗生素使用到感染控制的时间间隔」,用医嘱时间算会比用实际给药时间算更短,因为医嘱往往先于执行。
真正的给药时间通常在护理记录里。要做严格的药物暴露分析,必须把医嘱表与护理记录表按时间对齐,找出执行记录。这是本库使用中最费工的一步,官方没有提供现成的对应关系。
2.4 诊断表与死亡判定
dtICD.csv 存 ICD 编码与诊断描述,描述已由中文翻译为英文。
Status_Discharge 字段是关键。官方说明:若患者院内死亡,所有诊断对应的该字段都记为 dead。这个设计与直觉不同——通常人们会想「每条诊断有自己的转归」,而这里是一个患者级标记被复制到每一行。
这个设计的好处是计算死亡率很简单:任取一行看 Status_Discharge 即可,或按 INP_NO 去重后统计。坏处是不能用它做诊断级别的转归分析,因为它不携带这个信息。
翻译这一层也值得注意。中文诊断描述翻成英文,翻译质量直接影响文本分析。例如「肺部感染」与「肺炎」在中文里有时混用,翻译后可能都变成 pneumonia,也可能一个译成 pulmonary infection、一个译成 pneumonia。做基于诊断文本的分析前,最好先看一批样本,确认翻译的一致性。
2.5 检验表的参考范围
dtLab.csv 除了检验值,还提供每个项目的参考范围。这一点比很多数据库做得好。
参考范围的价值在于它能处理「同一指标不同医院单位不同」的问题。例如血红蛋白有的用 g/L 有的用 g/dL,白细胞有的用 10⁹/L 有的用 /μL。有了参考范围,可以把绝对值转换成「相对正常上限的倍数」这一无量纲指标,从而实现跨机构的可比。
具体做法是把测定值除以参考范围上限,得到倍数。这个方法对上限型指标(越高越异常)有效,对下限型(越低越异常)要反过来。对双向型(过高过低都异常,如血钾)则要取偏离中值的距离。这三种类型的处理方式不同,不能一概而论。
参考范围还有一个用处是识别数据错误。若某条检验值超出参考范围十倍以上,通常不是病情而是录入或单位错误。例如血红蛋白记成 120 g/dL(正确应是 g/L),白细胞记成 0.01(少了一次幂)。这类错误在单条记录里看不出来,但按患者画出时序图后,会表现为孤立的尖峰,一眼可辨。建议在做任何建模之前,先对每个检验项目画一遍全库的数值分布直方图,找出量级明显异常的点。
检验数据还有一处结构性问题:开立频率不固定。医生按病情决定查什么、多久查一次,因此不同患者的检验项目组合与频率差异很大。这带来两种后果。一是时序不齐,无法直接拼成矩阵,必须做某种形式的聚合(按天取均值或最差值)。二是缺失非随机,「没查某项目」本身反映医生的判断,若当作随机缺失插补,会引入偏倚。
对第一种后果,常规做法是按固定时间窗聚合,例如每 24 小时取一次最大值与最小值。取最差值而非平均值,是因为临床上关心的是「有没有出现过异常」,而不是平均水平。对第二种后果,更稳妥的做法是把「是否检查」作为一个二值特征纳入,让模型知道这项数据是测出来的还是缺的。
2.6 转科表的用途
dtTransfer.csv 记录科室之间的转移,官方举例是「从消化内科转入 ICU」。
这张表的核心用途是确定入 ICU 时点。很多分析需要以「入 ICU 时刻」为零点计算相对时间,而 dtTransfer 里那条「转入 ICU」的记录就是零点的来源。
它还有一个次要用途是刻画科室流向。一位患者从急诊到 ICU 到普通病房到出院,这条路径本身携带信息:直接入 ICU 的与经病房转入的,病情轨迹不同;出 ICU 后回普通病房的与直接死亡的,预后不同。这类路径特征在预测模型里常被忽略,但往往有独立价值。
路径中还有一个容易被忽略的分支:再次转入。有些患者出 ICU 后病情反复,数日后又转回。这类患者在数据里表现为同一住院号下多次「转入 ICU」记录。做「入 ICU 时点」这个定义时必须决定取哪一次:取第一次,则第二次住院期间的暴露被算进了随访;取最后一次,则第一次住院期间的信息丢失。两种选择都会改变模型的输入。
比较稳妥的做法是只保留首次入 ICU 的记录,把再次转入当作结局的一部分(是否复发作为二分类标签)。这样时间轴干净,代价是损失了部分信息。
2.7 护理记录的双重身份
dtNursingChart.csv 是七张表里信息密度最高的一张,也是使用难度最大的一张。
它同时是结构化数据的来源和非结构化文本的来源。体温、心率、呼吸、血压、意识状态这些生命体征以数值形式记录在这里;同时,护士书写的病程记录以中文原文形式存在,官方明确说「可用于自然语言处理」。
v1.1 相对 v1.0 的主要改动就在这里:v1.0 的体温变量大量缺失,v1.1 补充了体温数值。
这张表的难点在于结构不统一。生命体征是表单式的(时间点 + 项目 + 数值),病程记录是叙述式的(时间点 + 一段中文)。两者混在一张表里,需要先按记录类型分流,才能分别处理。
分流之后,生命体征这一支要做三件事。第一是单位统一,血压有的记为 120/80 有的记为平均值,体温有的用摄氏度有的可能遗留华氏度。第二是时间对齐,护理记录的时间点不规律,有的每小时一次有的每四小时一次,重采样到固定网格会引入插值误差,不重采样则各家序列长度不一。第三是异常值识别,机器故障会产生「心率 300」「体温 25 度」这类不可能的数值,需要先按生理范围过滤。
病程记录这一支的预处理更麻烦。中文护理文本有大量模板化表述,例如「神志清楚,精神可,饮食睡眠可,二便正常」。这些句子信息密度低但出现频率高,直接做词频统计会被它们淹没。有效的做法是先建立模板库,把高频套话识别出来并降权,再看剩余的差异部分。这个思路与英文临床文本处理里的「模板去除」是一回事,只是中文的模板更固定、更容易穷举。
还有一层是时序本身的临床含义。护理记录的密度不是随机的:病情变化时记录变密,平稳时变稀。因此「某小时有没有记录」本身携带信息。若把记录密度当作噪声忽略,会丢掉这部分信号;若直接当作特征,又可能与撤除治疗这个混杂因素纠缠。稳妥的做法是把密度作为一个显式特征交给模型,并在解释时说明它的双重含义。
2.8 结局表与随访
dtOutcome.csv 含结局,其中特别提到 SF-36 问卷,由出院回家后随访获得。
官方没有给出随访完成率。这是一个必须自己核对的数字。重症患者的随访脱落率通常很高——有人转院、有人失能无法作答、有人拒绝、有人死亡(院内死亡者自然没有出院后随访)。若覆盖率只有两三成,那么基于这部分人得出的功能结局就不能代表全体。
还有一个方法学细节:SF-36 有多个版本(36 项标准版、12 项简版、8 项简版),各版本得分不可直接比较。官方只说「SF-36 问卷」,未说明版本与计分方式(是原始分还是常模转换分)。做分析前必须先看数据里的实际条目。
§3 怎么拿到:三层手续与使用约束
3.1 获取路径
受限访问,三层手续:
| 层级 | 要求 | 说明 |
|---|---|---|
| 账户 | PhysioNet 凭证式用户认证 | 需机构邮箱与导师或主管信息 |
| 协议 | 签署 Credentialed Health Data Use Agreement 1.5.0 | 需机构授权代表确认 |
| 培训 | CITI 的 Data or Specimens Only Research | 数小时课程,证书有有效期 |
三项齐备后文件目录可见。未登录访问 https://physionet.org/files/icu-infection-zigong-fourth/1.1/ 返回 403。
本库不从属于其他项目,但上游有一个 v1.0(2021-09-09),v1.1(2022-06-30)在其基础上补充了体温。引用时应标注版本。
3.2 许可的约束
PhysioNet Credentialed Health Data License 1.5.0 的核心是四条:
不得再分发。 数据不能转给第三方,包括同机构的同事。每人单独取证。
不得尝试重识别。 尽管官方已做去标识,协议仍禁止任何试图还原个体身份的行为,也禁止与其他数据源交叉比对。
限定用途。 仅限协议声明的科研或教学,商业用途需另申请。
成果声明。 发表时按指定格式引用数据与平台。
第一条对课题组协作影响最大。合规做法是把数据放在受控环境,成员通过各自账户访问,而不是各自留一份副本。
3.3 三条使用约束
约束一:不要把总例数当成 ICU 收治总数。 这是「感染且进过 ICU」的交集人数。用它算 ICU 占用率、床位周转、总体死亡率都会错。
约束二:不要用 datatime 当给药时间。 医嘱时间不等于执行时间。做药物暴露分析必须回到护理记录找执行记录。
约束三:不要跨年份直接合并。 2019 与 2020 年的收治流程差异可能很大,尤其 2020 年初。至少做一次分年敏感性分析。
§4 质量与已知问题
4.1 官方披露的四项局限
回顾性设计。 数据来自常规诊疗,不是按研究方案前瞻采集。这意味着变量是否记录、记录多细,取决于当时的临床需要,而不是研究需要。
多个变量存在缺失。 官方明确说「many variables」有缺失值,但没有列出哪些变量、缺失多少。这个信息只能自己统计。
呼吸机参数粒度粗。 机械通气是重症治疗的核心,但参数(潮气量、呼气末正压、吸氧浓度、气道峰压)记录不够细。做呼吸机相关性肺损伤、肺保护性通气依从性这类研究,本库支撑不足。
不提供波形。 没有心电、动脉压、呼吸流速等高频信号。这意味着做波形分析、做报警算法、做信号质量研究都用不上这份数据。
4.2 官方未提但需自查的四处
版本差异。 v1.0 体温大量缺失,v1.1 补上。若有人拿到的是 v1.0 或引用了基于 v1.0 的结果,涉及体温的结论需要重新核对。
伦理批号不一致。 页面方法段写 2020-065,伦理段写 2021-014,同一页面自相矛盾。官方未说明哪个是最终批号。可能的解释是研究跨年度、补充随访方案时又申请了一个批号。引用时两个都提,或注明「官方给出两个编号」。
随访覆盖率未知。 SF-36 随访做了多少人,官方没说。这直接影响长期结局分析的可信度。
缺失机制未知。 检验是按需开立的,不是按固定频率。这意味着「某项检验没做」本身就是信息——医生认为不需要查。把缺失当作随机缺失处理,会引入偏倚。
4.3 关键词纳入的漏检与误纳
这是本库最需要理解的一处方法学细节。
官方规则是出院诊断描述含感染关键词即纳入。漏检的情形有两类:一是诊断描述用词不含关键词,例如只写「脓毒症」而没写感染部位或「感染」二字;二是感染发生在住院期间但出院诊断未列出。
误纳的情形也有一类:非感染性炎症被关键词捕获,例如某些以 -itis 结尾但非感染性的疾病。官方说明已手工排除部分自身免疫病与结缔组织病,但手工排除的完整性无法验证。
这个规则的实际效果取决于中文诊断描述的书写习惯,而这个习惯官方没有披露。使用者若关心纳入的准确性,唯一办法是抽样人工复核诊断描述,估算漏检率与误纳率。这个工作量不大,二三十例就能给出量级估计,值得做。
4.4 撤除治疗带来的截断偏倚
前文提过,非幸存者的停留时间反而更短,因为部分重症患者家属选择了撤除生命支持。
这个现象在数据上表现为:死亡组的记录条数少、时间跨度短、检验序列短。若不加控制,模型可能学到「记录少 = 高风险」这条捷径。这条捷径在训练集上有效,在部署时可能失效——因为新患者的记录少可能是因为刚入院,而不是因为要撤除治疗。
控制的方法有三种。一是把「记录条数」或「住院时长」作为特征显式纳入,让模型在明处使用。二是限制分析窗口,例如只取入 ICU 后前 48 小时的数据,让所有人有相同的观察期。三是把撤除治疗的患者单独分层,看结论是否稳健。
第二种最干净,代价是丢弃了后段信息。对早期预警类任务,前 48 小时往往恰恰是最关键的窗口,所以这个代价可以接受。
三种方法各有各的实现细节,值得逐一展开,因为做错一点就会把偏倚原样带回来。
显式纳入记录密度。 这一条听着简单,实际有两处陷阱。第一,密度必须定义清楚:是入院至死亡/出院的总记录条数,还是单位时间内的条数?前者与生存时间高度共线(活得久自然记的多),后者才是真正意义上的「监护强度」。若用前者,模型学到的其实是「住院时长」,而这个变量在预测时不可得,模型无法部署。第二,纳入之后模型会给出密度的系数,这个系数的解释要小心——它同时携带了「病情重」(记录变密)与「即将撤除治疗」(记录变稀)两种相反的信号,净效应可能是零甚至反号。若看到系数接近零就断定「密度无用」,是误读。
限制观察窗。 前 48 小时是最常用的窗口,因为早期预警的临床价值就在这里。但窗口一旦固定,就要处理窗口内的数据密度差异:48 小时内有人被记了 200 条,有人只被记了 20 条,前者信息多后者信息少,模型会对信息多的样本更自信。解决办法是在特征层面做时间加权聚合(越靠近窗口末端权重越高),而不是简单取均值。取均值会把「什么时候测的」这个信息抹掉。
窗口长度本身是个超参数。48 小时是惯例,但对感染患者来说,抗生素起效、培养回报、器官功能变化往往在 72 小时内才充分显现。可以设 24、48、72 三个窗口分别建模,看性能曲线的拐点在哪里——若 72 小时的性能明显优于 48 小时,说明这个库的信号需要更长时间积累,那么任务定义就该向「早期识别」而不是「极早期筛查」调整。
分层分析。 把患者分成「有撤除治疗记录」与「无撤除治疗记录」两层,分别建模或分别评估。这一条的前提是能识别出撤除治疗——而本库没有专门的撤除治疗字段,只能从护理记录文本、医嘱终止、以及「死亡前较长时间内无任何活跃医嘱」这类代理信号推断。代理信号的灵敏度与特异度都不高,误分类会把偏倚重新引入。因此分层分析更适合作为敏感性分析(用来判断主结论是否稳健),而不是作为主分析。
三条路可以叠加:以限制窗口为主分析,以显式密度为敏感性分析,以分层为辅助验证。三套结果方向一致,结论才有底气;若三套结果互相矛盾,恰恰说明偏倚的方向没搞清,此时应当把矛盾本身写进限制,而不是挑一套顺眼的报出去。
4.5 单中心与两年跨度
单中心意味着机构效应无法分离。检验项目的组合、护理记录的模板、用药习惯、ICU 收治标准都带着这家医院的印记。
两年跨度则引入时间效应。2019 年到 2020 年,疫情改变了太多东西:就诊延迟、收治流程、感染防控、甚至病种构成。2020 年的感染患者里,新冠相关病例是否被纳入、以什么诊断描述纳入,官方未说明。这一点对解释 2020 年的数据尤其重要。
4.6 缺失的三个层次
变量级缺失。 某列在某些行是空的。官方说「many variables」有缺失但未列举。
记录级缺失。 某次该记录的检验没做,整行不存在。这与变量级缺失不同:前者是「有记录但值为空」,后者是「连记录都没有」。在时序分析里两者的处理方式完全不同。
患者级缺失。 某些患者完全缺少某类数据,例如没做过任何影像检查、没有随访记录。
三者的处理策略:变量级可插补,记录级应视为「未测量」而非「缺失」,患者级要考虑是否有系统性原因。混为一谈是最常见的错误。
§5 能做什么:五类任务与实现要点
5.1 任务一:早期预警评分的外部验证
这是官方明确推荐的用途。NEWS、MEWS、qSOFA 这些评分都是在其他人群开发的,需要有独立人群做外部验证。
实现要点有三。第一,确认评分所需的变量在库中齐全。qSOFA 只需三项:呼吸频率、收缩压、意识状态,都在护理记录里。NEWS 需要七项,多了体温、心率、血氧、吸氧状态,也在护理记录里。第二,确认取数时间窗。评分通常取某一时刻的值或某段时间内的最差值,两种口径结果不同。第三,处理缺失。评分要求全部变量齐备,缺一项就无法算分,此时是算作正常还是排除,会显著影响结果。
验证的产出应当包括:区分度(AUC)、校准度(校准曲线与斜率)、临床效用(决策曲线)。只报 AUC 是不完整的——一个 AUC 尚可但校准很差的评分,在临床上可能导致系统性过度或不足预警。
5.2 任务二:基于护理文本的脓毒症识别
护理记录的中文原文是这份数据里最独特的部分。用自然语言处理从中识别脓毒症或预测其发生,是一个有实际价值的方向。
难点在中文临床文本的预处理。三步:先按记录类型分流(生命体征 vs 病程叙述),再做分词与术语归一(「血压低」「BP 低」「低血压」应归为一类),最后处理缩写与简写(中文病历里大量使用「神清」「双肺呼吸音清」这类固定短语)。
标注是最大的瓶颈。数据里没有逐条记录的脓毒症标签,只有出院诊断。用出院诊断做弱监督是可行路径——把「出院诊断为脓毒症」的患者的所有记录标为正类。这样得到的标签在时间上不精确(不知道何时发生),但在患者层面可用。
若要做时点级别的识别,需要借助 Sepsis-3 定义从数据里重建:疑似感染(培养送检 + 抗生素)加上 SOFA 评分跃升。这条路技术上可行,但需要培养与抗生素的具体时间,而抗生素时间又回到 datatime 不等于给药时间的问题。
5.3 任务三:院内死亡预测与跨库迁移
用入 ICU 后早期数据预测院内死亡,是重症领域的标准任务。本库提供了 161 例死亡样本,够做基线模型。
更有意思的是跨库迁移。用 MIMIC 训练、在本库测试,或者反过来,能直接回答「模型能否跨人群泛化」这个实际问题。
跨库迁移的主要障碍是变量不对齐。两边的检验项目名称、单位、参考范围都不同,生命体征的记录频率也不同。解决路径是先建立一个共同的最小变量集(例如年龄、性别、生命体征四项、常用检验十项),只在这个子集上建模。变量少了,性能会降,但可比性上来了。
还要注意结局定义的差异。本库的死亡判定靠 Status_Discharge 字段,MIMIC 靠 hospital_expire_flag,两者都是院内死亡,定义一致,可以直接比。
5.4 任务四:SF-36 长期结局的关联分析
SF-36 随访是本库相对同类资源的差异点。可以做的问题是:哪些入院时的特征与出院后的功能状态相关。
分析框架建议这样搭:以 SF-36 的某个维度(例如生理功能)为结局,以入 ICU 时的基线特征、住院期间的暴露(机械通气天数、血管活性药使用、ICU 停留时长)为预测变量,做回归。
三个必须先解决的问题。第一是覆盖率,若随访只覆盖少数人,样本量可能不足以支撑多变量模型。第二是失访偏倚,完成随访的人可能本身恢复得较好,得出的关联会被低估或高估。第三是版本,SF-36 各版本的计分不同,不能混用。
5.5 任务五:护理记录的结构化抽取
把中文护理记录里的非结构化信息转成结构化字段,是一项基础设施性质的工作,价值在于为后续所有分析铺路。
值得抽取的内容包括:意识状态(清醒/嗜睡/昏迷)、呼吸支持方式(鼻导管/面罩/无创/有创)、体位、皮肤状况、出入量、特殊事件(跌倒、非计划拔管)。
抽取方法上,规则与模型要结合。固定短语用规则抽取,准确率高、成本低;表述多变的用模型,覆盖面广。起步阶段建议先做规则,把最常见的几种表述覆盖住,看覆盖率能到多少,再决定是否上模型。
5.6 可复现的最小分析路径
| 步骤 | 动作 | 产出 |
|---|---|---|
| 1 | 取证下载,核对七张表的行数与列名 | 结构清单 |
| 2 | 按 INP_NO 统计住院次,按 PATIENT_ID 统计人数 | 单位核对 |
| 3 | 核对 Status_Discharge 的 dead 记录数是否为 161 | 死亡率对账 |
| 4 | 统计每张表的缺失率,列出缺失最重的十个变量 | 缺失画像 |
| 5 | 从 dtTransfer 提取入 ICU 时点,验证时间零点 | 时间轴基准 |
| 6 | 抽取护理记录中的四项生命体征,拼成时序 | 生命体征表 |
| 7 | 用 qSOFA 做一次外部验证,报 AUC 与校准 | 基线性能 |
第三步的对账很重要。161 是官方给的死亡数,若自己数出来不是这个数,说明 Status_Discharge 的理解有偏差或数据有版本差异,必须先解决再往下做。
第七步选 qSOFA 而不是 NEWS,是因为它只要三个变量,缺失处理简单,适合作为第一个跑通的基线。跑通之后再扩展到更复杂的评分。
5.7 DAIMS 24 项检查
| 维度 | 项 | 判定 |
|---|---|---|
| 文档 | 数据字典 | 部分(七表用途说明,字段未逐列列出) |
| 文档 | 采集协议 | 是(纳排标准明确) |
| 文档 | 设备规格 | 不适用(源自信息系统) |
| 文档 | 标注规范 | 部分(感染靠关键词,诊断靠临床) |
| 文档 | 版本历史 | 是(v1.0 与 v1.1,差异已说明) |
| 文档 | 许可说明 | 是 |
| 文档 | 引用格式 | 是 |
| 文档 | 局限披露 | 是(四项,简明) |
| 质量 | 缺失披露 | 否(只说「many variables」) |
| 质量 | 信号质量说明 | 不适用(无波形) |
| 质量 | 一致性检验 | 否 |
| 质量 | 金标准对照 | 部分(诊断来自临床) |
| 质量 | 异常值处理 | 否 |
| 质量 | 隐私处理 | 是(去标识说明详细) |
| 可得性 | 开放程度 | 否(凭证式) |
| 可得性 | 下载方式 | 是 |
| 可得性 | 文件校验 | 否(页面未提校验和) |
| 可得性 | 数据体量 | 否(未给体积) |
| 可得性 | 格式说明 | 是(CSV 七表) |
| 可得性 | 工具支持 | 否(无代码、无基线) |
| 伦理 | 伦理批准 | 部分(两个编号并存) |
| 伦理 | 知情同意 | 是(回顾性豁免,已说明) |
| 伦理 | 试验注册 | 不适用(非临床试验) |
| 伦理 | 去标识化说明 | 是(HIPAA 标识、时间偏移、年龄随机化) |
24 项中「是」11 项、「部分」6 项、「否」6 项、不适用 1 项。
伦理一项判「部分」而非「是」,唯一原因是两个批号并存。去标识化那一项判「是」,因为官方把手段写得很具体:移除 HIPAA 受保护健康信息、两个主键随机赋值、事件时间改为入院后小时偏移、89 岁以上年龄随机化。这四项合起来是一套完整的去标识方案,披露水平高于多数同类数据集。
§6 常见误读与引用陷阱
6.1 误读一:把纳入例数当 ICU 收治总量
前文已述。这是感染子集,不是全部重症患者。用它做科室运营分析会严重低估实际工作量。
6.2 误读二:把 5.8% 当救治质量指标
死亡率受纳入规则、人群构成、治疗强度决策三重影响。5.8% 低,很大程度上是因为纳入了大量轻中度感染,以及部分重症患者早期撤除治疗。跨医院比较死亡率必须做风险调整,未调整的粗死亡率没有可比性。
6.3 误读三:把医嘱时间当用药时间
datatime 是开立时间。用它算药物暴露时长、算抗生素升级时间、算用药到转归的间隔,都会偏短。这是本库使用中最容易犯且最难自查的错误,因为在数据里看不出来——两个时间都「合理」,只是含义不同。
6.4 误读四:把护理记录当纯数值表
护理记录同时含数值与中文叙述。若只按数值列读,会丢掉大量信息;若把中文列当噪声跳过,就浪费了这份数据最独特的部分。更糟的是把两者混在一起做统计,会得到无意义的结果。
6.5 误读五:忽略版本
v1.0 与 v1.1 的体温数据差别很大,而体温是感染判定的核心变量。若方法部分不写版本号,读者无法判断结论是否可信。
6.6 引用时必须写清的五件事
- 纳入的是成人重症感染患者,不是 ICU 收治总数
- 数据来自四川省自贡市第四人民医院,2019 年 1 月至 2020 年 12 月
- 使用的是 v1.1,其相对 v1.0 补充了体温
- 院内死亡率 5.8%(161/2790),非风险调整
- 访问需凭证、协议、培训三层手续,不可再分发
§7 在生态中的位置
7.1 与西方重症数据库的关系
MIMIC、eICU、AmsterdamUMCdb 构成了重症数据科学的基础设施。它们的共同点是规模大、字段多、文档完善、社区活跃。
本库的定位不是替代,而是提供一个人群不同的验证场景。跨人群验证是临床预测模型从论文走向实践的关键一步,而这一步长期缺少中国数据。
7.2 与中国其他公开医学数据的差异
国内公开的医学数据以影像为主——各类影像挑战赛提供了大量标注数据。结构化 EHR 数据相对少见,重症方向尤其少。
本库在这个格局里的位置是:它是少数几个以「中国成人重症」为对象的、可通过国际平台获取的结构化数据集之一。规模不大,但填补的是结构性空白。
7.3 长期可用性判断
本库 2021 年 9 月发布 v1.0,2022 年 6 月更新到 v1.1,此后无更新。PhysioNet 对受限条目长期保存,DOI 稳定。
风险主要在两点。一是数据治理:受限数据的访问依赖机构持续维护凭证体系,若原始机构撤销授权,条目可能下架(历史上发生过类似情况)。二是后续无更新:2019–2020 的时间窗会越来越旧,做趋势研究时需要补充更新的数据。
7.4 适合谁用
| 使用者 | 适合做的事 | 不适合做的事 |
|---|---|---|
| 重症研究者 | 评分外部验证、风险因素分析 | 波形分析、呼吸机精细研究 |
| 临床 NLP 团队 | 中文护理记录的信息抽取 | 大规模预训练 |
| 流行病学团队 | 中国感染患者的人群描述 | 全国代表性推断 |
| 模型开发者 | 跨人群迁移的测试集 | 单一数据源训练 |
§8 总结
这份数据库的价值在于位置而非规模。两千余例在重症数据里不算大,但「中国成人重症感染」这个位置上此前几乎没有公开数据。
它的三个特点决定用法。第一,纳入靠出院诊断关键词,边界由规则划定,做院内感染研究时要留意这个偏向。第二,七张表各有各的坑——医嘱时间是开立不是执行、护理记录混合数值与文本、死亡标记是患者级复制到每行。第三,有 SF-36 长期随访,这是同类资源里少见的维度,但覆盖率未知。
使用时的三条底线:按感染子集而非 ICU 总量理解规模;按 v1.1 使用并标注版本;把医嘱时间与给药时间严格区分。
§9 术语与口径速查
| 术语 | 全称 | 本文口径 |
|---|---|---|
| ICU | Intensive Care Unit | 重症监护病房 |
| SIRS | Systemic Inflammatory Response Syndrome | 全身炎症反应综合征 |
| Sepsis-3 | 第三次脓毒症国际共识定义 | 以 SOFA 跃升定义的脓毒症 |
| qSOFA | quick Sequential Organ Failure Assessment | 床旁快速筛查,三项指标 |
| SOFA | Sequential Organ Failure Assessment | 序贯器官衰竭评分 |
| APACHE II | Acute Physiology and Chronic Health Evaluation II | 急性生理与慢性健康评分 |
| SF-36 | 36-Item Short Form Survey | 生活质量量表,八个维度 |
| ICD | International Classification of Diseases | 国际疾病分类 |
| HIS | Hospital Information System | 医院信息系统 |
| LIS | Laboratory Information System | 检验信息系统 |
| INP_NO | Inpatient Number | 住院号,住院级标识 |
| PATIENT_ID | — | 患者标识,跨住院不变 |
| 撤除生命支持 | withdrawal of life-sustaining treatment | 放弃维持治疗,导致病程被人为截断 |
§10 事实清单与附录
10.1 核心事实
| 项 | 值 |
|---|---|
| 患者例数 | 2,790 |
| 院内死亡 | 161 |
| 院内死亡率 | 5.8% |
| 时间窗 | 2019-01 至 2020-12 |
| 机构 | 四川省自贡市第四人民医院 |
| 年龄门槛 | 大于 18 岁 |
| 数据表数 | 7 |
| 性别差异 | 非幸存者男性 70%,幸存者 59%,p=0.014 |
| 伦理批号 | 2020-065 与 2021-014(页面两处不一致) |
| v1.0 发布 | 2021-09-09 |
| v1.1 发布 | 2022-06-30 |
| DOI(v1.1) | 10.13026/xpt9-z726 |
| DOI(latest) | 10.13026/cgzc-vp58 |
| 访问等级 | Credentialed |
| 许可 | PhysioNet Credentialed Health Data License 1.5.0 |
10.2 七表用途速查
| 表 | 一行代表 | 主要用途 | 注意 |
|---|---|---|---|
| dtBaseline | 一位患者 | 协变量 | 字段需下载后核对 |
| dtDrugs | 一条医嘱 | 用药模式 | datatime 非给药时间 |
| dtICD | 一条诊断 | 疾病谱、死亡判定 | Status_Discharge 为患者级复制 |
| dtLab | 一次检验 | 实验室时序 | 含参考范围,可做跨机构标准化 |
| dtTransfer | 一次转科 | 入 ICU 时点 | 时间零点来源 |
| dtNursingChart | 一次护理记录 | 生命体征、中文文本 | 数值与叙述混合 |
| dtOutcome | 一位患者 | 院内转归、SF-36 | 随访覆盖率未知 |
10.3 附录 A:把七张表按患者拼起来
import pandas as pd
BASE = 'icu-infection-zigong-fourth-1.1/'
base = pd.read_csv(BASE + 'dtBaseline.csv')
icd = pd.read_csv(BASE + 'dtICD.csv')
lab = pd.read_csv(BASE + 'dtLab.csv')
trf = pd.read_csv(BASE + 'dtTransfer.csv')
nur = pd.read_csv(BASE + 'dtNursingChart.csv')
drug = pd.read_csv(BASE + 'dtDrugs.csv')
out = pd.read_csv(BASE + 'dtOutcome.csv')
-- 先核对两个键的关系:一人可多次住院
by_pat = base.groupby('PATIENT_ID').size()
print('患者数', base.PATIENT_ID.nunique(), '住院次', base.INP_NO.nunique())
print('多次住院的患者数', (by_pat > 1).sum())
-- 死亡对账:Status_Discharge 为患者级复制,需按住院去重
dead = (icd[icd.Status_Discharge.astype(str).str.lower() == 'dead']
.drop_duplicates('INP_NO'))
print('院内死亡住院次', len(dead), '死亡率', round(len(dead) / base.INP_NO.nunique(), 4))
-- 入 ICU 时点:从转科表取,作为所有时间轴的零点基准
icu_in = trf[trf.iloc[:, :].astype(str).apply(
lambda r: r.str.contains('ICU', case=False).any(), axis=1)]
print(icu_in.head())
-- 检验时序:按住院拼回,注意时间以入院为零点的小时偏移
lab_long = lab.merge(base[['INP_NO', 'PATIENT_ID']], on='INP_NO', how='left')
print(lab_long.groupby('INP_NO').size().describe())
这段代码有三个不成立即需重来的前提。
第一,列名按常见惯例假设(PATIENT_ID、INP_NO、Status_Discharge),实际列名以下载后读到的表头为准。官方只明确提到了这三个键名与 Status_Discharge,其余列名未公开。
第二,死亡对账必须先按 INP_NO 去重。因为 Status_Discharge 是患者级标记被复制到每一行诊断,直接数 dead 的行数会远大于 161。
第三,转科表里识别「转入 ICU」的那一列,可能需要按科室名匹配而非固定列名。若科室名有多个写法(ICU、重症医学科、综合 ICU),匹配规则要相应放宽。
10.4 附录 B:五个可立即验证的疑问
- 七张表各自的列名与行数是什么?官方只给了用途描述。
- SF-36 随访实际覆盖多少人,覆盖者的基线特征与未覆盖者有何差异?
- 各变量的缺失率分别是多少,缺失最重的是哪几项?
- 关键词纳入规则漏掉了多少「诊断写脓毒症但未写感染」的病例?
- 2020 年的患者中,新冠相关病例如何被记录与纳入?
这五个问题官方页面都没有答案,只能下载后自行核对。第二个与第五个对结论的解释力影响最大。
10.5 附录 C:证据链
本文数字来自 PhysioNet 条目页 v1.1,包括:总例数、161 例死亡、5.8% 死亡率、非幸存者与幸存者男性比例 70% 对 59% 及 p=0.014、时间窗 2019-01 至 2020-12、年龄大于 18 岁、机构为自贡市第四人民医院、伦理批号 2020-065 与 2021-014、七张表名称与用途、关键词纳入规则、去标识四项手段、四项官方局限、两个 DOI、两个版本的发布日期、许可与访问等级。
凡页面未给出而本文提及的结构性判断(字段名、随访覆盖率、缺失率、新冠病例纳入方式),均标注为待核实并列入附录 B,未作推断性填充。
编辑说明
核验时点:2026 年 10 月 19 日,依据 PhysioNet 条目页 v1.1。
核验方式:官方页面逐段读,重点核对规模、时间窗、纳入规则、七表用途、去标识手段、局限清单与版本差异。因条目为受限访问,未能下载数据核对字段与缺失率,所有涉及表结构与缺失的判断均标明为待核实。
口径处理:总例数统一表述为「成人重症感染患者例数」,不使用「ICU 患者数」。5.8% 死亡率明确标注为非风险调整的粗率。伦理批号两个并列呈现,未择一采信,因为官方页面本身矛盾且未说明。
未覆盖内容:未核对 SF-36 的版本与计分方式;未核实 2020 年新冠相关病例的处理;未评估关键词纳入规则的漏检与误纳比例。这三项都需要数据到手后才能进行。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- outcomerea — 共享标签:重症监护 / 电子健康记录 / 队列研究
- bold-blood-gas-oximetry — 共享标签:重症监护 / 电子健康记录 / 队列研究
- hospital-onset-infection — 共享标签:电子健康记录 / 疾病监测 / 队列研究
- zhejiang-ehr-critical-care — 共享标签:重症监护 / 电子健康记录
- clif — 共享标签:重症监护 / 电子健康记录 / 队列研究
- mit-critical-datathon-2023 — 共享标签:重症监护 / 电子健康记录 / 队列研究
- hirid — 共享标签:重症监护 / 电子健康记录
- eicu-collaborative-legacy — 共享标签:重症监护 / 电子健康记录
- mimic-iv-ed-legacy — 共享标签:重症监护 / 电子健康记录
- mimic-br — 共享标签:重症监护 / 电子健康记录
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

