信息速览
重症监护里最难回答的问题,往往不是某项指标高不高,而是一项操作到底救了人还是害了人。动脉留置导管(indwelling arterial catheter,IAC)正是这样一个例子:它让血压可以被逐搏读取、让血气分析不必反复穿刺,同时也带来血流感染、血栓与血管并发症的风险。要判断它对死亡的影响,随机对照试验几乎做不成,原因有两层:伦理上很难把危重病人随机分到"不监测"的一侧,操作上又几乎没有医生愿意在入组后放弃自己习惯的监测手段。于是所有证据都只能来自观察性数据,而观察性数据里,插管与死亡之间的相关性从头到尾混着病情本身。
2015 年,Hsu 等人在 Chest 上发表了一项倾向评分分析,把问题收窄到一个相对干净的切口:机械通气、且不需要升压药的循环稳定患者。2016 年,MIT 计算生理学实验室的 Jesse Raffa 把这项研究的队列整理成一张 1,776 人的宽表,作为 Springer 教科书《Secondary Analysis of Electronic Health Records》第 16 章的案例数据放上 PhysioNet。这就是 IACCD。
它很小,小到不像一个"数据集":一个 CSV、四十六列、一份文本字典、一个装着 SQL 与 R 代码的压缩包。它也不完整,没有患者编号,没有时间序列,没有波形。但它把一条完整的因果推断链——从数据库里捞人、定义暴露、定义结局、匹配、检验、写结论——压缩成一份人人可复现的教具,而这恰好是绝大多数重症公开库不愿承担的那部分工作。下面这张 MIMIC-II 导管临床表值不值得用,取决于你要的是"跑得动"还是"算得准";两者在这份数据上的答案恰好相反。
一屏速览
| 维度 | 内容 |
|---|---|
| 全名 | Clinical data from the MIMIC-II database for a case study on indwelling arterial catheters |
| 常用简称 | IACCD(Indwelling Arterial Catheter Clinical dataset) |
| 发布平台 | PhysioNet,RRID:SCR_007345 |
| 贡献者 | Jesse Raffa,MIT 计算生理学实验室(Laboratory for Computational Physiology) |
| 首次发布 | 2016 年 10 月 28 日,版本 1.0(也是唯一版本) |
| 版本与 DOI | v1.0 对应 10.13026/C2NC7F;最新版 DOI 为 10.13026/1r5h-4p36 |
| 规模 | 1,776 名患者 |
| 变量数 | 46 个,官方 Methods 段与数据字典逐条对应 |
| 行粒度 | 一人一行(首次成人 ICU 住院),文件行数未在官方页明写 |
| 暴露 | aline_flg,是否使用动脉留置导管,0/1 |
| 主结局 | day_28_flg,28 天内死亡,0/1 |
| 时间窗 | 入 ICU 首日观察值 + 28 天结局 + 住院与 ICU 天数 |
| 文件构成 | full_cohort_data.csv、data_dictionary.txt、aline-mimic-ii-master.zip |
| 数据许可 | Open Data Commons Attribution License v1.0(ODC-BY 1.0) |
| 代码许可 | 配套 GitHub 仓库为 MIT License,与数据许可不同 |
| 典型用途 | 倾向评分与匹配教学、死亡结局建模基线、重症表格数据管线演示 |
§1 它要解决的具体麻烦
1.1 一根导管的两面:临床争议与因果陷阱
动脉留置导管在重症监护单元里几乎是"标配"的一部分。它的直接价值很实在:连续血压波形让血管活性药物的滴定有据可依,动脉血气可以随时抽,不必每次都做一次穿刺。它的风险同样实在:导管相关血流感染、血栓、假性动脉瘤、穿刺部位出血,在凝血功能差的病人身上都不是小概率事件。
于是临床上一直有一个没有定论的问题:插管带来的监测收益,能不能盖过它带来的风险?这个问题之所以难,不在于数据少,而在于插管这个动作本身携带着病情信息。医生不会给一个平稳的病人插动脉线,也不会给一个濒危的病人不插。所以"插管组死亡率更高"这句话,既可能是导管有害,也可能只是"插管组本来就更重"。这就是典型的适应证混杂(confounding by indication)。
Hsu 等人 2015 年在 Chest 上的做法是收窄人群:只取机械通气、且不需要升压药支持的循环稳定患者。在这个人群里,插管与否更多取决于科室习惯与监测偏好,而不是病情轻重,混杂因此被压小。再用倾向评分把两组的基线拉到可比,估计插管与死亡的关联。
IACCD 就是这项研究的数据快照。它不是在 MIMIC-II 上新采的一批数据,而是把当年那套抽取逻辑固化下来,配上教科书第 16 章的逐步讲解,让任何一个人都能把这条链从头走一遍。
1.2 三条常见的错误期待
第一条,期待它是"MIMIC-II 的缩小版"。 它不是。MIMIC-II 是包含床边监护、检验、用药、病程记录的多表数据库,而这张表只有 46 列汇总值,没有任何时间序列,也没有任何一张可以回连 MIMIC-II 的外键。想拿它去研究液体复苏曲线、研究用药时序,一步都走不动。
第二条,期待它带波形或血气原始值。 表里与血气有关的只有三列:abg_count(动脉血气检测次数)、po2_first、pco2_first。后两者是首日单点值,不是序列,也不是完整血气报告,没有 pH、没有碱剩余、没有乳酸。
第三条,期待它可以直接当脓毒症数据集。 字典里确实有一列 sepsis_flg,但官方在其后的括号里写得很清楚:absent (0) for all——这一列在全部行里恒为 0。原因不是记录缺失,而是入组时就把脓毒症患者排除了(§2.4 的建表条件里有 sepsis_flg=0 这一条)。它是一列被保留下来却没有任何信息量的字段,把它当特征喂进模型只会多出一列常数。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 倾向评分匹配的完整教学案例 | 暴露、结局、十余个基线协变量齐全,原著代码可下载 | 够,这是它被造出来的唯一理由 |
| 28 天死亡率的基线模型 | 1,776 行、46 列,二分类结局明确 | 够做基线,不够做结论 |
| 重症表格数据的清洗练习 | 有拼写错误、有常数列、有反向编码的标志位 | 够,而且比干净数据更有教学价值 |
| 时序建模(生命体征轨迹) | 只有首日单点值 | 不够,一列一条轨迹都做不出 |
| 波形或信号分析 | 无 | 不够,一条波形都没有 |
| 与 MIMIC-II 原始记录回连 | 无患者编号、无住院号 | 不够,这是它最硬的限制 |
| 脓毒症亚组分析 | sepsis_flg 全为 0 |
不够 |
| 多中心外部验证 | 单一来源、单一中心 | 不够 |
| 药物或干预的剂量-反应分析 | 无用药记录 | 不够 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 你要教一群临床医生读倾向评分,缺一个能当场跑完的例子 | 数据只有一张表,读入内存不超过一秒,匹配与检验可以现场演示 | 直接用官方 R 代码,把匹配前后的基线表并排投出来 |
| 你在写重症预测模型,需要一个"小而干净"的冒烟测试集 | 46 列、二分类结局、编码规则明确 | 只用它验证管线通不通,不要用它报性能 |
| 你在做观察性研究的因果方法比较(PSM、IPTW、双稳健估计) | 同一份暴露与结局,可反复换方法对照 | 固定随机种子与匹配半径,比较点估计与置信区间 |
| 你想复现一篇已发表的重症研究 | 原著论文、教科书章节、抽取 SQL、分析代码四件套齐全 | 注意版本差异:复现的是 2016 年快照,不是 2015 年论文的原始分析集 |
| 你在教数据工程,想讲"派生数据集为什么会失真" | 抽取脚本与字典的每一处不一致都可现场指认 | 把 §2.2 的字段表与字典原文对照讲 |
| 你要论证"公开数据也需要读文档" | 三处拼写或语义瑕疵都在官方页面上白纸黑字 | 用「常见误读」表当讲义 |
1.5 一句话判断
它不是用来训练模型的,是用来训练判断的:一张四十六列的表,把"观察性数据能说到哪一步"这件事讲得比很多方法学教材都具体。
1.6 不适合谁:四条边界
不适合拿来做规模训练。 1,776 行、46 列,任何梯度提升树在几分钟内就能把它背下来。用它报一个很高的 AUC 并不困难,但那个数字说明不了任何问题,因为样本量与特征量之比太低,交叉验证的方差会吞掉大部分差异。
不适合拿来做任何时间维度的研究。 所有临床观察值都锚定在"入 ICU 首日"这一个点上,mort_day_censored 是唯一带时间语义的列,而且它只记录到死亡或删失那一天。没有逐日轨迹,就没有轨迹建模。
不适合当成 MIMIC-II 的入口。 表里没有 subject_id、hadm_id、icustay_id 中的任何一个。这意味着你无法把这些行映射回原始数据库,也就无法补充波形、用药、护理记录。想要原始数据,必须单独申请 MIMIC-II 或改用 MIMIC-III/IV。
不适合做外部验证的"外部"。 它来自单一医学中心的单一时间段,人群被限制在机械通气且循环稳定的患者。把它当外部集去检验一个多中心模型,得到的差异里既有分布偏移,也有入组条件差异,两者无法拆开。
§2 数据构成与规格
2.1 三个文件,装下一整个研究
官方 Data Description 段点名的文件只有三个,没有任何子目录,没有分卷,也没有按年份或中心拆分的批次:
| 文件 | 形态 | 内容 | 使用位置 |
|---|---|---|---|
full_cohort_data.csv |
逗号分隔文本,首行为变量名 | 1,776 名患者的 46 个汇总变量 | 分析的唯一数据来源 |
data_dictionary.txt |
纯文本 | 46 个字段的逐条释义,官方页面原样转载 | 建数据字典、写代码本 |
aline-mimic-ii-master.zip |
压缩包 | 从 MIMIC-II 抽取数据所用的 SQL,以及 R 与 Stata 的分析脚本 | 复现抽取逻辑与统计流程 |
值得注意的是官方把这三样东西的定位写得很清楚:CSV 是数据,字典是语义,压缩包是可复现性。三者缺一,这个数据集就退化成"一堆不知道含义的数字"。而绝大多数人下载时只会拿走第一个。
另一个容易被忽略的细节:压缩包里的代码是从 GitHub 仓库 MIT-LCP/aline-mimic-ii 打包的,仓库创建于 2014 年 7 月,最后一次推送在 2017 年 10 月。也就是说,PhysioNet 上的数据是一次性冻结的快照,而代码仓库在发布之后还有过改动。两者之间存在时间差,这是复现时第一个要对齐的地方。
2.2 四十六个字段的完整字典
下面按用途把 46 个字段分成五组列出。左列是变量名(与 CSV 表头逐字一致),第二列是官方字典的原始释义,第三列是取值与单位,第四列是使用时真正要留意的地方。
第一组:入组场景与暴露(6 个)
| 字段 | 字典原文 | 取值与单位 | 注意 |
|---|---|---|---|
aline_flg |
IAC used (binary, 1 = year, 0 = no) | 0 / 1 | 官方把 yes 误写成 year,是拼写错误;另注意入组已剔除首小时就有导管者 |
service_unit |
type of service unit | 字符:FICU、MICU、SICU | 三个科室,不是三个病区编号 |
service_num |
service as a numeric (binary: 0 = MICU or FICU, 1 = SICU) | 0 / 1 | 把 FICU 与 MICU 合并成一类,是二值化后的版本 |
day_icu_intime |
day of week of ICU admission | 字符,星期 | 入 ICU 的星期几,不是日期 |
day_icu_intime_num |
day of week of ICU admission (numeric, corresponds with day_icu_intime) | 数值,与字符列一一对应 | 与上一列信息重复,建模时二选一 |
hour_icu_intime |
hour of ICU admission (numeric, hour of admission using 24hr clock) | 0–23 | 24 小时制,可当"夜间入院"的代理变量 |
第二组:结局与时长(7 个)
| 字段 | 字典原文 | 取值与单位 | 注意 |
|---|---|---|---|
day_28_flg |
death within 28 days | 0 / 1 | 官方明示的主结局 |
hosp_exp_flg |
death in hospital | 0 / 1 | 院内死亡,随访窗比 28 天长 |
icu_exp_flg |
death in ICU | 0 / 1 | ICU 内死亡,是最窄的一个结局 |
mort_day_censored |
day post ICU admission of censoring or death | 天,数值 | 时间变量,锚点是入 ICU 当天 |
censor_flg |
censored or death (binary: 0 = death, 1 = censored) | 0 / 1 | 编码方向与直觉相反:0 才是死亡 |
icu_los_day |
length of stay in ICU | 天,数值 | 与死亡结局高度耦合,不能当普通协变量 |
hospital_los_day |
length of stay in hospital | 天,数值 | 同上,且包含 ICU 之外的时间 |
第三组:人口学与严重度评分(6 个)
| 字段 | 字典原文 | 取值与单位 | 注意 |
|---|---|---|---|
age |
age at baseline | 岁,数值 | 抽取脚本对超过 120 岁的记录统一改写为 91.4,见 §2.4 |
gender_num |
patient gender (1 = male; 0=female) | 0 / 1 | 没有留缺失档位 |
weight_first |
first weight | kg,数值 | 首个体重记录,可能来自床秤或估算 |
bmi |
patient BMI | 数值,无单位标注 | 由身高体重算出,身高来源未说明 |
sapsi_first |
first SAPS I score | 分值,数值 | 简化急性生理评分第一版,不是 SAPS II |
sofa_first |
first SOFA score | 分值,数值 | 序贯器官衰竭评分,首日值 |
第四组:十个合并症标志(10 个)
| 字段 | 字典原文 | 取值 | 注意 |
|---|---|---|---|
sepsis_flg |
sepsis present (binary: 0 = no, 1 = yes – absent (0) for all) | 0 / 1 | 全部为 0 是入组时排除脓毒症的结果,见 §2.4 |
chf_flg |
Congestive heart failure | 0 / 1 | 充血性心力衰竭 |
afib_flg |
Atrial fibrillation | 0 / 1 | 心房颤动 |
renal_flg |
Chronic renal disease | 0 / 1 | 慢性肾病 |
liver_flg |
Liver Disease | 0 / 1 | 肝病 |
copd_flg |
Chronic obstructive pulmonary disease | 0 / 1 | 慢性阻塞性肺疾病 |
cad_flg |
Coronary artery disease | 0 / 1 | 冠心病 |
stroke_flg |
Stroke | 0 / 1 | 卒中 |
mal_flg |
Malignancy | 0 / 1 | 恶性肿瘤 |
resp_flg |
Respiratory disease (non-COPD) | 0 / 1 | 非慢阻肺的呼吸系统疾病 |
第五组:首日生理、化验与入量(17 个)
| 字段 | 字典原文 | 取值与单位 | 注意 |
|---|---|---|---|
map_1st |
Mean arterial pressure | mmHg,数值 | 平均动脉压,首日 |
hr_1st |
Heart Rate | 数值,字典未标单位 | 心率,按惯例为次/分 |
temp_1st |
Temperature | 华氏度(F),数值 | 华氏,不是摄氏,直接当摄氏用会得到荒唐值 |
spo2_1st |
S_pO_2 | %,数值 | 脉搏血氧饱和度 |
abg_count |
arterial blood gas count | 次数,数值 | 首日动脉血气检测次数,是"监测强度"的代理 |
wbc_first |
first White blood cell count | K/uL,数值 | 白细胞 |
hgb_first |
first Hemoglobin | g/dL,数值 | 血红蛋白 |
platelet_first |
first Platelets | K/u(字典写作 K/u, numericL) | 单位与类型标注均有笔误 |
sodium_first |
first Sodium | mEq/L,数值 | 钠 |
potassium_first |
first Potassium | mEq/L,数值 | 钾 |
tco2_first |
first Bicarbonate | mEq/L,数值 | 碳酸氢根,不是总二氧化碳分压 |
chloride_first |
first Chloride | mEq/L,数值 | 氯 |
bun_first |
first Blood urea nitrogen | mg/dL,数值 | 尿素氮 |
creatinine_first |
first Creatinine | mg/dL,数值 | 肌酐 |
po2_first |
first PaO_2 | mmHg,数值 | 动脉氧分压 |
pco2_first |
first PaCO_2 | mmHg,数值 | 动脉二氧化碳分压 |
iv_day_1 |
input fluids by IV on day 1 | mL,数值 | 首日静脉入量,唯一一个"治疗"类变量 |
把五组加起来是 6 + 7 + 6 + 10 + 17 = 46,与官方 Methods 段声明的变量数一致。这个核对不是文字游戏:字典里任何一个字段被漏抄,都会让下游的"46 列"对不上,而复现别人的分析时,第一件要确认的事就是列数对不对。
2.3 一行数据的解剖
这张表没有病例号,所以"一行"只能靠字段之间的关系来读。把一行摊开,它讲的是这样一个故事:某位成人患者在某天某个钟点被收进某个 ICU(service_unit、day_icu_intime、hour_icu_intime),入科首个 24 小时里量到一组生命体征(map_1st、hr_1st、temp_1st、spo2_1st)、一组化验(九项常规加两项血气)、做过若干次血气(abg_count)、输过若干毫升液体(iv_day_1),既往带着若干合并症(十个标志位),病情严重度用两个评分概括(sapsi_first、sofa_first),期间有没有插动脉线(aline_flg),最后的结局落在那四个死亡标志与两个住院天数上。
读入这一行只需要两行代码:
import pandas as pd
#-- 一个文件就是全部数据;没有表间连接,没有主键
df = pd.read_csv('full_cohort_data.csv')
print(df.shape) #-- 行数 x 46
print(df.columns.tolist()) #-- 46 个列名,顺序不保证与字典一致
print(df.dtypes.value_counts()) #-- 数值列与字符列各占多少
shape 的第二维应当正好是 46。如果读出来是 47 或更多,多半是 CSV 里多了一个行索引列(pandas 在导出时默认写入 Unnamed: 0),需要 index_col=0 处理。这个坑在派生数据集里极其常见,而官方页不会提醒,因为它描述的是原始文件而不是你手上的副本。
2.4 行粒度、主键与"没有 ID"这件事
抽取脚本 mimic_aline_cohort.sql 的起点是一段带三条过滤的查询:取 SUBJECT_ICUSTAY_SEQ=1(每名患者的首次 ICU 住院)、ICUSTAY_AGE_GROUP='adult'(成人)、hadm_id 非空。第一条尤其关键——它保证了同一个患者在一次住院里只会出现一行,行与行之间在患者层面互相独立。
问题在于,这三条限制体现在 SQL 里,却没有体现在发布出来的 CSV 里:
| 信息 | 抽取脚本里有 | 发布 CSV 里有 | 后果 |
|---|---|---|---|
患者编号 subject_id |
有,是查询的起点 | 无 | 无法回连 MIMIC-II |
住院号 hadm_id |
有 | 无 | 无法与账单、诊断表对接 |
ICU 住院号 icustay_id |
有 | 无 | 无法接波形与护理记录 |
| 首次住院标记 | 有(SUBJECT_ICUSTAY_SEQ=1) |
无 | 只能信官方"一人一行"的说明 |
| 入组条件(通气、无升压药、非脓毒症) | 有,在最终建表语句的 where 里 | 无 | 只能读 SQL 才知道人群怎么来的 |
最后一行是核验过程中最有价值的一处发现。mimic_aline_data.sql 的末段有一句建表语句,把中间表裁成最终分析集,条件是五个并用:
#-- 摘自 aline-mimic-ii-master.zip 的 mimic_aline_data.sql 末段
create table aline_cohort_data_june15 as
select a.*, coalesce(m.treated, -1) as matched_flg
from aline_mimic_data_april15 a
left join aline_match m on m.icustay_id = a.icustay_id
where initial_aline_flg = 0 #-- 入科首小时没有动脉线
and vent_1st_24hr = 1 #-- 首日 24 小时内上过呼吸机
and sepsis_flg = 0 #-- 排除脓毒症
and vaso_flg = 0 #-- 排除用过升压药
and service_num <= 1; #-- 排除 CCU 与 CSRU
五条条件解释了三件在别处看不懂的事:为什么字典里的 sepsis_flg 注明"全部为 0"(因为脓毒症患者在入组时就被排掉了);为什么 service_num 只剩 0 与 1 两档(因为 CCU 记为 2、CSRU 记为 3,都被 <=1 排除);以及为什么暴露的语义是"后来插的管"而不是"有没有插管"(因为 initial_aline_flg=0 已经把入科首小时就有导管的患者剔除)。
这五条也带来一个新的麻烦:最终表里多出一列 matched_flg(-1 表示未进入匹配),而发布的 46 列字典里没有它。合理的解释是发布前又做了一次列裁剪,但页面没有说明裁剪规则。想逐列对齐 CSV 与字典,必须拿到文件本体;这一步在本次核验中因 403 无法完成。
2.5 宽表与长表:与 MIMIC 原生结构的差别
MIMIC 系列的原生结构是长表:chartevents 一行一次测量,labevents 一行一个检验结果,一个患者可能有上万行。IACCD 走的是完全相反的路——把每个患者的多条记录折叠成一行,每个概念只保留"首个"或"首日汇总"。
| 维度 | MIMIC 原生长表 | IACCD 宽表 |
|---|---|---|
| 行单位 | 一次测量、一次检验 | 一名患者 |
| 时间分辨率 | 精确到分钟 | 只有"首日"一个锚点 |
| 变量数 | 数千个 itemid | 46 列 |
| 缺失表达 | 没有那一行 | 该单元格留空 |
| 关联方式 | 靠 ID 多表连接 | 无 ID,无法连接 |
| 分析门槛 | 需要写复杂的抽取 SQL | 一行 read_csv 即可 |
| 典型用途 | 可复现研究、模型训练 | 教学、快速基线、方法对照 |
这张对照表解释了两类数据集为什么不能互相替代。长表保留了全部信息,也把清洗成本转嫁给了使用者;宽表把清洗成本前置到作者身上,代价是丢掉一切无法折叠成单值的东西。教学场景需要后者,研究场景需要前者。
折叠过程中丢掉的东西,可以用一个字段讲清楚。abg_count 记录的是"首日做了几次动脉血气",一个整数;而在长表里,每一次血气都是一个带时间戳的对象,含 pH、氧分压、二氧化碳分压、碳酸氢根、碱剩余、乳酸,以及当时的吸氧浓度。折叠之后,十次血气变一个"10",剩下九个数字连同时间信息一起消失。这不是作者偷懒,而是宽表的定义使然:一行要容纳一个人,就只能留下每类信息的第一个值或汇总量。理解这一点,就不会再问"为什么它没有乳酸"——它连"第几次血气"都没有。
2.6 时间的三个锚点
表里的时间只有三个锚点,混用会直接算错:
| 锚点 | 字段 | 语义 | 误用后果 |
|---|---|---|---|
| 入 ICU 当天 | 所有 _first、_1st、iv_day_1、abg_count |
入科后首个 24 小时内的值 | 当成"入院时"会与住院总时长错位 |
| 入 ICU 后第 N 天 | mort_day_censored |
死亡或删失发生在第几天 | 当日期用会得到 1970 年附近的假日期 |
| 出院 | hospital_los_day |
住院总天数 | 与 28 天窗口混用会切错随访期 |
day_28_flg 与 mort_day_censored 的组合才是完整的生存信息:前者是二分类结局,后者是时间与删失。只取前者会丢掉"什么时候死"的信息,只取后者会丢掉 28 天这个临床常用的判定窗。教科书第 16 章的做法是两者并用——先看 28 天死亡率,再做生存曲线。
§3 它是谁的数据:一个实验室的教学遗产
3.1 贡献者与托管方
署名只有一个人:Jesse Raffa,隶属 MIT 计算生理学实验室。PhysioNet 侧的角色是托管平台(RRID:SCR_007345),负责长期保存与版本发布,不参与数据生成。
这种"单人署名 + 平台托管"的组合在 PhysioNet 上很常见,但它带来的一个后果值得说清:数据的口径由作者一人决定,没有学会或联合体背书。好处是决策快、文档能写得像讲义;坏处是当口径与后续文献不一致时,没有一个外部委员会来裁定哪个才算"官方"。本文遇到的两处自相矛盾(章节号与参考文献编号,见 §3.2)就属于这类问题——不是谁抄错了,而是同一份文档在不同时间被改过。
还有一层背景值得点出:这套数据是教材的副产品,而教材的读者是临床医生与公共卫生研究者,不是机器学习工程师。这决定了很多设计——变量取"首日单点值"而不是时序,是因为临床讲课习惯用"入科时的情况"作起点;暴露取二值而不是剂量,是因为临床上关心的是"插没插";结局取 28 天而不是 30 天或 90 天,是因为这是重症文献里最常用的判定窗。理解了作者面向谁写作,很多看起来"不合理"的设计就变得合理了。
3.2 一条时间线,三处对不上
| 时间 | 事件 | 出处 |
|---|---|---|
| 2014 年 7 月 17 日 | 配套 GitHub 仓库建立,抽取脚本开始迭代 | 仓库元数据 |
| 2015 年 8 月 | Hsu 等人的倾向评分分析发表于 Chest 148 卷 6 期 | 官方 References |
| 2016 年 6 月 9 日 | PhysioNet 挂出"新增数据库 IACCD"公告 | 官方页公告区 |
| 2016 年 | Springer 教科书《Secondary Analysis of Electronic Health Records》出版 | 官方 References |
| 2016 年 10 月 28 日 | 数据集以 1.0 版正式发布 | 官方页版本区 |
| 2017 年 10 月 13 日 | 配套仓库最后一次推送 | 仓库元数据 |
三处"对不上"分别是:
第一,公告区说这项数据用于教科书"第 5 章 Data Analysis",而 Abstract 与 Usage Notes 都写"第 16 章"。同一份页面,两个章节号。
第二,正文的引用标注与文末参考文献的排列顺序错位。正文里 [1] 指向 Hsu 的研究、[2] 指向教科书、[3] 指向 MIMIC-II、[4] 指向 GitHub 代码;文末列表的实际顺序却是教科书、Hsu、Saeed 的 MIMIC-II 论文、GitHub。按标注去查第 1 条会查到教科书。
第三,发布日与公告日相差四个月。公告在 6 月,正式版本在 10 月,中间这段时间文件是否可下载、下载到的是哪个版本,页面没有交代。
这三处都不影响数据本身,但会影响引用。写论文时若照抄页面的 [1],就会把 Hsu 误标成教科书章节。
3.3 采集场景:一个被筛过的人群
官方对人群的描述分散在三处,拼起来才是完整画像:
| 来源段落 | 原话要点 | 推出的边界 |
|---|---|---|
| Abstract | 血流动力学稳定的呼吸衰竭患者 | 排除了需要升压药支持的休克病人 |
| Background | Hsu 等人的研究对象为机械通气且不需升压药者 | 入组要求首日机械通气 |
| Usage Notes | 首日机械通气、观察 28 天死亡 | 暴露与结局都锚在 ICU 首日 |
| 抽取脚本上游 | 首次成人 ICU 住院、成人年龄组 | 每人一行、不含儿童、不含再次入科 |
| 抽取脚本末段 | 首小时无导管、首日通气、无脓毒症、无升压药、排除 CCU 与 CSRU | 与论文入组条件逐条对应 |
四条叠起来,得到的是一个相当窄的人群:成人、首次进 ICU、首日上了呼吸机、循环还撑得住、没有用升压药。这类病人在 ICU 里既不是最重的,也不是最轻的,恰好是"插不插动脉线"最依赖医生习惯的那一段。研究设计上的精妙之处正在这里,代价是这张表不能代表整个 ICU 人群。
3.4 四层来源,一层比一层窄
| 层次 | 内容 | 规模 | 拿到什么 |
|---|---|---|---|
| 第一层 | MIMIC-II 原始数据库 | 多表、含波形与全部记录 | 需要单独申请,本文不涉及 |
| 第二层 | 抽取脚本圈定的队列 | 首次成人 ICU 住院,脚本注释里出现过 23455 这个中间计数 | 压缩包里的 SQL |
| 第三层 | 论文入组后的人群 | 1,776 人 | 就是发布出来的 CSV |
| 第四层 | 教科书第 16 章的分析样本 | 在 1,776 人上再做匹配与完整案例筛选 | 需要跑 R 代码才能得到 |
分清这四层,能避免一个常见的误会:把 1,776 当成"MIMIC-II 里插过动脉线的人数"。它不是。MIMIC-II 里插过动脉线的 ICU 住院远多于这个数,1,776 是经过三轮收窄之后剩下的教学样本。
§4 它最独特的东西
4.1 稀缺的不是数据,是"可复现的教学闭环"
公开的重症数据库不少,公开的带教科书的派生队列极少。多数派生数据集只给结果不给过程:给你一张表,告诉你可以做预测,然后就没有然后了。IACCD 给的是过程——从 SQL 怎么圈人,到倾向评分怎么估、怎么匹配、怎么检验,再到结果怎么读,全都写在同一本书的同一章里,代码还放在仓库里。
这个闭环有三个可验证的组成部分:抽取脚本(Data_Extraction/ 下的五个 SQL 文件,含队列构建、变量抽取、血气配对与配对数据生成)、分析脚本(Data_Analysis/ 下 R 与 Stata 两套,包含倾向评分匹配、交叉验证、配对检验)、成图脚本(Figures_Tables/ 下的 gnuplot 与 Graffle 源文件)。三样东西齐全,意味着别人可以逐行核对你的每一步,而不只是核对最终那个数字。
4.2 与其他重症公开资源的差异
| 资源 | 形态 | 规模量级 | 与 IACCD 的关系 |
|---|---|---|---|
| MIMIC-II 原始库 | 多表关系库 + 波形 | 数千患者、上万条记录每人 | IACCD 的上游,需单独申请 |
| MIMIC-III 临床库 | 26 张表的关系库 | 四万余人次 | 同一机构的后继版本,结构更复杂 |
| MIMIC-IV 临床库 | 模块化关系库 | 三十余万人次 | 更新的后继版本,含更完整的链接键 |
| eICU-CRD | 多中心关系库 | 二十余万次住院 | 唯一能做"多中心"的对照 |
| IACCD | 单表宽表 | 1,776 人 | 唯一自带完整教学闭环的一个 |
这张表最重要的不是数字,而是最后一列的措辞。IACCD 在"规模"维度上完全无法与前几个相比,在"可复现性"维度上却几乎无可替代——因为它把方法学的每一步都写进了可执行的代码,而其余几个只提供原材料。
4.3 一个具体的设计:为什么必须收窄人群
倾向评分的可信度取决于一件事:在给定协变量后,暴露的分配要接近随机。全 ICU 人群做不到这一点——休克病人几乎一定插管,平稳病人几乎一定不插,两组在病情上完全不重叠,任何匹配都会失败。
Hsu 等人的处理是把人群切到"重叠区":机械通气、不用升压药。在这段人群里,插管与否的差别更多来自科室偏好。这一步在方法学上叫限制(restriction),是最古老也最有效的混杂控制手段之一,比任何统计调整都硬。
这四条在配套 SQL 里是逐条落地的:initial_aline_flg=0 对应"入科首小时的暴露状态",vent_1st_24hr=1 对应机械通气,vaso_flg=0 对应不用升压药。也就是说,限制不是写在论文方法段里的口头承诺,而是能在代码里查到的一行 where 条件。
| 设计选择 | 作用 | 代价 |
|---|---|---|
| 限制在机械通气人群 | 保证两组都有血气监测需求 | 结论不能外推到不插管的自主呼吸患者 |
| 排除用升压药者 | 去掉"必须插管"的强适应证 | 结论不覆盖休克人群 |
| 倾向评分匹配 | 平衡可观测的基线差异 | 无法平衡未观测的混杂 |
| 28 天死亡为主结局 | 窗口统一,不易被住院时长干扰 | 丢失 28 天之后的差异 |
这四条加在一起,是一个典型的"用外部效度换内部效度"的交易。读这张表的人如果只记住一个数字,也应该记住这个交易的方向。
交易是否成功,还有一道必须检查的关口:重叠区。倾向评分只有在两组评分分布交叠时才有效,如果插管组的评分全部高于 0.8,说明临床上"该插的都插了",剩下的样本里根本没有可比对象,匹配只是把不可比的两组硬凑。教科书把这一步放在匹配之前,先画两组评分的分布,确认重叠再往下走。跳过这一步的后果很具体:匹配会成功返回结果,平衡性检验也可能通过,但通过的样本是经过极端筛选的残余,效应估计反而更偏。
| 检查项 | 通过标准 | 不通过时怎么办 |
|---|---|---|
| 评分重叠 | 两组分布在中间区间有交集 | 收窄人群或增加限制条件 |
| 共同支撑 | 每个评分区间两组都有样本 | 修剪尾部样本并说明 |
| 匹配后平衡 | 标准化差异落到可接受范围 | 调整协变量或匹配算法 |
| 有效样本量 | 匹配后剩余样本足够估效应 | 改用加权而非匹配 |
4.4 标签的粒度:一个暴露,五个结局
与影像或波形数据集相比,这里的"标注"极简:没有逐例人工判读,没有多标注者一致性,只有从数据库里算出来的规则化标签。
| 标签 | 类型 | 来源 | 是否人工核验 |
|---|---|---|---|
aline_flg |
暴露,二值 | 床边记录中动脉压记录的存在性 | 否,规则生成 |
day_28_flg |
主结局,二值 | 死亡记录与时间窗比较 | 否,规则生成 |
hosp_exp_flg |
次要结局,二值 | 住院死亡标志 | 否,规则生成 |
icu_exp_flg |
次要结局,二值 | ICU 死亡标志 | 否,规则生成 |
censor_flg + mort_day_censored |
生存结局 | 死亡日或末次随访日 | 否,规则生成 |
“没有人工核验"不是缺陷,而是这类数据库派生表的常态:它的可信度来自源数据库的记录质量,而不是来自标注流程。真正需要警惕的是规则本身的边界——aline_flg 的定义是"首小时之后、住院期间是否出现过动脉压记录”,而不是"是否置入了导管",两者在绝大多数情况下一致,但在记录缺失或导管已拔的患者身上会出现偏差。
4.5 边界条件一览
| 边界 | 具体值 | 依据 |
|---|---|---|
| 年龄 | 成人;超过 120 岁统一改写为 91.4 | 抽取脚本的 case 分支 |
| 住院次序 | 仅首次 ICU 住院 | SUBJECT_ICUSTAY_SEQ=1 |
| 观察窗 | 入 ICU 首日 | 字段名后缀 _first / _1st / _day_1 |
| 结局窗 | 28 天,另有院内与 ICU 内死亡 | 字典对三个 flg 的定义 |
| 中心数 | 1(单一医学中心) | 官方未提多中心,且源自单一数据库 |
| 科室 | FICU、MICU、SICU 三类,CCU 与 CSRU 已被排除 | service_unit 取值与建表条件 |
| 入组排除 | 首小时已有导管、未通气、脓毒症、用升压药 | 建表语句的五条 where |
| 变量上限 | 46 列,不可扩展 | 官方声明与字典一致 |
| 回连能力 | 无 | 46 列中不含任何 ID |
§5 怎么拿到:从一次下载到一张可分析表
5.1 目录结构
官方给的路径是项目页下的版本目录,文件平铺,没有子目录:
| 路径 | 类型 | 说明 |
|---|---|---|
/content/mimic2-iaccd/ |
项目页 | 摘要、背景、方法、数据描述、使用说明、许可、DOI |
/content/mimic2-iaccd/1.0/ |
版本页 | 与项目页内容一致,URL 带版本号,适合引用 |
/files/mimic2-iaccd/1.0/full_cohort_data.csv |
数据文件 | 唯一的分析数据 |
/files/mimic2-iaccd/1.0/data_dictionary.txt |
字典 | 46 行释义 |
/files/mimic2-iaccd/1.0/aline-mimic-ii-master.zip |
代码包 | SQL + R + Stata + 成图脚本 |
这里有一件必须在正文里说清的事:本次核验时,项目页与版本页都返回 200,但 /files/ 下的目录与 CSV 均返回 403,页面提示为"该地区因法律或政策限制无法提供数据"。因此下面的字段表与文件清单来自官方 Data Description 段落的正文描述,而不是从 CSV 读出来的实际表头。这个区别很重要——正文描述与真实表头之间是否逐字一致,本文无法确认,已列入 §10 的未核验项。
5.2 三种拿法
按使用场景分,拿到数据有三条路,成本依次递增:
| 方式 | 命令或入口 | 适合谁 | 注意 |
|---|---|---|---|
| 浏览器直接下载 | 项目页 Files 区 | 只想快速看一眼 | 需要能通过区域与许可校验 |
| 命令行下载 | curl -L -O 加文件 URL |
要写脚本、要进 CI | 403 时要先解决访问资格,不要盲重试 |
| 只用代码包 | 单独取 zip,数据另寻 | 想先看抽取逻辑 | 代码包不含数据,只有 SQL 与 R |
#-- 建立工作目录
mkdir -p iaccd && cd iaccd
#-- 三个文件逐个取;若返回 403,说明当前网络出口不在允许区域
curl -fL -O https://physionet.org/files/mimic2-iaccd/1.0/full_cohort_data.csv
curl -fL -O https://physionet.org/files/mimic2-iaccd/1.0/data_dictionary.txt
curl -fL -O https://physionet.org/files/mimic2-iaccd/1.0/aline-mimic-ii-master.zip
#-- 校验:CSV 首行应当有 46 个逗号分隔的列名
head -1 full_cohort_data.csv | awk -F',' '{print NF}'
curl -f 的作用是让 403 直接失败而不是把错误页存成 CSV。这个习惯能省掉后面最难查的一类 bug:文件存在、能读、但内容是 HTML。
5.3 读进来先做四件事
数据只有一张表,但读进来之后的检查不能省。四件事按顺序做:
import pandas as pd
df = pd.read_csv('full_cohort_data.csv')
#-- 1. 列数与官方声明核对
assert df.shape[1] == 46, df.shape
#-- 2. 暴露与主结局必须存在且只有两个取值
for c in ['aline_flg', 'day_28_flg']:
assert set(df[c].dropna().unique()) <= {0, 1}, c
#-- 3. 反向编码的那一列单独看一眼
print(df['censor_flg'].value_counts(dropna=False)) #-- 0 是死亡,1 是删失
#-- 4. 常数列与全空列挑出来
const_cols = [c for c in df.columns if df[c].nunique(dropna=False) <= 1]
print(const_cols) #-- 预期至少含 sepsis_flg
第四步不是洁癖。把常数列留在特征矩阵里,会让某些模型的系数估计直接报错,也会让另一些模型给出无意义的权重;而这类列在派生数据集里往往是"上游有、下游没用上"的残留,靠肉眼翻字典很难发现。
5.4 三处必须手工修正的编码
官方字典里有三处需要在使用前处理,处理方式都不复杂,但不处理会出错:
| 问题 | 字典原文 | 影响 | 处理 |
|---|---|---|---|
| 暴露的取值说明写成 year | 1 = year, 0 = no |
只是拼写错误,语义不受影响 | 无需改数据,注释里说明即可 |
| 血小板单位与类型标注残缺 | K/u, numericL |
单位应为 K/uL,类型应为 numeric | 按 K/uL 处理,不要按字符串读 |
| 脓毒症标志恒为 0 | absent (0) for all |
该列零方差,且入组已排除该病 | 建模前删除,方法段说明排除条件 |
还有一处不是错误但极易误读:体温的单位是华氏度。字典写的是 Temperature (F, numeric),若按摄氏度处理,36.5 会变成 97.7,任何基于体温阈值的规则都会失效。
#-- 华氏转摄氏;只在需要临床阈值时做,不做归一化
df['temp_c'] = (df['temp_1st'] - 32) * 5 / 9
#-- 删除零方差列,并留一份列名清单进附录
drop_cols = ['sepsis_flg']
df = df.drop(columns=[c for c in drop_cols if c in df.columns])
5.5 从宽表到分析表的三步
教科书第 16 章的流程可以压缩成三步:定暴露与结局、选协变量、做匹配与检验。
| 步骤 | 做什么 | 用到的字段 | 常见错误 |
|---|---|---|---|
| 一 | 定暴露 aline_flg、主结局 day_28_flg |
两列二值 | 把 hosp_exp_flg 当主结局,随访窗变长 |
| 二 | 选协变量:人口学、严重度、合并症、首日生理 | 第三、四、五组共 33 列 | 把 icu_los_day 放进协变量,它处于因果通路下游 |
| 三 | 估倾向评分、匹配、比较结局 | 全部 | 匹配后不检查平衡性就直接报效应 |
第二步的错误最隐蔽。住院时长既是暴露的结果,也是结局的前兆,把它放进倾向评分模型会在通路上做调整,把真实的效应部分抹掉。这类"调整了不该调整的变量"的问题在观察性研究里极常见,而这张表恰好提供了一个能讲清楚的例子。
同一类的陷阱还有三个,都可以在这 46 列里找到具体对应:hosp_exp_flg 与 icu_exp_flg 是结局的直接组成部分,不能当协变量;abg_count 是监测强度的代理,而监测强度本身可能受插管影响,属于暴露后的变量;iv_day_1 是首日治疗,同样落在暴露之后的通路上。判据只有一句:这个变量是在插管之前就确定了的,还是插管之后才可能被改变的。前者可以入模,后者一律不进。用这条判据筛一遍,46 列里真正能当基线协变量的只剩三十列上下。
5.6 五个坑
| 坑 | 表现 | 后果 | 规避 |
|---|---|---|---|
| 把 F 当 C | 体温集中在 95–100 区间 | 阈值规则全错 | 先看取值区间再定单位 |
把 censor_flg 当"是否死亡" |
死亡组被标成 1 | 效应方向整体反转 | 记住 0 才是死亡 |
用 sepsis_flg 做亚组 |
亚组为空 | 分析无法进行 | 建模前剔除 |
拿 service_num 和 service_unit 同时入模 |
完全共线 | 系数不可估 | 二选一 |
| 以为有患者 ID | 找不到任何 ID 列 | 无法外连、无法分组 | 需要 ID 就用 MIMIC-III/IV |
§6 与库内词条的关系
6.1 关系图谱
把库内的重症类词条按"结构 × 规模"摆开,IACCD 的位置很边缘,但边界很清楚:
| 词条 | 结构 | 规模量级 | 与 IACCD 的关系 |
|---|---|---|---|
| MIMIC-III 临床库 | 关系库,26 张表 | 四万余人次 | 上游同门,可做同题重做 |
| MIMIC-III 旧版入口 | 关系库 | 同上 | 版本差异,引用时注意区分 |
| MIMIC-III 波形库 | 波形 + 临床 | 数千段记录 | 提供 IACCD 缺失的连续信号 |
| 波形匹配子集 | 波形与临床对齐 | 子集 | 想做"插管前后血压"必须用它 |
| MIMIC-IV 临床库 | 模块化关系库 | 三十余万人次 | 更新一代,可做时间外验证 |
| MIMIC-IV 急诊库 | 关系库 | 急诊就诊 | 提供入 ICU 之前的那一段 |
| eICU-CRD | 多中心关系库 | 二十余万次住院 | 唯一可做跨中心对照 |
| eICU 旧版入口 | 关系库 | 同上 | 版本差异 |
| FIDDLE 特征矩阵 | 派生宽表 | 数万次住院 | 同类思路的规模化版本 |
| 院内感染风险数据集 | 派生表 | 中等 | 同为"从 MIMIC 派生一张任务表" |
| IACCD | 单表宽表 | 1,776 人 | 规模最小、闭环最完整 |
6.2 检索路径
| 你要找的东西 | 检索词 | 会落到哪里 |
|---|---|---|
| 同一临床问题的更大样本 | arterial line、IAC、propensity |
MIMIC-III/IV 中的同类研究 |
| 插管前后的连续血压 | waveform、matched subset |
MIMIC-III 波形库与其匹配子集 |
| 多中心外部验证 | eICU、multi-center |
eICU-CRD |
| 现成的重症特征矩阵 | FIDDLE、feature matrix |
FIDDLE 派生集 |
| 院感与并发症 | nosocomial、catheter infection |
院内感染风险数据集 |
| 教学用的最小可跑案例 | case study、textbook |
本表 |
6.3 分工判据
| 任务 | 该用哪个 | IACCD 的角色 | 原因 |
|---|---|---|---|
| 因果方法教学 | IACCD | 主力 | 一行命令读完,当天能讲完 |
| 因果方法的大样本验证 | MIMIC-III/IV | 不适用 | 1,776 人估不出稳定的边际效应 |
| 重症预测模型训练 | MIMIC-IV | 冒烟测试 | 规模差两个数量级 |
| 波形与血流动力学研究 | 波形库 | 不适用 | 无信号 |
| 跨中心泛化 | eICU-CRD | 不适用 | 单中心 |
| 复现一篇具体论文 | IACCD + 原著 | 主力 | 论文、代码、数据三者齐全 |
| 数据工程教学 | IACCD | 主力 | 编码瑕疵多,适合讲清洗 |
§7 质量评估与局限性
7.0 读评分之前的一个前置校正
评价这张表时最容易犯的错,是拿"训练集"的尺子量它。它从设计之初就不是训练集:作者要的是一份能在课堂上从头讲到尾的材料,所以必须在规模上做减法——太大了,一次课讲不完;变量太多了,学生抓不住重点。1,776 人与 46 列,是这个目标下的合理取舍,而不是采集能力的天花板。
这个校正会改变对分数的读法:规模一项它必然低,但"单位成本的信息密度"一项它很高。把两者混为一谈,就会得出"数据太少不值得用"的结论,而忽略它在教学与方法对照上的不可替代性。
7.1 五维评分
按常用数据质量维度打分,每项 1–5 分,标准是"作为重症观察性研究教学数据":
| 维度 | 分数 | 理由 |
|---|---|---|
| 规模 | 2 | 1,776 行,估边际效应不稳定,做训练远远不够 |
| 变量完整性 | 3 | 覆盖暴露、结局、主要混杂,缺用药、缺时序、缺 ID |
| 文档质量 | 4 | 字典逐条列出,但有三处瑕疵与两处自相矛盾 |
| 可复现性 | 5 | SQL、R、Stata、成图脚本齐备,罕见 |
| 可获取性 | 4 | ODC-BY、免注册,但部分地区被地理限制拦截 |
总分 18(满分 25)。这个分布很有特点:两项满分附近,两项中等,一项明显短板。它说明这不是一个"通用数据资源",而是一个目标极其明确的工具。
7.2 质量的两个层次:定义层与取值层
评价这类规则生成的表,要把"定义对不对"和"取值准不准"分开看。
定义层指的是每个字段的语义是否站得住。day_28_flg 定义为入 ICU 后 28 天内死亡,窗口清楚;hosp_exp_flg 定义为院内死亡,窗口随住院时长变化。两个都合理,但混用会把"住院时间长"误当成"死亡风险高"。
取值层指的是单元格里的数是不是真的。这一层本文无法确认——文件目录返回 403,CSV 本体没有取到。所以凡是涉及"某一列里有多少个 1"的问题,本文一律不答。
| 层次 | 能判断什么 | 本文的结论 |
|---|---|---|
| 定义层 | 字段语义、编码方向、单位 | 可判断,三处瑕疵已定位 |
| 取值层 | 数值是否正确、缺失多少 | 不可判断,需拿到 CSV |
| 关联层 | 与源数据库是否一致 | 不可判断,需回连 MIMIC-II |
7.3 可枚举的偏差
| 偏差 | 表现 | 影响 | 缓解 |
|---|---|---|---|
| 选择偏差 | 只保留机械通气、不用升压药者 | 结论不能外推到休克或自主呼吸患者 | 在论文里明确限制人群 |
| 单中心偏差 | 一家医学中心、一套流程 | 插管习惯与别处不同 | 用 eICU 做对照 |
| 时间偏差 | 数据来自本世纪初的一段时期 | 重症指南已多次更新 | 视为历史队列 |
| 暴露误分类 | aline_flg 依据记录存在性,且只覆盖首小时后置管者 |
记录缺失时被判为未插管;首小时置管者已被剔除 | 敏感性分析与人群说明 |
| 幸存者偏差 | 首日数据要求患者活到测量 | 极早期死亡者信息不全 | 报告入组流程 |
| 缺失机制 | 化验不是随机缺失,按病情开单 | 完整案例分析会有偏 | 多重插补或缺失指示 |
| 结局竞争 | 出院是死亡的竞争事件 | 院内死亡分析需竞争风险模型 | 用原因别风险模型 |
| 版本漂移 | 数据 2016 冻结,代码 2017 还在改 | 复现结果可能与论文略有出入 | 锁定提交哈希 |
这张表里最值得展开的是"缺失机制"那一行。临床化验不是随机缺失:医生给谁开血气,取决于他觉得谁需要看血气,而这个判断与病情、与有没有动脉线都相关。于是 po2_first 缺失的人,平均病情可能与有值的人不同。完整案例分析(只留有值的人)会把这种差异放大成选择偏差,而且偏差方向不定——它既可能高估插管的好处,也可能相反。可行的处理是三条一起报:完整案例分析、多重插补、以及把"是否缺失"当作一个显式变量。三条结果方向一致,结论才站得住。
7.4 外部验证的角色矩阵
| 角色 | 做法 | 讲得通的地方 | 风险 |
|---|---|---|---|
| 教学复现 | 照教科书第 16 章跑一遍 | 数据、代码、讲解三者对齐 | 结果与原著不完全一致属正常 |
| 方法对照 | 同一份数据上比 PSM 与 IPTW | 暴露与结局完全固定,只变方法 | 样本小,估计量方差大 |
| 预测模型冒烟 | 跑通管线,检查缺失与编码 | 快、无门槛 | 性能数字无意义 |
| 跨库外测 | 在 MIMIC-III 训练,这里测试 | 变量名可对齐 | 人群与年代差异混在一起 |
| 敏感性分析基准 | 换匹配半径、换协变量集 | 结论稳健性可量化 | 需要固定随机种子 |
7.5 它为什么还在被引用
按官方页的浏览计数(1,542 次,含全部版本),它的访问量在 PhysioNet 上属于中等偏下。这个量级说明它不靠"数据大"吸引人,靠的是"讲得清"。
它不会被新库替代的原因很具体:新库可以提供更大的样本,但很难提供一本已经出版、已经被引用、章节与代码一一对应的教材。教学材料有路径依赖——一门课用了五年,就不会因为出现了更大的数据集而换掉案例。这既是它的护城河,也是它的天花板。
§8 生态位与历史
8.1 沿革
IACCD 的诞生路径在 PhysioNet 上不算典型。多数数据集是"有数据,找平台";它是"有研究,有教材,顺手把数据也发了"。顺序反过来,导致它的文档风格更像书稿而不是数据说明——有背景、有动机、有致谢,甚至有一句"感谢原著作者允许我们以他们的工作为基础"。
这种做法在 2016 年之后变少了。后来的重症数据集大多由实验室团队维护,配独立的数据说明书、版本日志与 DOI 体系,而不再依附于某本书。IACCD 更像那个过渡期的产物:数据共享的意识已经有了,规范还没完全成型。
8.2 与教学传统的关系
PhysioNet 一直有"用真实数据教学"的传统,从早期的波形库到后来的挑战赛,都把"可复现的练习"当成公共品。IACCD 是这条线上少见的一个表格数据教具——前面十几年的教具几乎都是信号,而临床研究的方法学训练需要的恰恰是表格。
这也解释了它为什么选择"一张表"而不是"一个库":教学需要的是边界清楚的小世界,不是无限展开的大世界。
8.3 生态位
| 角色 | 大库 | 教学表 |
|---|---|---|
| 提供什么 | 原材料、规模、多样性 | 完整流程、可读文档、可跑代码 |
| 典型用户 | 建模团队、竞赛选手 | 教师、方法学研究者、刚入门的学生 |
| 成功标准 | 模型性能、泛化能力 | 讲得清、跑得通、结论可讨论 |
| 失败模式 | 清洗成本高、文档缺失 | 规模不足、外推受限 |
| 代表 | MIMIC-IV、eICU-CRD | IACCD |
8.4 谁在用它
| 使用者 | 用法 | 证据强度 |
|---|---|---|
| 教科书读者 | 跟着第 16 章做案例 | 官方 Usage Notes 明示 |
| 方法学课程 | 讲倾向评分与匹配 | 官方定位即为此 |
| 复现研究 | 核对 Hsu 2015 的结论 | 数据与论文同源 |
| 数据工程教学 | 讲派生表的编码瑕疵 | 本文整理的瑕疵清单 |
| 重症建模者 | 当冒烟测试集 | 常见做法,缺公开统计 |
§9 使用指引
9.1 三种角色的路径
| 角色 | 第一天 | 第一周 | 注意 |
|---|---|---|---|
| 临床研究者 | 读 Abstract 与第 16 章,确认人群与暴露定义 | 复现匹配前后基线表 | 别把住院天数当协变量 |
| 方法学研究者 | 拉出 46 列,按用途分组 | 在同一数据上比三种估计量 | 固定种子,报告置信区间 |
| 数据工程 | 读字典,找出三处瑕疵 | 写一个能吃掉脏编码的读取器 | 华氏温度与反向标志是必测项 |
9.2 一条最短的可用流程
#-- 1. 取三个文件(403 说明当前出口被区域限制)
for f in full_cohort_data.csv data_dictionary.txt aline-mimic-ii-master.zip; do
curl -fL -O "https://physionet.org/files/mimic2-iaccd/1.0/$f"
done
#-- 2. 解压代码包,看抽取逻辑
unzip -q aline-mimic-ii-master.zip -d code
#-- 3. 确认列数
head -1 full_cohort_data.csv | awk -F',' '{print "列数:", NF}'
import pandas as pd
from sklearn.linear_model import LogisticRegression
df = pd.read_csv('full_cohort_data.csv')
df = df.drop(columns=['sepsis_flg']) #-- 零方差列
#-- 华氏转摄氏,仅用于临床可读性
df['temp_c'] = (df['temp_1st'] - 32) * 5 / 9
cov = ['age', 'gender_num', 'bmi', 'sapsi_first', 'sofa_first',
'map_1st', 'hr_1st', 'temp_c', 'spo2_1st', 'abg_count',
'wbc_first', 'hgb_first', 'platelet_first', 'creatinine_first',
'bun_first', 'sodium_first', 'potassium_first', 'tco2_first',
'chf_flg', 'afib_flg', 'renal_flg', 'liver_flg',
'copd_flg', 'cad_flg', 'stroke_flg', 'mal_flg', 'resp_flg']
X = df[cov].copy()
y = df['aline_flg']
#-- 倾向评分:只估"会不会插管",不估死亡
ps = LogisticRegression(max_iter=2000).fit(X.fillna(X.median()), y)
df['ps'] = ps.predict_proba(X.fillna(X.median()))[:, 1]
print(df.groupby('aline_flg')['ps'].describe()) #-- 看重叠区是否成立
最后一行打印的是倾向评分的分布摘要。它的用途只有一个:检查两组是否落在同一个区间。如果某一组的评分几乎全在 0.9 以上,说明限制条件没做够,匹配会失败——这一步比匹配本身更重要,也最常被跳过。
9.3 引用方式
| 引用对象 | 内容 |
|---|---|
| 数据集 | Raffa J. Clinical data from the MIMIC-II database for a case study on indwelling arterial catheters (version 1.0). PhysioNet. 2016. doi:10.13026/C2NC7F |
| 原著研究 | Hsu DJ, et al. Chest. 2015;148(6):1470–1476. doi:10.1378/chest.15-0516 |
| 教科书章节 | Raffa JD, Ghassemi M, Naumann T, Feng M, Hsu D. Data Analysis. In: Secondary Analysis of Electronic Health Records. Springer, 2016 |
| 上游数据库 | Saeed M, et al. Crit Care Med. 2011;39(5):952–960 |
| 平台 | PhysioNet 平台论文,按官方 Cite 按钮生成 |
写方法段时建议额外注明三件事:使用的版本号(1.0)、是否用了压缩包里的分析脚本、以及倾向评分的协变量集。第三项在多篇复用同一数据的研究之间差异最大,不写清就无法比较。
§10 AI 使用声明
| 项目 | 声明 |
|---|---|
| 文本生成 | 本文由 AI 辅助撰写,人工把关结构与事实 |
| 数字来源 | 仅取规模、结构、边界三类,来自官方页、版本页与配套仓库 |
| 页面核验 | 项目页与 1.0 版本页均返回 200,内容逐段读取 |
| 文件核验 | /files/ 目录与 CSV 返回 403(区域限制),未取到数据本体 |
| 字段来源 | 46 个字段的释义来自官方 Data Description 段的字典正文 |
| 脚本核验 | 队列 SQL、变量 SQL 与仓库文件树经直接访问确认,建表条件逐条抄录 |
| 不一致说明 | 章节号(5 与 16)、参考文献编号、发布日与公告日三处已列于 §3.2 |
| 论文信息 | 仅依据官方页给出的题录,未读 Chest 与教科书全文 |
| 未核验内容 | CSV 实际行数、各字段取值与缺失、建表条件与论文方法段的逐条对应 |
| 图像 | 无配图;封面为生成式提示词,不含真实病历或波形 |
| 免责 | 不构成临床建议;使用须遵守 ODC-BY 1.0 的署名要求 |
常见误读(避坑清单)
| 说法 | 实际 | 证据 |
|---|---|---|
| 「这是 MIMIC-II 的完整下载」 | 只有 46 列汇总值,没有时间序列、没有波形 | 官方 Methods 段与字典 |
| 「它包含 46 个变量,所以有 46 个特征可用」 | 其中一列是全 0 的 sepsis_flg(入组已排除脓毒症),两列星期信息重复,service_num 与 service_unit 共线 |
字典备注、建表条件与取值域 |
「aline_flg 表示入 ICU 首日是否插管」 |
表示住院期间是否出现过动脉压记录,脚本用 itemid 51/52 判定 | 抽取脚本 mimic_aline_cohort.sql |
「censor_flg=1 表示死亡」 |
1 表示删失,0 才是死亡 | 字典原文 0 = death, 1 = censored |
| 「体温单位是摄氏度」 | 华氏度 | 字典原文 Temperature (F, numeric) |
| 「有患者编号可以回连 MIMIC-II」 | 46 列里没有任何 ID | 官方字典逐条核对 |
| 「它是 2015 年论文的原始数据集」 | 是为教科书重建的快照,与原分析集不完全相同 | 官方 Background 段「recreated for the purpose of the textbook」 |
| 「1,776 就是 MIMIC-II 里插过动脉线的人数」 | 是五条入组条件叠加后剩下的教学样本 | mimic_aline_data.sql 末段建表语句 |
| 「SAPS 指的是 SAPS II」 | 字典写的是 SAPS I | 字典原文 first SAPS I score |
| 「下载链接随时可用」 | 部分地区返回 403,页面提示法律或政策限制 | 本次核验时 /files/ 目录 403 |
FAQ
Q1:IACCD 到底有多少条记录?为什么不说"行数"?
官方能给的确定数字是 1,776 名患者,Abstract 写的是"summary clinical data and outcomes for 1,776 patients"。至于 CSV 里有多少行,官方页没有明写,本文核验时又因文件目录返回 403 无法打开文件确认。按抽取脚本"每名患者仅取首次 ICU 住院"的约束推断,应当是 1,776 行;但在拿到文件之前,这个推断只能算推断。想确认,读入后打印 df.shape 即可,一秒的事。
Q2:sepsis_flg 全是 0,是不是数据坏了?
不是坏,是入组条件的结果。字典在括号里写了 absent (0) for all,而配套 SQL 的建表语句里有 sepsis_flg=0 这一条,说明脓毒症患者在建表阶段就被排除了,剩下来的当然全是 0。这在使用上意味着两件事:以脓毒症为条件的亚组分析在这份数据上做不了;把它放进特征矩阵会引入一列常数。正确做法是建模前删掉,并在方法段说明人群本身就排除了脓毒症,否则会被误读成"这批人恰好都没有脓毒症"。
Q3:能不能用它复现 Hsu 2015 的结论?
能复现流程,未必能复现数字。两者有三处差异:一是数据是 2016 年为教科书重建的快照,重建过程可能改过变量的取值口径;二是原著的分析集与本表的人群不完全相同,本表是在 initial_aline_flg=0 的前提下建表的,即已剔除入科首小时就有导管的患者,这个选择会改变效应估计的目标人群;三是匹配算法、匹配半径、协变量集的具体设置要与原著逐项对齐。合理的目标是复现"方向与量级",而不是逐位复现小数点。
Q4:为什么这张表没有患者编号?这不是设计缺陷吗?
从数据链接的角度看是缺陷,从隐私与教学目标看是取舍。去掉 ID 之后,这份文件无法与任何其他表连接,也就无法反向识别个人;同时它迫使使用者把注意力放在"这张表自己能回答什么"上。代价很实在:不能补充波形、不能做患者级分组、不能核对源记录。需要这些能力时,应该直接用 MIMIC-III/IV 而不是在这张表上想办法。
Q5:它和 MIMIC-III、MIMIC-IV 该怎么选?
看你要的是"讲清楚"还是"算准确"。要在一节课里把观察性研究的全流程走完、让每个人都能跑通,用这张表;要估计稳定的效应量、做亚组、做外部验证,用 MIMIC-III 或 MIMIC-IV;要做跨中心,用 eICU-CRD。三者不是替代关系:常见的合理组合是用 IACCD 定方法与代码骨架,再搬到 MIMIC-IV 上跑规模。
Q6:许可到底允许什么?
数据侧是 ODC-BY 1.0,允许包括商业用途在内的使用与再分发,条件是署名。代码侧不同——GitHub 仓库标注的是 MIT License,允许修改与再分发,同样要求保留版权声明。两者要分开遵守:引用数据时按官方 Cite 给出的格式,复用代码时保留 MIT 声明。另外,许可允许不等于技术上可取,区域限制是另一层门槛,与许可无关。
术语表
| 术语 | 解释 |
|---|---|
| IAC | 动脉留置导管,置入动脉以连续监测血压并方便采血 |
| IACCD | 本数据集的简称,Indwelling Arterial Catheter Clinical dataset |
| MIMIC-II | 某医学中心重症监护的多参数数据库,本表的上游 |
| 倾向评分 | 在给定协变量下接受暴露的概率,用于平衡两组基线 |
| 匹配 | 按倾向评分把暴露组与对照组配对,构造可比样本 |
| IPTW | 逆概率加权,用倾向评分的倒数给样本加权 |
| 适应证混杂 | 因临床指征导致的暴露分配不均,是观察性研究的主要威胁 |
| 限制 | 通过缩小研究人群控制混杂的手段,比统计调整更硬 |
| 暴露 | 研究中被认为可能影响结局的因素,此处为是否插管 |
| 删失 | 随访在事件发生前终止,只知道"到某天还活着" |
| 竞争风险 | 某一事件的发生阻止了另一事件被观察到 |
| SAPS I | 简化急性生理评分第一版,用于衡量入科病情 |
| SOFA | 序贯器官衰竭评分,逐系统累加,反映器官功能 |
| ABG | 动脉血气分析,测 pH、氧分压、二氧化碳分压等 |
| 宽表 | 一行一个分析单位、每个概念一列的表结构 |
| 长表 | 一行一次观测、靠 ID 聚合的表结构 |
| ODC-BY | 开放数据共享署名许可,允许商用但须署名 |
| RRID | 研究资源标识符,此处用于标识 PhysioNet 平台 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 层级 |
|---|---|---|---|
| 患者数 | 1,776 | 官方 Abstract 与公告 | 官方页 |
| 变量数 | 46 | 官方 Methods 段 | 官方页 |
| 字典字段数 | 46 | 官方 Data Description 段逐条计数 | 官方页 |
| 文件数 | 3 | 官方 Data Description 段 | 官方页 |
| 合并症标志 | 10 个 | 字典 | 官方页 |
| 首日生理与化验 | 17 个 | 字典 | 官方页 |
| 结局与时长字段 | 7 个 | 字典 | 官方页 |
| 版本号 | 1.0 | 版本区,仅一个版本 | 官方页 |
| 发布日期 | 2016-10-28 | 项目页头部 | 官方页 |
| 公告日期 | 2016-06-09 | 公告区 | 官方页 |
| DOI(v1.0) | 10.13026/C2NC7F | 引用框与 Discovery 区 | 官方页 |
| DOI(最新) | 10.13026/1r5h-4p36 | Discovery 区 | 官方页 |
| 数据许可 | ODC-BY 1.0 | Access 区 | 官方页 |
| 代码许可 | MIT | 仓库元数据 | 仓库 |
| 年龄处理 | 超过 120 岁记为 91.4 | 抽取 SQL 的 case 分支 | 仓库 |
| 住院次序 | 仅首次 ICU 住院 | 抽取 SQL 的 where 条件 | 仓库 |
| 页面浏览计数 | 1,542 | 项目页计数区 | 官方页 |
附录 B:数字的来源分层
第一层,官方页与官方文件。 1,776 名患者、46 个变量、三个文件、五个结局字段、十个合并症标记、许可、两枚 DOI、两个日期、章节号与文献编号的两处矛盾。这些都能在项目页与 1.0 版本页上逐字找到。
第二层,配套仓库的可执行证据。 年龄上限改写为 91.4、仅取首次 ICU 住院、暴露由 itemid 51/52 判定、代码许可为 MIT、仓库的创建与最后推送日期。这些来自 SQL 与仓库元数据,属于"作者实际怎么做的",比文字描述更硬。
第三层,未核实。 CSV 的实际行数、每个字段的取值与缺失、建表条件与论文方法段是否逐条一致、原著的效应量。五条入组条件已从 SQL 读出,但"这五条就是 1,776 的全部来源"仍属推断——中间表可能还有别的裁剪,而页面没有交代。
附录 C:参考文献
| 编号 | 文献 | 链接 | 用途 |
|---|---|---|---|
| 1 | 数据集项目页 v1.0 | https://physionet.org/content/mimic2-iaccd/1.0/ | 全部规模、结构、许可与日期信息 |
| 2 | PhysioNet 平台综述(2026,Nature Health) | https://doi.org/10.1038/s44360-026-00096-z | 托管模式与引用规范 |
| 3 | Hsu DJ 等,Chest 2015 | https://doi.org/10.1378/chest.15-0516 | 临床问题与原始设计 |
| 4 | Raffa JD 等,教科书第 16 章 | https://link.springer.com/book/10.1007/978-3-319-43742-2 | 案例分析流程 |
| 5 | Saeed M 等,Crit Care Med 2011 | https://doi.org/10.1097/CCM.0b013e31820a92c6 | 上游数据库说明 |
| 6 | 配套代码仓库 | https://github.com/MIT-LCP/aline-mimic-ii | 抽取与分析脚本 |
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- mimic-iii — 共享标签:重症监护 / 电子病历 / 队列数据
- mimiciii-legacy — 共享标签:重症监护 / 电子病历 / 衍生数据集
- mimic3wdb — 共享标签:重症监护 / 生理信号
- mimic3wdb-matched — 共享标签:重症监护 / 队列数据
- mimic-iv-clinical-database — 共享标签:重症监护 / 电子病历 / 队列数据
- mimic-iv-ed — 共享标签:重症监护 / 电子病历
- eicu-crd — 共享标签:重症监护 / 多中心队列
- eicu-collaborative-legacy — 共享标签:重症监护 / 多中心队列
- mimic-eicu-fiddle-feature — 共享标签:重症监护 / 衍生数据集
- nosocomial-risk-mimic — 共享标签:重症监护 / 临床表格
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

