肤色与血氧的那些误差 — ENCoDE 皮肤色调度量库

128 名急性期患者 / 16 个部位 167 项度量 / OMOP CDM v5.4

来源 https://physionet.org/content/encode-skin-color/1.0.0/发布时间: 2026-10-28最后更新: 2026-10-28 阅读 22
肤色与血氧的那些误差 — ENCoDE 皮肤色调度量库

信息速览

数据集名称肤色与血氧的那些误差 — ENCoDE 皮肤色调度量库
数据类型结构化表格,派生特征,图像数据,临床测量,受限获取
规模128 名急性期患者 / 每人单次住院
接入方式https://physionet.org/content/encode-skin-color/1.0.0/
AI 就绪度

一台脉搏血氧仪最常夹的地方是食指指尖。它发出 660 纳米的红光与 940 纳米的红外光穿过手指,比较氧合血红蛋白与还原血红蛋白对两种光的吸收差异,几秒钟给出一个 SpO₂ 读数。这个读数在过去几年被反复质疑:在动脉血氧饱和度(SaO₂,由动脉血气分析给出)相同的情况下,肤色偏深的人被测到的 SpO₂ 系统性偏高,于是真正缺氧的人被判成"还行",学界给这种现象起了个名字,叫隐匿性低氧血症。更麻烦的是研究方法本身——多数研究拿"种族"这个自我报告的社会分类当作肤色的代理变量,而同一种族内部的肤色跨度极大,且种族会把住房、收入、就医延迟这些非生物因素一并带进模型,最后估计出来的偏差究竟来自皮肤还是来自处境,说不清。要把肤色换成能直接进入模型的自变量,就得有人真的去量它。ENCoDE 就是这份测量:杜克大学医院前瞻性入组 128 名急性期住院患者,在十六个身体部位采集每部位 167 项肤色变量与两项体温变量,连同同一住院的电子病历一起,按 OMOP CDM v5.4 组织,2024 年 8 月发布。它的门槛同样实在:不是开放下载库,要完成 CITI 培训、签署数据使用协议并通过凭证化审批才能拿到;单中心、最深肤色人群代表性不足、部分部位缺席测量且不做插补。它是目前公开可得的、把肤色从社会类别变成测量变量的最完整尝试,但不是一份拿来就能跑的大表。

一屏速览

维度 内容
全名 ENCoDE, mEasuring skiN Color to correct pulse Oximetry DisparitiEs: skin tone and clinical data from a prospective trial on acute care patients
托管平台 PhysioNet(MIT 计算生理实验室维护)
贡献机构 杜克大学、杜克大学医院、塔夫茨医学中心
版本 1.0.0
首次发布 2024 年 8 月 22 日
患者数 128 名
住院次数 与患者数相同(每位入组患者只对应一次住院)
测量部位 16 个身体部位
每部位度量 167 项肤色变量加 2 项体温变量(不含图像)
每患者图像 10 张非生物识别部位图像,iPhone 与 Android 分别存放
数据模型 OMOP CDM v5.4
目录组成 8 张 CSV 表加一个 Image record 图像目录
访问方式 凭证化访问,仅签署数据使用协议的用户可取文件
许可 PhysioNet Credentialed Health Data License 1.5.0
必需培训 CITI「Data or Specimens Only Research」
DOI 10.13026/mcgk-1s42(v1.0.0);10.13026/33g5-v628(最新版)
伦理批件 杜克大学医学中心伦理委员会,豁免知情同意,批件号 Pro00110842
典型用途 SaO₂-SpO₂ 偏差的肤色归因、设备校正、健康公平研究、OMOP 联邦分析

§1 它要解决的具体麻烦

1.1 代理变量失效,而替代品一直缺位

脉搏血氧偏差的研究陷入过一个方法论上的死结。研究者想知道"肤色是不是导致偏差的原因",手上却没有肤色的测量值,只能退而求其次拿种族顶替。这个替代有两个硬伤。第一,同一个自我报告类别内部,肤色跨度可以从很浅到很深;用一个类别代表一个连续量,等于把最需要区分的那部分差异平均掉了。第二,种族在美国医疗语境里与就医可及性、合并疾病负担、保险状态高度纠缠,把它放进模型,估计出来的系数既含生物因素也含社会因素,没法用于指导设备校正——设备厂商能改的是光路与算法,改不了患者的处境。

要解开这个结,只有一条路:真的去测。而且必须在真正会用脉搏血氧仪的人身上测。血流动力学不稳、外周灌注差、在重症监护病房长期使用血管活性药的急性期患者,正是脉搏血氧最容易失准的人群。这也是为什么 ENCoDE 选择了前瞻性入组住院患者,而不是招募一批健康志愿者在实验室里量一圈。

1.2 三条常见的错误期待

第一条,期待它是开放下载库。它不是。官方页面的访问策略一栏写明:只有签署了数据使用协议的凭证化用户才能访问文件,并且要求完成 CITI 培训。把它写进一个"下周就要出结果"的计划里,会卡在第一周。

第二条,期待它给出一个可以直接喂模型的肤色数值。它没有单一的官方标量。它给的是三套施测式量表的档位、一台比色仪的读数、两台分光光度计的色空间分量、以及两款手机摄像头的处理后通道特征,合计 167 项。选哪一项当"肤色",是研究设计要回答的问题,不是数据已经替你回答好的问题。

第三条,期待它人多。128 名患者,单一医疗中心。它是一份变量维度深、样本维度浅的资源,用来验证机制、用来做方法学对照,而不是用来做大批量训练。

1.3 它能给到的与给不到的

你的需求 它给的 够不够
同一 SaO₂ 下肤色深浅造成的 SpO₂ 偏差 全部患者的入组条件就是"抽动脉血气前 5 分钟内有脉搏血氧读数" 够,这是入组的硬门槛
不同设备量肤色的一致性 同一部位叠加视觉量表、比色、分光光度、手机拍照四类手段 够做设备间一致性分析
部位之间的肤色差异 16 个部位逐部位同口径测量 够,且覆盖全部脉搏血氧可夹部位
肤色之外可用的协变量 化验、生命体征流水数据、人口学信息 够,随 OMOP 表一同发布
用种族代理与用肤色度量做对照 同一批 128 人身上同时保留种族、族裔概念与量化肤色读数 够,这是它设计的独特点
原始未处理的皮肤照片 只发布处理后图像 不够
腹侧手指与手掌、足趾的原始图像 明确不予发布 不够,官方列为潜在生物识别部位
多中心肤色对照 单一医疗中心 不够,官方把它写在 Limitations 里
最深肤色人群 官方写队列超过四成为黑人患者,但最深肤色代表性有限 不够,官方原文即写 limited

1.4 你的处境与它能帮到的事

你的处境 它能帮你什么 下一步该做什么
你在做脉搏血氧产品校正,需要带 SaO₂ 真值对照的皮肤色调度量 入组条件保证每人至少一对 SaO₂-SpO₂,且配同部位多设备肤色读数 先理清各度量值的时间对齐口径,再决定用哪套设备读数做分层变量
你在做 OMOP 联邦研究,手上已有其他 OMOP 库 它本身就是 CDM v5.4,概念映射已完成并由两名临床人员确认 按 person_id 与 visit_occurrence_id 对齐后做跨库分析,注意临时自定义概念以 2 开头
你想研究"该用哪把尺子量肤色" 三套视觉量表、一台比色仪、两台分光光度计、两款手机在同一部位同框 把"哪一种测量更接近生理实质"作为研究问题本身来设计
你在做健康公平的医学影像研究 提供经 HIPAA 安全港处理的真实临床环境图像资源 用它做真实床旁环境与控制背景的对照,注意已知的人群限制
你在写关于代理变量的方法学论文 把种族代理与量化肤色放在同一批 128 人身上比较 两个模型要在同一结局上对齐,否则比较不成立
你在搭急需出数的产品线 什么都帮不上——三道行政手续你走不起 换用开放许可的替代资源

最后一行不是玩笑。凭证化资源的等待周期以周计,把它放在关键路径上,是项目排期里最常见的一类事故。

1.5 一句话判断

它不是更大的血氧库,而是第一次拥有肤色自变量的血氧库:样本量小得刺眼,变量维度深得罕见,两者共同决定了它的用法是回答机制问题,而不是刷榜单。

1.6 不适合谁:四条边界

不适合第一天就想下载的人。 凭证化审批、CITI 培训、数据使用协议签署,三道手续一道都不能省。把它当成顺手加一组数据的外挂,会卡死在项目排期上。

不适合做人群代表性研究。 官方的局限说明写得很清楚:单中心,且最深肤色的代表性有限。任何以肤色深浅的人群结局差异为终点、并打算把结论外推到更广人群的设计,都不能只靠这一份数据。

不适合做时间趋势研究。 日期时间被按 HIPAA 安全港规则整体随机平移,中心设在未来 50 年。绝对时间与时间间隔两者的解读方式完全不同,任何跨月度、跨年度的流行病学设计都要先处理这一点。

不适合期待患者层面的完整性。 部分患者中途拒绝继续测量,或被临床处置打断,由此产生的部分缺失官方明确不做插补。这既是它的诚实之处,也是它最麻烦的地方——使用者必须自己承担处理缺失的责任。

§2 数据构成与规格

2.1 八张 CSV 表加一个图像目录

官方页面在数据描述的最后给出了完整的表清单。它不按设备或部位分文件,而是把全部结构化数据压进 OMOP 的通用表结构里。这是它最核心的设计选择,也是它与大多数"一个受试者一个文件"的临床数据集最大的区别。

文件 官方说明 在读什么
PERSON.csv 人级人口学数据:出生年份、种族、性别、族裔 一行一名患者,患者相对稳定的静态属性
VISIT_OCCURRENCE.csv 住院细节:入院与出院时间、入院时年龄 官方说明每位入组患者只有一次住院,故行数与人数相同
MEASUREMENT.csv 化验与生命体征,以及各部位的肤色与皮肤温度 全库最长的一张表,长表存放
OBSERVATION.csv 脉搏血氧仪放置部位的信息 探头放在哪儿,这是 SaO₂-SpO₂ 配对的关键上下文
DEVICE_EXPOSURE.csv 患者的氧气输送装置 给氧方式不同会改变 SpO₂ 的判读位置
PROCEDURE_OCCURRENCE.csv 患者是否正在接受氧疗 同上,以操作记录形态出现
OBSERVATION_PERIOD.csv 每名患者记录的时间区间 用来界定可分析窗口
CONCEPT.csv 无法映射到标准 OMOP 概念的所有肤色与温度度量 自定义临时概念,ID 以 2,000,000,xxx 形式给出
Image record/ 处理后的 iPhone 图像与 Android 图像分开存放 文件名格式为 person_id 加 location_id

这张表要说清的一件事是:所有非标准概念的语义全部外挂在 CONCEPT.csv 里。不读这张表,MEASUREMENT 里的那些皮肤色调度量就只是一串毫无意义的十位数 ID。

2.2 字段字典:OMOP 通用列在本库装的是什么

由于采用 CDM v5.4,各表列名沿用 OMOP 规范。下表按哪一张表、哪一列、在本库里装什么来排列。

表 列 在本库装的内容 使用注意
PERSON person_id 去标识后重新映射的患者主键 与真实病历号无关,官方说由就诊号随机重映射而来
PERSON gender_concept_id 性别 标准 OMOP 性别概念
PERSON year_of_birth 出生年份 只精确到年,配合 VISIT 的入院年龄使用
PERSON race_concept_id、ethnicity_concept_id 种族与族裔 这是它最微妙的一列:保留了可用于代理变量对照的社会类别
VISIT_OCCURRENCE visit_occurrence_id 去标识后重映射的就诊主键 官方说明就诊数等于患者数
VISIT_OCCURRENCE visit_start_datetime、visit_end_datetime 入院与出院时间 已按 HIPAA 安全港整体平移
OBSERVATION_PERIOD observation_period_start_date、end_date 记录可用区间 划分析窗口时使用
MEASUREMENT person_id、visit_occurrence_id 双外键 连接 PERSON 与 VISIT_OCCURRENCE 的键
MEASUREMENT measurement_concept_id 皮肤色调度量本身的概念,按部位区分 官方用它编码哪个部位、哪套量表或设备、哪一项指标
MEASUREMENT unit_concept_id 测量设备与厂商信息,以及具体标度 官方原话:此列存放设备、制造商与具体测量标度的信息
MEASUREMENT value_as_number 数值型读数 官方示例取值分别为 4、15、255
MEASUREMENT measurement_source_value 原始图像的路径,针对图像衍生特征 想回溯到图像文件时使用
OBSERVATION observation_concept_id 等 脉搏血氧仪放置部位 由研究协调员直接观察与向临床 staff 询问两条来源构成
CONCEPT concept_id 10 位临时概念 ID,以 2 开头 与 MEASUREMENT 的两列 ID 对应
CONCEPT concept_name 可读概念名,形如 SKINTONE@部位__设备.度量 解析规则见 2.3 小节
DEVICE_EXPOSURE device_exposure 系列列 氧气输送装置 与 PROCEDURE_OCCURRENCE 区分:一个是器械,一个是操作

有一个字段特别值得强调。unit_concept_id 在本库里被复用成"设备与标度"的容器,而不是传统意义上的物理单位。习惯了毫米汞柱这类解读的人第一次上手会卡住——在这里它回答的是"用什么量的",而不是"量出来的数是什么单位"。

2.3 一条记录的完整解剖:长表里的一行

官方页面用一张示例表演示了 MEASUREMENT 与 CONCEPT 的对应关系。这是全库最容易伪装成看一眼就懂、实则最容易理解错的地方。

示例 MEASUREMENT_CONCEPT_ID VALUE_AS_NUMBER CONCEPT_ID CONCEPT_NAME
模板 临时 ID xx 临时 ID SKINTONE@部位_设备厂商.度量
示例 1 2,000,000,368 4 2,000,000,368 SKINTONE@FINGER_LEFT DORSAL__ADMINISTERED-VISUAL-SCALES_CARD.MONKSKINTONESCALE
示例 2 2,000,000,569 15 2,000,000,569 SKINTONE@FINGER_LEFT VENTRAL__KONICAMINOLTA_CM700D.CIE-L*
示例 3 2,000,000,546 255 2,000,000,546 SKINTONE@FINGER_LEFT VENTRAL__GOOGLE_PIXEL4.AVG-RED

把 concept_name 拆开读,规则是四段:

片段 含义 示例中的取值
SKINTONE@ 固定前缀,标识这是一条皮肤色调度量 三例均为 SKINTONE
到双下划线为止 指定十六个部位之一 FINGER_LEFT DORSAL、FINGER_LEFT VENTRAL
双下划线之后到英文句点 设备或方法名,含厂商 ADMINISTERED-VISUAL-SCALES_CARD、KONICAMINOLTA_CM700D、GOOGLE_PIXEL4
英文句点之后 该项度量的具体指标名 MONKSKINTONESCALE、CIE-L*、AVG-RED

示例 2 的取值 15 对应 CIE-L*,这是 CIE Lab* 色空间里的明度分量;示例 3 的取值 255 对应红通道均值,是零到二五五之间的整数。两者尺度完全不同,却挤在同一列 value_as_number 里。同一个数值列里混着若干互不可比的尺度,这是官方页面没有显式警告、但从上表可以直接看出的事实。任何在未解析 concept_name 前提下对 value_as_number 做跨行运算的代码,得出的结果都是错的。

还有一个容易忽略的细节:示例 2 与示例 3 的部位都是 FINGER_LEFT VENTRAL,也就是被列为潜在生物识别、排除发布原始图像的那个部位。这说明腹侧的皮肤色调度量并没有被删除,被排除的只是图像文件本身。官方去标识一节的写法也印证了这一点:从这些图像算出的处理后特征,例如 RGB 均值或标准差,不被视为生物识别信息,因此不予排除。换句话说,看得见数字,看不见照片。

2.4 十六个部位怎么编号

官方在方法部分给出了十六个部位的构成,在另一张对照表里给出了其中十个(即发布了图像的十个)部位与 location_id 的对应关系。两者合并起来才是完整图景。

躯区 官方描述 部位数 进入图像发布的部位编号
左上肢与右上肢 指腹背侧与腹侧、手掌背侧与腹侧 8 1 左手指背侧、3 左手掌背侧、5 右手指背侧、7 右手掌背侧
头部 额头、耳垂内侧面与外侧面 3 9 额头、10 耳垂外侧、11 耳垂内侧
胸骨 胸骨 1 12 胸骨
左下肢与右下肢 足趾背侧与腹侧 4 13 左足趾背侧、15 右足趾背侧
合计 全部部位 16 10 个部位发布图像

反过来看,未进入图像发布的正是六个腹侧部位:左右手指腹侧、左右手掌腹侧、左右足趾腹侧。官方对排除范围的原文是"可能存在生物识别信息的部位",具体指左右手指、手掌与足趾的腹侧。数字上完全对得上:10 加 6 等于 16。

需要单独说明的是,这六个腹侧部位对应的 location_id 编号官方页面没有给出。对照表只列出十个编号,1 到 15 之间的 2、4、6、8、14 是空隙,看上去像是留给腹侧部位,但这样只有五个空位而需要六个编号,说明编号还可能延续到 16 或采用别的排法。这一条本文无法核验,列入文末的未核验内容。

2.5 四类手段加两项体温的度量口径

官方在这一节给出的设备型号,是全文少有的、可以直接追溯到具体商品的信息。

类别 设备或量表 型号与材质 官方用语 产出形态
施测式视觉量表 Fitzpatrick Skin Type 打印在 4 英寸乘 6 英寸相纸上 administered visual scales 有序档位,由协调员对照判读
施测式视觉量表 Monk Skin Tone Scale 同上 administered visual scales 有序档位
施测式视觉量表 Von Luschan 比色尺度 同上 administered visual scales 有序档位
反射式比色 Delfin SkinColorCatch 芬兰 Delfin Technologies colorimetric 比色读数
反射式分光光度 Konica Minolta CM-700d 日本柯尼卡美能达 spectrophotometric 色空间分量值,如 CIE-L*
反射式分光光度 Variable Spectro 1 Pro Variable Inc spectrophotometric 同类色空间分量
手机摄影 iPhone SE 2020 Apple photography via mobile phone cameras 处理后各通道均值与标准差
手机摄影 Google Pixel 4 或 4a Google 摘要写 Pixel 4 (Android),方法节写 Pixel 4a,CONCEPT 命名写 GOOGLE_PIXEL4 同上
体温,官方冠以 clinical HoMedics HTD8813C HoMedics infrared temperature 温度值
体温,官方冠以 general IDEAL Model 61-847 IDEAL infrared temperature 温度值

图像处理的流程官方也写明了:把每张手机图像转到灰度,选取亮度高于中位数的最大轮廓作为最亮区域,据此制作掩膜以剔除无关像素,再在掩膜范围内提取每个 RGB 通道与每个 LCH 通道的均值与标准差,作为与该患者肤色相关的特征。这个流程意味着图像目录里的图像已经是处理过的产物,文件名里的 location_id 按上一小节的对照表解读。

测量姿势与背景方面,官方给了两条操作性约定,写在这里是因为它们属于结构信息:患者在卧位或坐位下被测量;测量耳垂、必要时也包括手指时,在另一侧垫一张黑卡。这两条直接影响图像衍生特征的可复现性——别人复刻这套流程时少垫一张黑卡,边缘光就会改变。

2.6 主键映射:三层结构与它的意外好处

OMOP 的层级在本库里被压得很薄,因为每人只有一次住院。

层 表 主键 本库的情况
人 PERSON person_id 128 行,按官方给出的患者数
就诊 VISIT_OCCURRENCE visit_occurrence_id 官方明确:行数与人数相同
事件 MEASUREMENT、OBSERVATION 等 复合 多行对应同一个 visit_occurrence_id

这个"薄"带来一个直接的后果:在本库里做数据集划分,等于按人划分。没有"同一个人的多次住院"需要操心,而这在别的 OMOP 库里是首要的泄漏陷阱。反面代价同样明确:没有纵向随访,做不了同一个体的前后对照,也做不了跨年份的趋势分析——何况时间还被平移了。

连接路径很固定:先从 CONCEPT 找到你关心的 concept_name 与 concept_id;再用 concept_id 去 MEASUREMENT 里筛 measurement_concept_id;最后用 person_id 与 visit_occurrence_id 回到 PERSON 与 VISIT_OCCURRENCE 取人口学与住院上下文。反向也能走,但经 CONCEPT 过滤总是第一步。

§3 它是谁的数据

3.1 贡献者与署名

官方页面给出六位作者:Sicheng Hao(杜克大学)、Katelyn Dempsey(杜克大学)、João Matos(杜克大学)、Mahmoud Alwakeel(杜克大学医学院内科系)、Jared Houghtaling(塔夫茨医学中心)、An Kwok Wong(杜克大学)。除一位来自塔夫茨医学中心外,其余均在杜克体系内。

这是一份典型的临床信息学实验室主导、临床科室协作的作者构成。值得注意的是利益冲突披露:Wong 在 Ataia Medical 持有股权并担任管理职务,同时受美国国立卫生研究院下属国家少数族裔健康与健康差异研究所的 REACH Equity 项目资助,基金号 U54MD012530。这些信息写在官方页面上,不是隐藏内容;任何把这份数据用于设备评测、特别是涉及厂商比较的场合,都应当把这两条一并披露——健康公平这一领域的结论天然处在利益审视之下。

3.2 时间线

时间 事件 出处
2024 年 2 月 团队在预印本平台发表前序队列研究,讨论危重患者中肤色对脉搏血氧的作用 官方页面参考文献所列 medRxiv 预印本,doi:10.1101/2024.02.24.24303291
2024 年 8 月 7 日 配套资源论文提交至预印本平台 PubMed 摘要与 medRxiv,doi:10.1101/2024.08.07.24311623
2024 年 8 月 22 日 数据集 v1.0.0 在 PhysioNet 发布 PhysioNet 官方页面
2024 年及此后 以单一版本 1.0.0 维护,未见版本修订记录 PhysioNet 官方页面版本区

时间线上最值得注意的事实是它的薄。2024 年 2 月的方法学预印本、8 月的资源论文、8 月 22 日的数据发布,几乎是一口气完成的。这意味着 v1.0.0 是从一条已经跑通的分析管线上倒出来的一次性产物,而不是一个持续积累的资源。使用者由此应当假定:后续不会有人追加患者,不会有修正版,除非团队另有公开宣布。

3.3 采集场景:杜克大学医院的重症病房与普通病房

入组地点是美国北卡罗来纳州达勒姆的杜克大学医院住院部。入组条件写得极窄且明确:在 Epic Clarity 临床数据仓库中,存在至少一次在动脉血气 SaO₂ 之前 5 分钟内记录的脉搏血氧 SpO₂ 值。官方把这种组合称为 SaO₂-SpO₂ 对。患者的知情同意、各项测量与电子病历数据统一存入 REDCap。

排除标准共有四类,每一类都指向同一件事:这一处的肤色读数会被非肤色因素污染。分别是——无法去除的指甲油,干扰指端光学路径与视觉判读;因血管并发症入院,例如血管移植或支架植入,涉及动脉供血不足;肢体截肢,部位缺失;以及由白癜风、黄疸、伤口或淤青造成的皮肤变色。

把这四条连起来读,能读出设计者的取舍:宁可少收患者,也不收一个读数不可信的部位。这与那种先收满若干例、再在论文里写局限性声明的做法相反。代价是样本停在 128 人。

3.4 数据来源的四个层次与去标识处理

层 内容 是否公开 影响
床旁原始设备读数 视觉量表判读、比色与分光光度计读数、手机原始照片 照片不发布,读数经聚合后公开 原始图像拿不到,只能拿到处理后图像与衍生特征
REDCap 研究数据库 知情同意、测量记录、研究流程数据 否 采集过程的审计轨迹不可得
Epic Clarity 数据仓库 住院信息、人口学、化验、生命体征流水 是,经 OMOP 转换后 电子病历侧分析的边界由仓库抽取范围决定
OMOP CDM v5.4 发布包 八张 CSV 加图像目录 是,凭证化访问 这是使用者唯一能触及的一层

去标识严格按 HIPAA 安全港条款执行,官方给了四条具体做法:每名患者的日期时间信息向未来随机平移,中心位于 50 年之后;就诊号与病历号被随机重映射为 visit_occurrence_id 与 patient_id;所有测量值先当作字符串求值,经过白名单筛选后才参与去标识处理;潜在生物识别部位的图像不予发布,而从这些图像算出的处理后特征不被视为生物识别信息,因而保留。

有一条容易被低估:日期时间被整体平移,且中心在未来 50 年。这条规则保住了时间间隔,同一患者内部的前后关系仍然成立;同时抹掉了绝对时间,做不了季节、年度、政策实施前后的对比,年份本身也失去外部参照。对想把这份数据与其他按真实日期标记的外部事件连起来的研究,这是一道无法绕开的墙。

§4 它最独特的东西

4.1 稀缺性:把种族代理换成测量变量

肤色相关的公开数据集并不少。皮肤病形态学图像库可以训练分类器,皮肤纹理库可以做分割,公平性基准库可以评估模型在人群间的表现差异。但它们几乎都不具备两件事:同一住院里配对的 SaO₂-SpO₂,以及按同一口径在多个脉搏血氧可夹部位上量化出来的肤色。

ENCoDE 两样都有。这两件事合起来打开了一个此前做不了的研究设计:在同一批人身上,既可以用社会类别建模,也就是现有文献的通行做法,也可以用连续化的肤色读数建模,也就是设备校正真正想知道的东西,然后直接比较两个模型给出的偏差估计。这不是再多一个变量的改良,而是把一场方法学争论变成可以算的实验。

它的稀缺性还有一个副产品。由于全程使用 OMOP CDM v5.4,概念也经人工映射并由两名临床人员确认,这份数据可以与其他 OMOP 格式的资源做联邦。官方在使用说明里的原话是,这种 OMOP 数据格式使其更易于与类似数据集连接。

4.2 差异化证据:同一部位的四把尺子

在同一个 FINGER_LEFT VENTRAL 上,官方给出的度量至少横跨四把完全不同的尺子。它们的差异不是精度之争,而是肤色这个概念本身的多面性。

尺子 它量的是 官方示例中的片段 优势 短板
Monk Skin Tone Scale 视觉比对给出的档位,示例取值 4 ADMINISTERED-VISUAL-SCALES_CARD.MONKSKINTONESCALE 便宜,贴近临床直觉 依赖施测者判读,档位离散
Fitzpatrick Skin Type 按日晒反应分型的档位 同前缀下的另一项 临床文档里最常见 原本描述日晒反应,不完全等于色素沉着
Von Luschan 比色尺度 玻璃比色板的比对档位 同前缀下的另一项 与历史文献可比性好 档位定义带有年代印记,与现代量表不对齐
Konica Minolta CM-700d 的 CIE-L* 分光光度计给出的明度分量,示例取值 15 KONICAMINOLTA_CM700D.CIE-L* 客观、连续、可跨中心比较 设备昂贵,难以在床旁普及
Google Pixel 4 的 AVG-RED 手机图像红通道均值,示例取值 255 GOOGLE_PIXEL4.AVG-RED 极便宜,可规模化 受环境光、黑卡放置、厂商图像管线影响

这张表真正的用途是提醒:肤色不是一个数,而是一族彼此只是部分相关的度量。用哪一个当暴露变量,决定了论文会得出什么结论。多数人第一次拿到这份数据会直接取单一分光光度计读数,因为在直觉上仪器测得的最准;但设备校正这一应用真正需要的,可能是患者在临床现场会被怎样看与那条脉络的物理实质之间的落差。

4.3 案例:从一行 MEASUREMENT 反推研究写法

取官方示例 3 那一行:概念编号 2,000,000,546,概念名 SKINTONE@FINGER_LEFT VENTRAL__GOOGLE_PIXEL4.AVG-RED,取值 255。把它放大成一个可执行的分析骨架:

步骤 做什么 为什么这一步不能省
1 在 CONCEPT 里按 SKINTONE@ 前缀筛出全部概念名 只有这里能拿到部位、设备、指标三段语义
2 把概念名拆成部位、设备、指标三列并落成宽表 不拆就只能在 value_as_number 上做跨尺度运算,必错
3 用 person_id 与 visit_occurrence_id 关联 VISIT_OCCURRENCE 与 PERSON 拿到入院年龄、性别、种族与族裔概念,用于代理变量对照建模
4 从 OBSERVATION 取到采血当时的血氧探头放置部位 用错部位的人去解释这一部位的偏差,是常见的因果错配
5 从 DEVICE_EXPOSURE 与 PROCEDURE_OCCURRENCE 取给氧状态 高浓度吸氧会把 SpO₂ 顶到平台区,把偏差掩盖掉
6 只在同一设备同一指标的读数内部做部位间比较 保证比较发生在同一个尺度之内

这六步没有任何技巧,但漏掉任何一步都会让结论站不住。第 4 步尤其关键也尤其常被忽略:既然官方同时提供了研究协调员直接观察与向临床 staff 询问血气时刻探头位置这两条来源,那么被测量的部位与当时夹着探头的部位是否一致,本身就是一个需要显式处理的问题,而不能默认一致。

4.4 标注粒度:空间极细,时间偏粗

它的粒度可以概括成一句话:空间粒度极细,时间粒度偏粗。

空间上,十六个部位逐个标记,部位名直接写进概念名;设备厂商与具体指标也写进概念名。这三段信息是全库最精细的部分,也是它相对其他血氧资源的全部优势所在。

时间上则不然。OMOP 的 MEASUREMENT 表带有时间列,但官方页面并没有说明每一次床旁测量相对于那一次动脉血气的时间关系,也没有给出各项读数彼此之间的时间间隔信息。可以确定的是入组门槛:脉搏血氧读数落在动脉血气之前至多 5 分钟。也就是说,真正用来锚定因果的那对值之间的时间窗是 5 分钟,而逐行级别的时间对齐关系需要使用者自行从表中还原,且日期已被整体平移。

这个粗细不均决定了用法边界:任何"某一时刻测得的肤色如何改变读数偏差"的分析都成立;任何"肤色随住院天数变化"的分析都不成立,因为官方没有说明是否对每个部位做过重复测量。

4.5 边界条件:什么情况下它不再适用

条件 是否适用 判断依据
分析带 SaO₂ 对照的脉搏血氧偏差 适用,且几乎没有替代品 入组条件即 SaO₂-SpO₂ 配对
比较不同肤色测量设备的实效 适用 四把尺子在同一部位同期测得
建立 OMOP 联邦分析管线 适用 CDM v5.4,概念已人工映射
训练大规模皮肤色调度量模型 不适用 128 名患者,单中心
训练指纹或掌纹相关的生物识别模型 不适用,且被官方主动排除 六个腹侧部位图像不予发布
做季节、年度或政策前后的时间对比 不适用 日期整体平移,中心在未来 50 年
代表最深肤色人群 不适用 官方局限说明原话:最深肤色代表性受限
研究美甲、截肢、黄疸人群的肤色 不适用 这些是入组时的排除条件

§5 怎么拿到

5.1 目录结构与本文的核验边界

必须先说清楚一件事:本库是凭证化访问资源,官方文件目录对未授权请求返回拒绝响应。因此下面这份目录结构是从官方页面数据描述一节所列的文件名重建的,不是文件层面的直接核验结果。行数、文件大小、图像分辨率与张数这类需要落到文件上的数字,本文一律不给。

路径,按官方页面描述 内容 核验状态
PERSON.csv 人口学 文件名来自官方页面,内容未核验
VISIT_OCCURRENCE.csv 住院信息 同上
MEASUREMENT.csv 化验、体征、肤色与皮肤温度 同上
OBSERVATION.csv 血氧探头部位 同上
DEVICE_EXPOSURE.csv 氧疗装置 同上
PROCEDURE_OCCURRENCE.csv 是否正在接受氧疗 同上
OBSERVATION_PERIOD.csv 记录时间窗 同上
CONCEPT.csv 自定义临时概念 同上
Image record 目录,含 iPhone 与 Android 子目录 处理后图像 同上

把这一限制写在前头,是因为它决定了本文所有数字的可信等级:规模、结构、边界三类数字来自官方正文;任何需要打开文件才能确认的数字都不在本文中。这不代表官方页面不可信,而是代表核验层级不同。

5.2 申请与下载

凭证化资源的标准流程通常分三段:先完成官方要求的伦理培训,本库要求 CITI 的 Data or Specimens Only Research 课程;再申请项目并通过身份核验获得凭证化用户身份;最后签署 PhysioNet Credentialed Health Data Use Agreement 1.5.0 并获批。获批之后才能看到文件目录。

#-- 凭证化资源不能用匿名 wget 直接拉,先做连通性检查,预期返回 403
curl -sL -o /dev/null -w "%{http_code}\n" \
     https://physionet.org/content/encode-skin-color/1.0.0/

#-- 获批后用带凭据的方式下载;用户名与口令换成自己的
wget -r -N -c -np --user "$PHYSIONET_USER" --password "$PHYSIONET_PASS" \
     https://physionet.org/files/encode-skin-color/1.0.0/

#-- 也可以只用 CSV,先把八张表的结构跑通再取图像
curl -sL -H "Authorization: Bearer $TOKEN" \
     https://physionet.org/files/encode-skin-color/1.0.0/PERSON.csv -O

这三段命令的重点是第一段:预期返回 403 而不报错,正是凭证化访问生效的证据。把这个检查放进项目立项清单,比写完代码才发现拿不到数据要便宜得多。

5.3 加载八张表的最小骨架

import pandas as pd

FILES = ['PERSON', 'VISIT_OCCURRENCE', 'MEASUREMENT', 'OBSERVATION',
         'DEVICE_EXPOSURE', 'PROCEDURE_OCCURRENCE',
         'OBSERVATION_PERIOD', 'CONCEPT']

d = {f: pd.read_csv(f'{f}.csv', low_memory=False) for f in FILES}

#-- 先看自定义概念,这是理解全库的入口
con = d['CONCEPT']
print(con.columns.tolist())
sk = con[con['concept_name'].astype(str).str.startswith('SKINTONE@')]
print(sk.shape)

最后两行是全库最有价值的一段代码。SKINTONE@ 这个前缀把自定义临时概念与标准 OMOP 概念分开,也把要解释的事与背景信息分开。

5.4 长表转宽表:部位、设备、指标三段拆列

import pandas as pd

NAMES = ['PERSON', 'VISIT_OCCURRENCE', 'MEASUREMENT', 'OBSERVATION',
         'DEVICE_EXPOSURE', 'PROCEDURE_OCCURRENCE',
         'OBSERVATION_PERIOD', 'CONCEPT']
d = {f: pd.read_csv(f'{f}.csv', low_memory=False) for f in NAMES}

con = d['CONCEPT']
con = con[con['concept_name'].astype(str).str.startswith('SKINTONE@')]

#-- 把 concept_name 拆成 location / device / measure 三段
pat = r'^SKINTONE@(?P<location>.+?)__(?P<device>.+?)\.(?P<measure>.+)$'
ext = con['concept_name'].astype(str).str.extract(pat)
con = pd.concat([con[['concept_id']], ext], axis=1)

mea = d['MEASUREMENT']
mea = mea.merge(con, left_on='measurement_concept_id',
                right_on='concept_id', how='inner')

#-- 按 (设备, 指标) 组合铺成宽表,避免不同尺度混在一列里
wide = mea.pivot_table(index=['person_id', 'visit_occurrence_id', 'location'],
                       columns=['device', 'measure'],
                       values='value_as_number',
                       aggfunc='first')
print(wide.shape)

这份数据正确的读取方式只有一种:按设备与指标分批转宽表。因为不同设备的取值在量纲上不可比,把它们摞成一列取均值或做标准化都是错的。上面用 aggfunc 取 first 只是为了避免同一格出现多个值时报错;真遇到重复值,应当先回到采集流程确认是否确有多次读数,而不是取平均了事。

5.5 图像文件名与部位映射

文件名格式为 person_id 加 location_id,其中 location_id 按 2.4 小节的对照表解读。iPhone 与 Android 图像分目录存放。

import os

LOC = {1: '左手指背侧', 3: '左手掌背侧', 5: '右手指背侧',
       7: '右手掌背侧', 9: '额头', 10: '耳垂外侧', 11: '耳垂内侧',
       12: '胸骨', 13: '左足趾背侧', 15: '右足趾背侧'}

def parse_image_dir(root):
    #-- root 为图像目录下某一设备的子目录
    for fn in sorted(os.listdir(root)):
        stem, _ = os.path.splitext(fn)
        pid, lid = stem.split('_')
        yield pid, int(lid), LOC.get(int(lid), '未知编号')

LOC 这张对照表直接抄自官方的编号对照表,十个编号一个不多一个不少。如果遇到不在表里的编号,说明官方还发布了对照表之外的部位,或者编号规则另有安排,这一项本文未核验。

5.6 五个最容易出错的地方

位置 错误写法 后果 正确做法
概念筛选 对 value_as_number 整列做统计 把量表档位、色空间分量、通道均值混在一起算 先解析 concept_name,再按设备与指标分组
单位列 以为 unit_concept_id 是物理单位 丢失用了哪台设备的信息 按官方说明读成设备与标度容器
图像范围 把指纹或掌部当普通部位图像用 那六个腹侧部位根本没有图像 按官方十个编号限定范围
跨库连接 直接与其他非 OMOP 库拼接 主键与语义都对不上 先在 CDM 层面转换目标库,再对齐概念
缺失处理 默认缺失值可以插补 官方明确未插补,插补会引入官方未声明的假设 保留缺失,并在方法部分说明处理方式

§6 与库内条目的关系

6.1 关系图谱

本词条在库内的位置,可以用"是否有 SaO₂-SpO₂ 配对"与"是否有量化肤色"两个轴摆出来。

相关词条 与 ENCoDE 的关系 分工
BOLD 血氧配对数据集 有大规模 SaO₂-SpO₂ 配对,按自我报告族裔分层,没有量化肤色读数 它负责规模有多大,ENCoDE 负责自变量有多准
MIMIC-III 扩展 PPG 库 大规模光电容积描记波形与 SpO₂,取自重症监护波形库 波形侧的训练材料,没有皮肤色调度量
BIDMC PPG 库 小规模、高标注密度的 PPG 呼吸率基准 同为某一任务上的高质性小样本,可对照两者的设计哲学
BUT PPG 库 手机摄像头采集 PPG 的质量评估与心率估计 与 ENCoDE 的手机摄影分支呼应:一个看脉搏波,一个看皮肤颜色
EHRSHOT OMOP 格式的纵向电子病历基准库 同为 OMOP 生态,但那是六千余人的常规纵向库,无皮肤色调度量
SkinCAP、SkinCon 皮肤临床图像的图像描述与临床概念标注库 皮肤领域的对照组:它们解决皮肤病识别,而非把肤色当协变量
Harvard-FairVision、FairSeg 医学影像的公平性基准 公平性方法论同源,对象从眼底与相干光断层换成脉搏血氧
浙江省人民医院重症数据库 关系表形态的重症监护数据 做跨库 CDM 对齐时可当技术参照,同样没有皮肤色调度量
社会决定因素句级标注集、孕期社会决定因素集 社会决定因素的文本标注 从另一侧处理健康公平:一边抽取社会因素,一边直接量皮肤属性

6.2 检索路径

你想找什么 检索词 会落到哪里
大规模血氧偏差证据 BOLD、SpO2-SaO2 pairs、隐匿性低氧 6.1 小节第一行
波形侧的训练材料 PPG、pulse oximeter waveform、重症波形库 6.1 小节第二、三行
OMOP 同源生态 OMOP CDM、common data model、EHRSHOT 2.1 与 6.1 小节第五行
皮肤领域的对照组 SkinCAP、SkinCon、Fitzpatrick17k 6.1 小节第六行
公平性基准 FairSeg、Harvard-FairVision、模型公平性 6.1 小节第七行
社会决定因素视角 SDOH、social determinants、句级标注 6.1 小节第九行

6.3 分工判据

你要做的事 主粮仓该用什么 ENCoDE 的位置
证明偏差在大规模人群中确实存在 BOLD 一类的大样本资源 不用于此,128 人不够
把偏差归因到具体的生理或光学因素 无 主力:唯一直连 SaO₂ 与多设备肤色读数的公开资源
训练跨人群鲁棒的血氧校正模型 大规模 PPG 波形库 充当外部测试变量,或提供自变量设计的参照
研究该用哪把尺子量肤色 无 唯一候选:四把尺子在同一部位同期测得
搭 OMOP 联邦管线 EHRSHOT 一类的大型 OMOP 源库 技术练手区:表少、人少、自定义概念段清晰
做皮肤病的图像分类 SkinCAP、SkinCon 不适用:它不解决皮肤病识别

这张表最有用的是第二行与第四行。第四行尤其值得反复强调:该用哪把尺子量肤色这个实证研究问题,在有这份数据之前几乎无法作答,因为缺少把多把尺子在同一批人身上同时量出来的数据。

§7 质量评估与局限性

7.0 阅读本节前的一个前置校正

先纠正一个常见误判:看到 128 人,就把它归入小样本、做不了什么的一类。规模小确实是事实,但它不导致价值低。真正决定它能不能用的是变量维度:十六个部位、167 项度量、五台台式设备加两款手机、一组配对的 SaO₂-SpO₂,再加上 OMOP 里少见的、同时保留种族族裔概念与量化肤色读数的结构。按患者数算它很小;按每名患者承载的信息维度算,它位于 OMOP 生态里极密的一端。

这个校正会改变五维评分的读法。规模一项拿不到高分,赤裸裸地摆在那里;而"能不能回答别人回答不了的问题"这一项,它没有什么对手。

7.1 五维评分

每项 1 到 5 分,针对"作为健康公平与脉搏血氧偏差研究数据"这个用途。

维度 分数 理由
数据规模 2 128 名患者、单中心,训练不足,机制验证够用
变量维度 5 16 部位、167 项度量、四把尺子同期同部位,罕见
任务适配 5 唯一把 SaO₂-SpO₂ 配对与量化肤色直连的公开资源
文档完整 4 设备型号、排除标准、去标识流程、图像管线都写清了;缺文件层面的目录细节
可获取性 2 凭证化访问加伦理培训加数据使用协议,且匿名请求下文件目录不可见

五项合计 18 分,满分 25。这个分数结构恰好说明它的用法:值得为它走完三道行政手续,但不值得为它放弃已有的大样本主粮仓。

7.2 质量的两层:设备度量与概念映射

第一层是设备度量本身。这一层的可靠性来源很朴素:定了具体型号,定了视觉量表的打印材质,四英寸乘六英寸相纸;定了垫黑卡的部位;定了由两名受过训练的人员采集,以便在动态、快节奏的重症环境里把流程跑顺。这些都不是做得很认真的空话,而是可复现的约束。

第二层是 OMOP 概念映射。官方的做法是人工映射,再由两名临床人员确认,并把无法映射到标准词汇的概念统一收进 CONCEPT.csv,用 2,000,000,xxx 系列的十位临时编号承载。这个做法的副作用很实在:这批自定义概念在数据模型里是与标准词汇并列的异类,任何依赖标准词汇层次的工具(自动派生队列、标准表型库)都对它们无效。与此同时它们可以跨机构复用,只要对方愿意采用同一套临时编号与命名规则。官方在使用说明里也把这种联邦愿景写明了。

第三层官方没有当作质量问题来写,但使用者必须知道:OHDSI 工具链里的 Achilles、DQD、Ares 三个工具在这份数据上跑过,用一批定向的结构化查询算过高级别刻画指标,例如年龄相关的刻画,以及质量属性,例如合理性与模型一致性;结果在交互式网页应用里可视化,据此对数据集做了迭代更新。这是一个好消息:它有专门的数据质量刻画流程打底,而不是发布之后再补声明。

7.3 已知的、可枚举的偏差

偏差 官方依据 影响
单中心 局限说明原话 设备、整备规范、判读习惯都来自一处
最深肤色代表性不足 局限说明原话,尽管队列超过四成黑人患者 最需要被校正的那一段人群恰恰数据最少
部分缺失且未插补 缺失一节 缺失并非随机:它来自拒绝继续或被临床处置打断
施测者主观性 三套视觉量表由协调员比对判读 视觉量表存在判读者之间的差异,官方未给出该差异的量
部位与探头位置未必一致 OBSERVATION 里同时存在直接观察与询问 staff 两条来源 用错部位的人去解释另一部位的偏差,是隐性错配
临时概念无法联动标准词汇 CONCEPT.csv 承载 2,000,000,xxx 自动表型与标准队列定义工具默认失效
时间已被整体平移 HIPAA 安全港,中心在未来 50 年 做不了绝对时间上的外部事件对照
体温有两支温度计 官方同时给了 clinical 与 general 两支 两支之间的系统差异未被量化,选错会带入新的干扰

最后一行最容易被忽略,但它是真实的陷阱:既然同一部位存在两支不同用途的温度计读数,那么用哪一支就是一个需要显式交代的选择,而官方没有说明两者是否需要同时采纳。

7.4 外部验证矩阵

验证角色 做法 讲得通的地方 风险
与大规模血氧资源对照 在大样本资源上验证趋势方向,在本资源上验证机制 规模与方法互补 两库的普查口径不同,时间间隔的定义要先统一
作为设备评测的测试床 用本库的多设备读数评估新设备的量测一致性 同一部位有多个参照可供比较 评测结论天然受限于这五台设备的特定型号
作为 OMOP 联邦技术验证 用它检验跨库数据模型对齐管线 表结构小、自定义概念段清晰 128 人处在极端稀薄的一端,性能瓶颈体现不出来
作为方法学论文的数据源 比较种族代理与肤色度量两个模型的估计 这是它唯一能同时支撑两派的数据库 单中心、样本小,结论外推空间有限

最后一行是它最被低估的用法。在"种族代理是否可接受"这场方法学争论上,本库的独特之处在于它同时提供了争论双方需要的东西,因而可以让两个模型在同一批人身上同台竞技,而不是各拿一份数据互相引用。

7.5 它为何能持续

它自 2024 年 8 月发布以来只有一个版本,未见任何修订记录。它之所以仍然值得写、值得用,原因是它占的位置到目前为止没有被替代:任何想做用量化肤色替代种族代理的研究,绕不开它。采集成本是关键,这套数据需要一个伦理批件、一条前瞻性入组管道、一支能进重症病房的采集小组,以及一家愿意签数据共享协议的医学中心。这比再采一批门诊皮肤照片贵得多。只要这个前提不变,它作为机制研究默认参照的身份就不会被新库轻易挤掉。

§8 生态位与历史

8.1 沿革:一份由争议催生的数据

脉搏血氧偏差进入主流视野,大致可以用官方页面参考文献里那批 2020 年至 2022 年的临床队列研究作为坐标:先是 2020 年关于种族偏差的通信式报告,接着 2021 与 2022 年相继出现基于重症与住院队列的证据,讲的是同一件事——在常规监护中,少数族裔群体的低氧血症更不容易被发现,进而影响治疗资格的认定与结局。

这批文献的共同方法缺陷是只有自我报告的种族,没有肤色测量。ENCoDE 正是对这个缺陷的直接回应。它 2024 年 2 月的方法学预印本、8 月的资源论文与同期的数据发布,把这个回应一次性落地。所以它不是一个顺带发布的数据集,而是一个有明确争议背景的产物。理解这一点,才能理解它为什么把入组条件定得那么窄、把排除标准写得那么严。

8.2 与挑战赛:它没有被任何挑战赛采用,这本身就是信息

本站许多生理信号类词条都有一条被某某挑战赛用作数据来源的经历。本词条没有。这本身值得记一笔,原因有二。

第一,脉搏血氧偏差很难做成竞赛任务。难点在于对照真值稀缺——SaO₂ 来自有创的动脉血气,本身就稀少。适合做竞赛的是规模化的回顾性资源,而不是这样一份 128 人的前瞻性资源。

第二,它的结构决定了它更适合当参照而不是当赛题。竞赛需要一个明确定义的金标准标签,而这里没有官方定义的目标变量;要不要校正、用什么校正、用哪把尺子,都还没有答案。把它做成比赛,等于把尚未解决的方法学问题包装成已有标准答案的任务。

8.3 生态位:参照系而不是来源

角色 主流来源 参照系
典型用法 大规模训练、大面积表格与模型预训练 机制验证、方法学对照、设备一致性评测
需要的前提 数据量大、标签稳定 变量维度深、取值能追到具体设备
代表资源 BOLD、大规模 PPG 波形库 ENCoDE、其他小体量高维度前瞻队列
失败模式 过拟合、标签噪声累积 样本太少导致结论不稳

ENCoDE 坐在右边这一列,而且坐得比多数参照系更极端:它的参照价值不来自代表真实世界,而来自提供了别人给不出的那一个自变量。这个差别很重要。参照主流资源时我们相信它代表真实分布;参照本资源时我们借用的是它的变量独特性,而不是它的代表性。论文里如果把它写成有代表性的急性期人群,就是混淆了这两件事。

8.4 谁在用它,用来做什么

从公开文献看,使用者集中在三类。第一类是从方法学入手的健康公平研究者,用它比较代理变量与直接测量的变量;第二类是做设备转化与血氧评测的工程团队,用它评估多型号设备在新人群上的一致性;第三类是以 OMOP 联邦为平台的工程组,把这份小库当作数据模型对齐加自定义概念处理的练手案例。第三类数量可能最少,却最能说明选择通用数据模型带来的附带收益:正是因为它走了通用数据模型,才出现了这个原本不在设计意图内的使用群体。

§9 使用指引

9.1 三种角色的路径

角色 第一天 第一周 注意事项
健康公平研究者 读官方页面的方法部分与局限说明两节 把 5.4 小节的宽表跑出来,确认缺失形态 缺失不插补,这是设计决定
设备评测工程师 按 2.5 小节挑定一台设备与一个指标作为比较基线 设计设备间一致性实验,并注明所处部位 别忘了 DEVICE_EXPOSURE 里的给氧状态是协变量
OMOP 联邦工程组 把八张 CSV 灌进目标 CDM 环境 处理 2,000,000,xxx 自定义段的词汇注册 标准工具链默认不认这些概念

第一行与第三行的注意事项看似相反,实则同源:它为了研究灵活性牺牲了开箱可用性。把它当成标准 OMOP 库来用的工程组,会在自定义概念这一块撞墙;把它当成"我需要的东西它一定有"的研究者,会在缺失与量纲这两块撞墙。

9.2 一条最短的可用流程

#-- 1. 先确认访问状态:返回 403 说明凭证化生效,需要先申请
curl -sL -o /dev/null -w "%{http_code}\n" \
     https://physionet.org/content/encode-skin-color/1.0.0/

#-- 2. 获批后先只取 CSV,把八张表的结构跑通再取图像
wget -r -N -c -np -A "*.csv" \
     https://physionet.org/files/encode-skin-color/1.0.0/
import pandas as pd

#-- 3. 最小验证之一:确认 SKINTONE 前缀概念里出现的部位种类
con = pd.read_csv('CONCEPT.csv', low_memory=False)
names = con['concept_name'].astype(str)
locs = names[names.str.startswith('SKINTONE@')].str.extract(
    r'^SKINTONE@(.+?)__')[0].dropna().unique()
print(len(locs), sorted(locs)[:5])

#-- 4. 最小验证之二:核对官方那句"就诊数等于患者数"
per = pd.read_csv('PERSON.csv', low_memory=False)
vis = pd.read_csv('VISIT_OCCURRENCE.csv', low_memory=False)
print(per['person_id'].nunique(),
      vis['visit_occurrence_id'].nunique(),
      vis['person_id'].nunique())

第 4 步的打印结果应当用来对照官方那句"所有入组患者只有一次住院,因此就诊数与人数相同"。这是一条可以用两行代码验证的官方断言,也是本文在没有文件访问权限的情况下,最建议优先跑的一次核对。

9.3 引用方式

引用对象 内容
数据集 Hao, S., Dempsey, K., Matos, J., Alwakeel, M., Houghtaling, J., & Wong, A. K. (2024). ENCoDE, mEasuring skiN Color to correct pulse Oximetry DisparitiEs: skin tone and clinical data from a prospective trial on acute care patients. (version 1.0.0). PhysioNet. RRID:SCR_007345. doi:10.13026/mcgk-1s42
平台 PhysioNet 平台综述论文,Pollard 等,2026 年发表于 Nature Health,doi:10.1038/s44360-026-00096-z
配套论文 Hao 等,ENCoDE - a skin tone and clinical dataset from a prospective trial on acute care patients,medRxiv,doi:10.1101/2024.08.07.24311623
教程代码 官方 GitHub 仓库 https://github.com/aiwonglab/ENCoDE_tutorial

写论文时建议同时注明三件事:使用的版本号 1.0.0;所选用的那把尺子,即采用了哪套量表或哪台设备的读数;以及缺失值的处理方式。第二项尤其重要——不同尺子得出的肤色变量不可互换,论文里只写使用了肤色测量而不写用了哪一把尺子,等于没有交代方法。

§10 AI 使用声明

项目 声明
文本生成 本文由 AI 辅助撰写,编辑把关结构与事实
数字来源 规模、结构、边界三类数字全部来自 PhysioNet 官方页面,含摘要、方法、数据描述、使用说明与伦理各节
文件核验 未核验:本库为凭证化资源,官方文件目录对未授权请求返回拒绝响应,八张 CSV 与图像目录均无法直接访问
不一致说明 官方摘要写"每个部位采集 167 项肤色变量与两项体温变量,不含图像",数据描述一节则写"共 167 项肤色特征,分布在三套视觉量表、一台比色仪、两台分光光度计与两款手机上"。前者似指每部位 167 项,后者似指合计 167 项,官方页面内部口径不明;本文未做择一,正文保留官方原话
不一致说明 手机机型三处写法不完全一致:摘要写 Google Pixel 4 (Android),方法节写 Google Pixel 4a,CONCEPT 命名写 GOOGLE_PIXEL4
论文信息 仅核对 PubMed 摘要与预印本摘要页面,未读全文
未核验内容 MEASUREMENT 表的行数、CONCEPT 中自定义概念的确切条数、八张 CSV 的文件体积、图像张数与分辨率、六个腹侧部位对应的 location_id 编号、缺失的行层面细节、两支体温计读数的差异
图像 无配图;封面为生成式提示词,不含真实肤色图像与阅读者可识别的个体
免责 本文不构成临床建议;数据使用须遵守 PhysioNet Credentialed Health Data Use Agreement 1.5.0

常见误读(避坑清单)

说法 实际 证据
它可以直接下载 凭证化资源,须完成 CITI 培训、签署数据使用协议并通过审批 官方页面访问策略一节
它有 167 个患者 167 是每部位的肤色变量项数,患者数是 128 名 官方摘要与数据描述
官方给了一个统一的肤色标量 多套设备的读数并存,尺度互不可比 官方示例三行的取值分别为 4、15、255
每人有 16 张部位图像 每人 10 张非生物识别部位图像,六个腹侧部位不发布图像 官方编号对照表与去标识一节
腹侧部位因为涉及生物识别所以变量被删了 度量保留,只有原始图像不发布;处理后的通道值明确不视为生物识别信息 官方去标识一节;官方示例 2、3 的部位为 FINGER_LEFT VENTRAL
unit_concept_id 是物理单位 官方写明此列存放测量设备、制造商信息与具体标度 官方数据描述一节
补上缺失值更科学 官方明确部分缺失保留为缺失,不做插补 官方缺失一节
它的日期是真实入院日期 已按 HIPAA 安全港整体随机平移,中心在未来 50 年 官方去标识一节
它是多中心数据 单中心,且最深肤色代表性有限 官方局限说明一节
2 开头的概念已经进了标准词汇 这些是 CONCEPT.csv 里的十位临时编号,尚未进入标准 OMOP 词汇 官方数据描述与表清单

FAQ

Q1:只有 128 名患者,是不是太少了?
对于回答具体物理或生理机制的问题,128 名患者配 16 个部位与 167 项度量是够用的;对于训练大规模模型则远远不够。这个库的入组门槛极窄:必须在动脉血气之前 5 分钟内有脉搏血氧读数,还要逐一排除未卸指甲油、因血管并发症入院、肢体截肢,以及白癜风、黄疸、淤青造成的皮肤变色。每一条排除标准都在优先保证这一处的肤色读数可信。可以说它的设计取向是宁少勿污。

Q2:167 项肤色变量,到底是指所有部位加起来,还是每个部位都有?
官方页面内部口径不明。摘要写的是每个部位收集 167 项肤色变量与两项体温变量,不含图像;数据描述一节写的是共 167 项肤色特征,分布在三套视觉量表、一台比色仪、两台分光光度计与两款手机上。两句话指向的可能不是同一件事,本文没有自行选定一种解读,也未下载文件去点。如果你的分析依赖这个数字,请以实际文件内容为准,并在论文里写明你是怎么数的。

Q3:我该用哪一个指标当肤色?
没有标准答案,这正是它的价值所在。若要复刻现有文献的做法,Monk Skin Tone Scale 这类视觉量表更贴近临床直觉;若要物理上稳定、可跨中心比较的量,分光光度计给出的 CIE-L* 这类色空间分量更合适;若在做可规模化的现场方案,手机图像分支才是对应的那一支。官方没有指定首选,选谁取决于研究问题。

Q4:图像为什么不全?被排除的六个部位是哪六个?
官方把左右手指、手掌与足趾的腹侧列为潜在生物识别部位,也就是可能留下指纹或掌纹的那些,这些部位的图像不予发布。数目上完全对得上:官方共 16 个测量部位,编号对照表列出 10 个发布图像的部位,两者之差正好是 6。但这六个部位各自的 location_id 编号,官方页面没有给出。

Q5:时间被随机平移了,还能做时间相关的分析吗?
能做的是相对时间:同一患者内部、同一次住院内部的前后关系与间隔仍然成立,因此住院第几天、测量的先后顺序这类分析可以继续。不能做的是绝对时间:年份与日期已被整体平移,中心在未来 50 年,任何需要与外部真实事件对齐的设计都不可行。

Q6:它和其他 OMOP 资源能拼起来用吗?
这正是它选择 CDM v5.4 的目的。表结构是标准的,person_id 与 visit_occurrence_id 的连接方式也是标准的。真正的障碍在 CONCEPT.csv 里那些 2,000,000,xxx 的临时概念:它们不属于标准 OMOP 词汇,跨库时对方没有对应编号,需要你把这套临时概念与命名规则一并搬过去。官方也把这种便于与其他来源类似数据联邦的意图写进了使用说明。

Q7:缺的那些文件层数字,能不能绕过去拿到?
不能。八张 CSV 与图像目录都在凭证化访问之下,匿名请求会被拒绝。本文给出的所有结构性描述都来自官方页面的文字描述,而非对文件的直接核验。需要行数、体积、张数这类数字的研究者,必须先完成凭证化申请。

术语表

术语 解释
SpO₂ 脉搏血氧仪测得的外周血氧饱和度,属无创估计值
SaO₂ 动脉血气直接测得的动脉血氧饱和度,用作参照真值
SaO₂-SpO₂ 对 官方用语,指一次动脉血气之前 5 分钟内的脉搏血氧读数与该次 SaO₂ 组成的配对
隐匿性低氧血症 SaO₂ 已低于阈值而 SpO₂ 仍显示正常,因而未被识别的情况
代理变量 用可获得的变量代替难以获得的真值;本领域里种族长期被当作肤色的代理
Fitzpatrick Skin Type 按日晒后反应分型的量表,临床文档中最常见
Monk Skin Tone Scale 近年推出的肤色比对量表,用于替代粗分类别
Von Luschan 比色尺度 以玻璃比色板比对的历史比色尺度
比色法 用固定光源照射后测量反射光强度来推算颜色
分光光度法 逐波长测量反射率,可给出 CIE-Lab* 等标准色空间分量
CIE-L* CIE Lab* 色空间中的明度分量,数值越大越浅
LCH 柱坐标形式的色空间,分量分别为明度、彩度与色相
OMOP CDM 观察性医疗结果伙伴关系通用数据模型,一套标准化的表结构与词汇体系
OHDSI 开发并维护 OMOP CDM 与配套工具链的开源社区
Achilles、DQD、Ares OHDSI 工具:数据刻画、数据质量检查与表征工具
concept_id 数据模型中概念的唯一标识;标准词汇外的临时概念在本库用 2,000,000,xxx
长表 同一受试者的多个观察值按行堆叠,靠概念编号区分度量类型
安全港条款 HIPAA 去标识的两条路径之一,列举需移除或处理的标识符
REDCap 常见的临床研究数据采集系统,本研究的原始测量记录平台
Epic Clarity Epic 电子病历系统配套的临床数据仓库
HIPAA 美国健康保险流通与责任法案,规定受保护健康信息的使用边界
CITI 研究伦理与合规在线培训体系;本库要求其 Data or Specimens Only Research 课程
DUA 数据使用协议;本库采用 PhysioNet Credentialed Health Data Use Agreement 1.5.0
联邦分析 各机构保留原始数据在本地,只交换统计结果与分析程序的多中心模式

附录 A:核心数字核对表

项 值 出处 核验层级
全称 ENCoDE, mEasuring skiN Color to correct pulse Oximetry DisparitiEs 完整标题 官方页面标题 官方页面
版本 1.0.0 官方页面版本区 官方页面
发布日期 2024 年 8 月 22 日 官方页面 官方页面
患者数 128 名 官方摘要 官方页面
住院次数 与患者数相同 官方表清单中 VISIT_OCCURRENCE 的说明 官方页面
测量部位数 16 官方摘要与方法部分 官方页面
每部位肤色变量 167 官方摘要 官方页面,口径见 §10
每部位体温变量 2 官方摘要 官方页面
每患者图像 10 张非生物识别部位图像 官方摘要 官方页面
发布图像的部位编号 1、3、5、7、9、10、11、12、13、15 官方编号对照表 官方页面
被排除的图像部位数 6 官方去标识一节与图像记录说明 官方页面
CSV 表数 8 官方表清单 官方页面
数据模型 OMOP CDM v5.4 官方 OMOP 转换一节 官方页面
临时概念编号形式 十位、以 2 开头,示例为 2,000,000,368、569、546 官方示例表 官方页面
视觉量表 Fitzpatrick、Monk Skin Tone、Von Luschan 官方摘要与方法部分 官方页面
比色设备 Delfin SkinColorCatch 官方摘要 官方页面
分光光度设备 Konica Minolta CM-700d、Variable Spectro 1 Pro 官方摘要与方法部分 官方页面
拍照设备 iPhone SE 2020、Google Pixel 4 或 4a 官方摘要与方法部分 官方页面,三处写法不一致
体温设备 HoMedics HTD8813C 标为 clinical、IDEAL 61-847 标为 general 官方方法部分 官方页面
入组时间窗 动脉血气之前至多 5 分钟 官方方法部分的入组条件 官方页面
时间平移规则 随机平移,中心在未来 50 年 官方去标识一节 官方页面
缺失处理 不做插补,保留缺失 官方缺失一节 官方页面
许可 PhysioNet Credentialed Health Data License 1.5.0 官方页面许可栏 官方页面
必需培训 CITI Data or Specimens Only Research 官方页面培训要求栏 官方页面
DOI,v1.0.0 10.13026/mcgk-1s42 官方页面发现栏 官方页面
DOI,最新版 10.13026/33g5-v628 官方页面发现栏 官方页面
伦理批件 杜克大学医学中心伦理委员会,豁免知情同意,Pro00110842 官方伦理一节 官方页面
示例读数尺度 档位 4、明度分量 15、通道均值 255 官方示例表 官方页面

附录 B:数字的来源分层

第一层,官方页面。 患者数、部位数、每部位变量项数、每人图像张数、部位编号、设备型号、入组时间窗、去标识规则、缺失处理方式、许可与培训要求、数字对象标识符、伦理批件号。这些是本文正文使用的主要依据。

第二层,配套论文摘要。 关于这项研究的设计动机与队列构成,来自 PubMed 收录的摘要与预印本平台页面。这一层只用于说明研究的背景与官方未在页面上展开的细节,凡是与官方页面冲突的地方,一律以官方页面为准。

第三层,未核验。 需要打开文件才能得到的数字,包括八张表的行数、自定义概念的确切条数、图像张数与分辨率、六个腹侧部位的编号、以及两支体温计读数的差异。这些 requests 需要下载全量后统计,本文按数字纪律的要求不予涉及,正文中凡涉及处都只做结构性表述。

附录 C:任务代码

任务一:把 167 项度量按设备分组,清点每类设备下有哪些指标

import pandas as pd

con = pd.read_csv('CONCEPT.csv', low_memory=False)
names = con['concept_name'].astype(str)
mask = names.str.startswith('SKINTONE@')
sk = con.loc[mask, ['concept_id', 'concept_name']].copy()

#-- 拆出设备段与指标段
parts = sk['concept_name'].str.extract(
    r'^SKINTONE@(?P<location>.+?)__(?P<device>.+?)\.(?P<measure>.+)$')
sk = pd.concat([sk, parts], axis=1)

#-- 按设备分组看指标名,注意不同设备的值域不可比
for dev, grp in sk.groupby('device'):
    print(dev, len(grp), sorted(grp['measure'].unique())[:4])

任务二:在同一部位上比较不同设备的读数

import pandas as pd

NAMES = ['MEASUREMENT', 'CONCEPT']
d = {f: pd.read_csv(f'{f}.csv', low_memory=False) for f in NAMES}

con = d['CONCEPT']
con = con[con['concept_name'].astype(str).str.startswith('SKINTONE@')]
parts = con['concept_name'].astype(str).str.extract(
    r'^SKINTONE@(?P<location>.+?)__(?P<device>.+?)\.(?P<measure>.+)$')
con = pd.concat([con[['concept_id']], parts], axis=1)

mea = d['MEASUREMENT'].merge(con, left_on='measurement_concept_id',
                             right_on='concept_id', how='inner')

#-- 指定部位,逐设备看取值尺度;不要跨设备做算术
loc = 'FINGER_LEFT DORSAL'
sub = mea[mea['location'] == loc]
print(sub.groupby('device')['value_as_number'].agg(['count', 'min', 'max']))

第二段代码里最后那句 groupby 给出的最大最小值,只用于确认各设备读数的取值区间彼此不同,不用于任何跨设备的比较。跨设备比较应当在同一患者内部做秩次或做标准化,而不是直接比数值。

附录 D:完整参考链接

编号 名称 链接 用途
1 ENCoDE 皮肤色调度量库 v1.0.0 https://physionet.org/content/encode-skin-color/1.0.0/ 全部规模、结构、边界数字的来源
2 配套论文摘要 https://doi.org/10.1101/2024.08.07.24311623 研究设计与队列背景
3 官方教程代码仓库 https://github.com/aiwonglab/ENCoDE_tutorial 官方示例与技术问题反馈
4 OMOP CDM v5.4 规范 https://ohdsi.github.io/CommonDataModel/cdm54.html 表结构与列名的官方定义
5 PhysioNet 平台综述,2026 https://doi.org/10.1038/s44360-026-00096-z 托管模式与引用惯例

附录 E:如果只记五件事

序号 记住什么 为什么
1 128 名患者、16 个部位、每部位 167 项肤色变量加 2 项体温变量 这四个数字定义了它的全部用法与限制
2 它是机制参照,不是训练粮仓 用它训练的论文会立刻遇到样本天花板
3 肤色不是一个数,而是并存的多尺度读数 不解析概念名就跨行运算,结果必然是错的
4 凭证化访问,且文件层数字本文未能核验 排期要留出审批周期,不能假设匿名可下载
5 每人只有一次住院,且时间被整体平移 划分即按人划分,纵向随访与跨年趋势分析都不成立

编辑说明

本文的核验时间为 2026 年 10 月 28 日。核对方式为直接访问 PhysioNet 项目页,逐节读取摘要、背景、方法、数据描述、使用说明、伦理与利益冲突部分,并尝试访问文件目录;文件目录因凭证化限制返回拒绝响应,故八张 CSV 与图像目录的内容未能核验,这一点已写入 §10 与 §5.1。配套论文只核对了 PubMed 与预印本平台的摘要页,未读全文。本文未做任何自行计算得出的分布性统计,所有数字限于规模、结构、边界三类,并尽量标注官方出处。官方页面内部存在的两处口径不明(167 项是否为每部位口径、 Pixel 机型的三处写法),已在 §10 显式列出而未做择一。


相关数据集导航

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

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

返回 AI-Ready 数据集