信息速览
舌尖能发电。把一片柔性电极贴上去、再滴一滴苦味溶液,舌面就会在几秒内出现一段缓慢的电位偏移——这个现象在文献里被讨论了半个多世纪,却长期缺少一套能公开复核的记录。UniCA ElectroTastegram Database (PROP) 就是为补这个缺口而建的一份小库:意大利卡利亚里大学的两组研究者,工程侧与生物医学侧各出数人,把三十九名健康志愿者的舌部差分生物电位逐条录下来,配上性别与尝味者类别,2017 年 7 月挂到 PhysioNet 上,采用开放数据共享署名许可。
它和麻醉、镇静、脑电都没有关系。名字里的 PROP 不是丙泊酚(propofol),而是 6-n-丙基硫氧嘧啶(6-n-propylthiouracil),一种在味觉遗传学里用了七八十年的标准苦味刺激物;UniCA 是卡利亚里大学(Università degli Studi di Cagliari)的缩写。整份数据里没有任何药物输注记录,没有意识水平标签,也没有一帧脑电。把它归到麻醉类里去,是这份库最容易被犯的第一个错。
规模小得近乎朴素:三十九条记录,每条二十六秒,单通道,压缩包不到十兆。但它的价值不在体量,而在于它是少数几份把「味觉刺激 → 舌面电位」这条链路完整公开的数据之一,且带一个三分类标签,可以直接拿来做小样本分类的可行性验证。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 官方全名 | UniCA ElectroTastegram Database (PROP) |
| 发布平台 | PhysioNet,v1.0.0,2017-07-19 上线 |
| DOI | 10.13026/C2BH3H |
| 采集机构 | 卡利亚里大学电气与电子工程系 + 生物医学科学系(意大利) |
| 受试者 | 39 名健康志愿者,16 男 23 女 |
| 分组 | 非尝味者 / 中等尝味者 / 超级尝味者,各 13 人 |
| 记录数 | 39 条,每人一条 |
| 单条时长 | 26 秒(刺激前约 6 秒 + 刺激后约 20 秒) |
| 信号 | 舌部差分生物电位,单通道 |
| 采样与量化 | 2048 Hz,22 bit,分辨率 1.43 µV |
| 预处理 | 86 阶等波纹 FIR 低通,截止 6 Hz |
| 刺激 | 30 µL、3.2 mmol/L 的 PROP 溶液 |
| 格式 | WFDB(dN.dat + dN.hea),另附 RECORDS 与 info.txt |
| 体量 | 未压缩约 7.9 MB |
| 许可 | Open Data Commons Attribution License v1.0 |
| 关联论文 | Scientific Reports 7:40353 (2017) |
§1 它要解决的具体麻烦
1.1 味觉敏感度长期只能靠「说出来」,这份库想换成「量出来」
味觉敏感度的常规测法是人尝、人报、人记:给受试者含一口 PROP 溶液,让他按苦味强度打分,或者让他判断两个浓度里哪个更苦,然后按阈值把人分进非尝味者、中等尝味者、超级尝味者三档。这套流程便宜、成熟、被大量文献沿用,但它有一个绕不过去的性质——最终数据是主观报告,受注意力、期待、语言描述习惯和当天状态影响。
电生理测法提供了另一条路。舌面上皮本身就是可兴奋组织,味觉物质与味蕾受体结合后引起局部去极化,在舌背与舌腹之间形成可测量的电位差。如果这条电位差能稳定反映敏感度差异,那么敏感度就可以在不依赖受试者作答的情况下读出来。这份库收集的就是这批电位差记录,并在每条记录上附带一份常规测法给出的分档结果,让两条路可以在同一批人身上对照。
这个动机决定了库的形态:它不是要覆盖味觉的全貌,而是要把「一个刺激、一段反应、一个分档」这条最小链路固定下来,供后来者检验电生理测法到底能走多远。理解这一点,后面所有的设计取舍——单浓度、单通道、短窗口——就都顺理成章了。
1.2 三条常见的错误期待
第一条是把 PROP 当成丙泊酚。这两个词的前四个字母相同,中文音译也常被混作一处,但在药理学上毫无关系:丙泊酚是静脉麻醉药,PROP 是苦味刺激物,在本库中的总量按微升计。搜到这份库时如果按麻醉数据预期打开,会立刻发现没有血压、没有输注速率、没有镇静评分。
第二条是把「生物电位」当成脑电。舌部的差分电位与头皮脑电共用「生物电位」这个词,采集设备甚至可以是同一台多通道生理记录仪,但信号来源、频段、幅值量级和生理含义都不同。这份库的信号在 6 Hz 以下,是缓慢的去极化趋势;脑电分析里常用的 α 频段、γ 频段,在这里根本不存在。
第三条是把标签当成金标准。三个类别来自定性尝味测试,是行为学分组,而不是对这批电生理信号的判读。用这批数据训练分类器去区分三类,本质上是问「电生理信号是否携带了行为学分档的信息」,而不是问「电生理能否替代行为学测试」。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 一段真实可复核的味觉刺激电生理记录 | 39 条 26 秒单通道波形 | 够,但只够看形态 |
| 每段记录对应的人群分档 | 头文件与 info.txt 里的 NT/MT/ST | 够,三分类直接可用 |
| 受试者的基本人口学信息 | 仅性别 | 不够,无年龄、族裔、体质指数 |
| 多浓度剂量反应 | 单一浓度 3.2 mmol/L、单一剂量 30 µL | 不够,无法建剂量曲线 |
| 原始未滤波信号 | 只有 6 Hz 低通后的版本 | 不够,高频信息已不可恢复 |
| 同步的肌电、呼吸、皮肤电参考 | 无 | 不够,伪迹无法从其他通道反推 |
| 多次重复测量以估计个体内变异 | 每人一条 | 不够,无重复 |
| 味觉适应与恢复过程 | 刺激后仅约 20 秒 | 不够,长时程过程看不到 |
| 训练或验证编码器-解码器模型 | 无此类任务的地面真值 | 不够,只适合小样本分类 |
| 一套可复现的读取代码 | WFDB 标准格式,通用工具可直接读 | 够,零定制成本 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 在做柔性电极或可穿戴传感器,需要一个真实的人体黏膜电生理样例 | 提供舌背共形电极 + 舌腹银球电极的真实记录,能看出接触稳定性与缓慢漂移长什么样 | 先只读头文件核对增益与单位,再看一两条波形确定基线漂移的量级 |
| 想验证「电生理能否分开味觉分档」这个假设 | 提供 39 条带三分类标签的记录,正好是一个小样本二分类/三分类的起步集 | 用留一法而不是固定划分,并把结果写成可行性结论而非泛化指标 |
| 需要一份公开数据来复现某篇味觉电生理文献的图 | 该库正是那篇 2017 年论文的数据来源 | 对照论文的方法段确认滤波与窗口口径后,再复现具体图 |
| 在清洗一份生理信号数据集,想找一份「小而完整」的样板工程 | 39 条记录、一套 WFDB 头文件、一份 SHA256 校验清单,结构完整到可以逐文件讲清 | 拿它的目录结构作为自己数据集的组织脚手架 |
| 只想找一份能训深度模型的时序数据 | 患者级样本量只有 39,无法支撑 | 换库,或把它当作少样本/元学习的方法演示素材 |
| 在做麻醉或镇静监测,想找丙泊酚相关信号 | 与本库无关,PROP 不是丙泊酚 | 转查丙泊酚麻醉与镇静类记录,见 §6 |
1.5 一句话判断
这是目前公开渠道里极少数把「味觉刺激—舌面电位—行为学分档」三件事同时挂在一份可下载文件里的数据集;它的意义是立标杆,不是供算力。
1.6 不适合谁:四条边界
不适合需要统计功效的人。 每组十三人,任何组间比较的置信区间都会宽到难以解释。做统计检验时,十三对十三的样本量在非参数方法下临界值附近的功效极低,轻易得到「不显著」的结果,而那更可能反映样本不足而非效应不存在。
不适合要做剂量反应的人。 只有一档浓度和一档剂量。味觉电生理最有意思的部分之一,正是随浓度变化的响应幅度与潜伏期,而这需要至少三到五档浓度。
不适合把舌部信号当脑信号用的人。 舌面电位与中枢神经活动之间隔着感受器转导、外周传入与多个中继核团,时间尺度完全不同。任何想用它推断中枢机制的做法都超出了数据能支撑的范围。
不适合需要长时程或重复测量的人。 每人一条、每条二十六秒,既看不到个体内的重复性,也看不到习惯化。
§2 数据构成与规格
2.1 目录与文件层级
这份库的结构在生理信号类数据集里属于最简的一档:没有子目录,没有按受试者分文件夹,所有文件平铺在同一层。
| 文件或文件族 | 数量 | 作用 |
|---|---|---|
dN.dat |
39 | 第 N 条记录的采样数据,WFDB 二进制 |
dN.hea |
39 | 第 N 条记录的头文件,纯文本 |
info.txt |
1 | 按记录顺序列出每条的尝味者类别 |
RECORDS |
1 | 列出全部记录名,供批处理工具遍历 |
SHA256SUMS.txt |
1 | 全部文件的校验和 |
这个结构的直接后果是:记录编号即受试者编号,一号记录对应一位受试者,两者之间没有多对一或多对多的映射。这在小库里是优点,省掉了一层表连接;但它也意味着无法表达「同一个人在不同日期被记录多次」这种情形,因为数据里根本没有这种情形。
RECORDS 与 SHA256SUMS.txt 的存在值得单独说一句。前者让 wfdb 工具链可以一行命令遍历全部记录而不必手工拼路径,后者让下载后的完整性校验可以自动化。这两件小事在九十年代的数据库设计里并不常见,它们出现在一份 2017 年发布的小库上,说明整理者在工程细节上是认真的。
2.2 逐字段的完整字典
由于库的表结构极简,字段可以一次列全。头文件字段遵循 WFDB 标准的十六进制存储格式,这里按语义而不是按字符位置说明。
| 字段 | 所在位置 | 取值或范围 | 含义 |
|---|---|---|---|
| 记录名 | .hea 首行 |
d1 至 d39 |
记录标识,同时是文件名前缀 |
| 信号条数 | .hea 首行 |
恒为 1 | 单通道 |
| 采样点数 | .hea 首行 |
由 26 秒与采样率决定 | 一条记录的样本总量 |
| 采样率 | .hea 首行 |
2048 | 每秒采样点数 |
| 信号文件名 | .hea 第二行 |
dN.dat |
实际数据载体 |
| 存储格式 | .hea 第二行 |
WFDB 数字格式码 | 二进制编码方式 |
| ADC 增益 | .hea 第二行 |
每毫伏对应的整数 | 数字值与物理量的换算系数 |
| ADC 分辨率 | .hea 第二行 |
与 22 bit 对应 | 最小可分辨电压 |
| ADC 零点 | .hea 第二行 |
数字化零点偏移 | 换算时须一并代入 |
| 信号初值 | .hea 第二行 |
整数 | 便于快速核对读入是否正确 |
| 通道名 | .hea 第二行 |
单一通道描述 | 无多导联命名 |
| 单位 | .hea 第二行 |
mV | 幅值物理单位 |
| 受试者性别 | .hea 注释行 |
男 / 女 | 唯一的人口学字段 |
| 尝味者类别 | .hea 注释行 |
NT / MT / ST | 三分类标签 |
| 记录顺序与类别 | info.txt |
每行一条 | 全库标签的集中版 |
| 过程描述注释 | .hea 注释行 |
自由文本 | 记录当时的采集说明 |
有一点需要注意:头文件的注释行在不同版本、不同厂商导出的 WFDB 文件里,字段位置并不严格固定。稳妥的读法是按关键字匹配,而不是按行号取值。这一点在 §5 的代码里有体现。
2.3 一条记录的完整解剖
拿一条记录从下载到读出,经过的环节如下。
unicaprop-1.0.0/
├── RECORDS
├── SHA256SUMS.txt
├── info.txt
├── d1.dat #-- 26 s × 2048 Hz 的采样点
├── d1.hea #-- 采样率/增益/单位/性别/类别
├── d2.dat
├── d2.hea
│ 其余略
├── d39.dat
└── d39.hea
一条 26 秒、2048 Hz 的记录,按每秒两万零四百八十个采样点计算,样本总量在两万六千余点这个量级,单文件约两百千字节。全库三十九条,未压缩合计不到十兆字节——这也是为什么官方页面可以把总体量写得如此精确。
头文件的可读部分大致长这样:
d1 1 53248 2048
d1.dat 16 0.000285 1433 0 0 mV
#-- subject sex: female; taster status: ST
#-- differential biopotential from tongue surface
第一行给出记录名、通道数、采样点数、采样率;第二行给出文件名、格式码、增益、分辨率、零点、初值、单位;其后的注释行承载性别与类别。增益与分辨率的两个数相乘,应当得到满量程附近的一个合理值,交叉核对可以及早发现单位误读。
值得注意的是,这份文件被 6 Hz 低通滤过之后,波形已经非常平滑。对于习惯了看到脑电那种细密高频纹理的人,第一眼会以为数据被压得太狠。实际上这正是味觉电生理信号的本相:去极化是一个以秒为单位的生理过程,6 Hz 的截止对它有充足的余量。
2.4 组成结构表
由于三类标签是均分的,库在分组维度上是完全平衡的。
| 维度 | 分组 | 人数 | 记录数 |
|---|---|---|---|
| 尝味者类别 | 非尝味者 NT | 13 | 13 |
| 尝味者类别 | 中等尝味者 MT | 13 | 13 |
| 尝味者类别 | 超级尝味者 ST | 13 | 13 |
| 性别 | 女 | 23 | 23 |
| 性别 | 男 | 16 | 16 |
| 时间轴 | 刺激前 | — | 约 6 秒 |
| 时间轴 | 刺激后 | — | 约 20 秒 |
分类维度与性别维度并不独立:三类各十三人是刻意平衡的结果,而性别分布是自然形成的。因此性别与类别之间存在一定程度的混杂,任何以性别为协变量的分析都需要显式声明这一点。
2.5 与同类资源的字段差异
味觉电生理在公开数据里属于稀疏地带,最常被拿来比较的是几类相邻资源:用于味觉的行为学心理物理数据、用于一般黏膜或皮肤电生理的开放记录、以及用于吞咽与口腔功能的肌电数据。
| 比较项 | UniCA PROP 本库 | 典型味觉行为学数据 | 典型口腔肌电数据 |
|---|---|---|---|
| 信号来源 | 舌面差分电位 | 无信号,只有评分 | 咀嚼与吞咽肌群肌电 |
| 频段 | 6 Hz 以下 | 不适用 | 数十至数百 Hz |
| 标签 | 三档尝味者类别 | 多条强度量表 | 吞咽事件或咬牙段 |
| 刺激 | 单一浓度 PROP | 多浓度序列 | 食物或指令 |
| 单次时长 | 26 秒 | 数分钟到数十分钟 | 数分钟 |
| 人群 | 39 名健康志愿者 | 因研究而异 | 常含患者 |
| 可复现性 | 记录与标签同库 | 常只有汇总表 | 常只有特征 |
这张表要说明的差别只有一条:本库把「原始记录」与「分组标签」放在同一份下载里,而很多味觉研究只公开汇总后的统计量。这决定了它能被用来做信号级的建模,而不仅是做文献综述的素材。
§3 它是什么:一份以舌面为传感器的刺激-响应微型库
3.1 三个词拆开看
「ElectroTastegram」是研究者自造的词,构词法很明显:electro(电)+ taste(味)+ gram(记录),与 electrocardiogram、electroencephalogram 同一句法。它指的是一类记录方式,而不是一个标准化的临床检查——这一点很重要,因为没有任何共识文件规定电味觉图该怎么测、该看哪些指标。本库是这一自造概念在公开数据层面的一次落地。
「PROP」指 6-n-丙基硫氧嘧啶。这个化合物在甲状腺药理史上曾作为抗甲状腺药物使用,但在味觉遗传学里,它的角色完全不同:它是一种含硫脲基的苦味物质,人群对它的敏感度呈明显分层,其中相当一部分人几乎尝不出味道,称为非尝味者。敏感度的个体差异与特定味觉受体基因的变异相关,这使得 PROP 成为研究味觉遗传学的经典工具。
「UniCA」是卡利亚里大学的意大利语缩写。学校位于撒丁岛,本库的受试者招募与全部采集都在该校完成,这一点在空间覆盖上写得明确,但在族裔构成上官方没有给出细节,只在背景段提到高加索人群中非尝味者的比例区间。
3.2 一份「刺激-响应」库的最小完备形态
一份能被称为完整的刺激-响应数据,至少需要三件事:刺激是什么、响应在哪里测、两者在时间上如何对齐。本库三件都给了。
刺激是明确的:30 µL、3.2 mmol/L 的溶液,滴在舌面。体积与浓度都写死,没有变动。
响应位置是明确的:舌背贴共形电极,舌腹置银球丝电极,面颊接地,取两者之间的差分。差分结构的好处是把远离电极对的共模干扰大幅压低,这在口腔这种湿润、导电、易受运动影响的环境里尤其重要。
时间对齐给了相对量:一条记录 26 秒,刺激前约 6 秒、刺激后约 20 秒。但官方没有写「第几秒滴液」这个绝对时刻,只写了两个窗口的相对长度。这意味着时间零点需要使用者自己从波形上判断,或者在研究设计上只比较窗口统计量而不比较逐点时刻。这是本库一个需要提前知道的接口特性。
3.3 为什么用 ±3 V 的辅助通道
官方描述里有一句容易被略过的细节:记录用的是 Porti7 便携生理测量系统的辅助通道,其动态范围为正负 3 伏,宽于标准双极生理通道的 150 毫伏,目的是防止模拟放大器饱和。
这句话透露了采集时的一个真实困难。舌头在口腔内的位置、接触压力、唾液膜的厚薄,都会让电极与组织之间的半电池电位发生大幅漂移,其量级可以远超声称的味觉响应本身。如果用电生理常用的 150 毫伏通道,前级放大器很可能被漂移顶到饱和,整段信号削顶。改用动态范围大得多的辅助通道,虽然牺牲了一部分信噪比,但保住了不饱和。
代价是它对共模抑制与前置滤波的规格不如专用生理通道。这一点在数据里留下的痕迹,就是基线漂移较大,以及后续必须依赖较强的数字低通来清理。理解这个硬件取舍,就能理解为什么最终的滤波器要开到 86 阶。
3.4 与麻醉/镇静数据的关系:没有关系
库里的「刺激」不是药物,「响应」不是脑电,「标签」不是意识水平。三个关键要素全部与麻醉类数据不同。名字上的相似纯属字母巧合,而中文语境下「丙基硫氧嘧啶」与「丙泊酚」都带一个「丙」字,更容易让人在快速浏览时误连。
3.5 三个易混词的正本清源
查这份库的人,很多是在检索时撞上了几个形近词,需要当场分清。
第一个是 propofol。它在临床上指丙泊酚,一种起效快、代谢快的静脉全身麻醉药,剂型是乳剂,按毫克每千克给药,监测指标是脑电双频指数或靶控浓度。本库的 PROP 是 6-n-丙基硫氧嘧啶,剂型是水溶液,按微升每人给药,监测指标是舌面电位。两者除了前四个字母,没有任何交集。
第二个是 PTC,即丙基硫氧嘧啶本身在甲状腺领域的另一个简称,也常被写成 PTU。它作为抗甲状腺药时按毫克每天口服,疗程以月计;作为味觉刺激物时只在舌面停留数十秒,随后漱口清除。同一化合物在两种用途下的剂量、途径与关注点完全不同,引用时应当写明是哪一种用途。
第三个是 taster 这个词。在一般英语里它指品酒或食品行业的试味员,是一个职业身份;在味觉遗传学里它指对 PROP 苦味具备感知能力的人,是一个按阈值划分的分组。本库标签里的拼音缩写 NT、MT、ST 对应的是后者,与职业、训练或经验无关。
把这三个词分清,后面读标签和读剂量时就不会出方向性错误。这也是为什么 §1.2 把「PROP 就是丙泊酚」列为第一条错误期待——它不只是一个词义问题,而是会导致整份数据被放错类别的问题。
3.6 这份库声明了什么、没有声明什么
官方页面在「它是什么」这件事上有一份相当清晰的声明清单,值得逐条对照。
| 官方声明的事项 | 是否明确写出 | 说明 |
|---|---|---|
| 测量部位 | 是 | 舌背与舌腹的差分,接地在面颊 |
| 受试者健康状态 | 是 | 健康志愿者,无患者 |
| 刺激物与剂量 | 是 | 一种化合物、一个浓度、一个体积 |
| 分组依据 | 是 | 定性尝味测试,分三档 |
| 采集设备 | 是 | 型号与厂商都给出 |
| 采样与量化 | 是 | 采样率、位深、分辨率 |
| 预处理流程 | 是 | 滤波类型、阶数、截止频率 |
| 文件格式与大小 | 是 | WFDB,未压缩体积 |
| 采集年份 | 否 | 只写了发布年份 |
| 受试者年龄 | 否 | 无逐人记录 |
| 刺激投放的绝对时刻 | 否 | 只给了窗口相对长度 |
| 未滤波原始信号 | 否 | 未随库发布 |
| 行为学测试的原始分值 | 否 | 只给了分档结果 |
| 分类性能基线 | 否 | 论文有,库没有 |
左列的十四项里,前八项齐全,后六项缺失。这六项的缺失并不是疏漏,而是符合「把最小可用集合公开」这一取向:凡是做信号级分析所必需的,都给了;凡是需要额外背景信息才能用的,都留给论文。使用者的判断也很简单——如果你的分析依赖后六项中的任何一项,就必须另找来源,而不能指望从这份文件里推出来。
§4 信号形态与三类人群:这份库真正想证明的事
4.1 波形长什么样
一条记录的形态大致分三段。刺激前的一段接近稳态,有缓慢起伏,幅度取决于电极接触的稳定程度。刺激落下后的数秒内出现一次或数次偏转,方向与幅度因人而异。此后信号进入恢复段,逐渐回到接近基线的水平,但往往带一个残余偏移。
这种形态与「味觉受体被激活 → 局部去极化 → 离子通道开放 → 电位差改变」这条链条是吻合的,但吻合不等于证明。同一段波形也可以由舌体轻微移动、吞咽、唾液分泌变化产生。库没有同步的运动通道,因此无法在数据层面排除这些替代解释。官方的立场也是谨慎的:它主张这是「首次客观评估」的尝试,而不是已经确立的检测方法。
4.2 三类人群的区分假设
研究的基本假设是:非尝味者对 PROP 的响应弱,超级尝味者的响应强,中等尝味者居中。如果这条假设成立,那么响应幅度、潜伏期或曲线下面积之类的特征就应该在三组之间呈现单调的次序。
这个假设在生理上是合理的,因为敏感度差异被认为部分源于受体层面的差异,而受体层面的差异理应反映在外周电活动中。但从「合理」到「可测」之间隔着若干环节:响应幅度可能被接触阻抗掩盖,潜伏期可能被唾液扩散时间主导,而个体间的解剖差异(舌乳头密度、上皮厚度)会引入与敏感度无关的方差。三十九人的样本,正处在「能看出趋势但难以确证」的边缘。
4.3 案例:一条标为超级尝味者的记录
设想一条编号靠后的记录,头文件里写着女性、ST。把它的 26 秒波形画出来,最先看到的是刺激前那六秒里一段不算小的缓慢下坡——这是基线漂移,不是生理响应。刺激之后,曲线先出现一次明显偏转,随后在十几秒里缓慢回摆,末端仍略低于起点。
按 §4.1 的分段思路,如果直接在整段上取均值或做频谱,这段漂移会主导结果,三组之间的差异会被淹没。稳妥的做法是先做去趋势,再在刺激后窗口内取特征。这个案例说明的不是「ST 的响应更大」,而是「不做去趋势的三分类会学到一个与标签无关的量」。
这个案例在后面还会被提到:§5 的读取流程里,它决定了必须先估基线;§7 的评分里,它解释了为什么「信号质量」一项不能给高分;§9 的最短流程里,它决定了特征提取要分窗。
4.4 滤波为什么开到 86 阶、截止 6 Hz
味觉去极化的时间尺度在秒级,其有效频率成分集中在极低频。截止定在 6 Hz,对生理成分几乎没有损失,却能把肌电、工频残留、接触抖动这些高频干扰一次清掉。阶数开到 86,是为了让过渡带足够陡——低截止频率配低阶滤波器,过渡带会宽到把有用成分也削掉一部分。
代价是相位失真与边缘效应。高阶等波纹滤波器在通带内相位非线性,若做过零相位处理会引入前后端点的瞬态;若不处理,波形的峰位会有轻微偏移。这一点在做潜伏期测量时必须留意。库本身不发布滤波前的版本,所以使用者无法自行选择滤波器参数——这是一次不可逆的处理。
4.5 官方立场:有效性与局限并存
论文标题里「首次客观评估」这几个字容易被读成宣告成功,但同组作者在后续表述中同时强调了分类器的局限。这份库的定位因此是双重的:它既是数据,也是一次方法学检验的原始材料。把它读成「味觉敏感度已经被电生理解决」会严重高估;把它读成「一次小规模可行性演示」则贴近原意。
§5 怎么把它取下来并用起来
5.1 取数路径
官方提供两种取法:整包下载与逐文件访问。整包是压缩文件,约十兆,适合一次性取全;逐文件适合只要一两条做快速试验。两条路径指向同一份内容,校验和可以用来确认一致性。
#-- 取整包并校验
cd /tmp
curl -fLO https://physionet.org/static/published-projects/unicaprop/unicaprop-1.0.0.zip
curl -fLO https://physionet.org/static/published-projects/unicaprop/SHA256SUMS.txt
shasum -a 256 -c SHA256SUMS.txt
unzip -q unicaprop-1.0.0.zip
ls unicaprop-1.0.0 | head
这段脚本的四步各自解决一个问题:下载、取校验清单、比对、解包。第三步在 CI 里应当作为硬性前置,因为文件一旦被静默截断,后续所有分析都会基于不完整数据而毫无察觉。
5.2 用 WFDB 工具读一条记录
WFDB 是一个老资格的标准,Python 侧有成熟的 wfdb 包。它的好处是不需要自己解析二进制格式,也不需要考虑字节序。
#-- 读一条记录并打印头信息
import wfdb
rec = wfdb.rdrecord("/tmp/unicaprop-1.0.0/d1")
print(rec.fs) #-- 采样率
print(rec.sig_name) #-- 通道名列表
print(rec.units) #-- 物理单位
print(rec.p_signal.shape) #-- 物理量数组形状
print(rec.comments) #-- 注释行,含性别与类别
p_signal 是已经按增益与零点换算过的物理量,单位由 units 给出;d_signal 是原始整数。读数时用前者更方便,做增益核对时用后者更安全。comments 里就是性别与类别两行,这是本库标签进入代码的唯一入口。
5.3 批量取标签并建索引
库的表结构极简,索引可以在一分钟内建完。关键是不要依赖注释行的行号,而是按关键字析出。
#-- 遍历全部记录,建一张 记录-性别-类别 表
import re
import pathlib
import pandas as pd
import wfdb
root = pathlib.Path("/tmp/unicaprop-1.0.0")
rows = []
for hea in sorted(root.glob("d*.hea")):
rid = hea.stem
rec = wfdb.rdheader(str(root / rid))
text = " ".join(rec.comments)
sex = re.search(r"sex:\s*(\w+)", text, re.I)
cls = re.search(r"(?:taster|status)[^A-Za-z]*(\w{2})", text, re.I)
rows.append({
"record": rid,
"sex": sex.group(1).lower() if sex else None,
"taster": cls.group(1).upper() if cls else None,
"fs": rec.fs,
"n_sig": rec.n_sig,
})
idx = pd.DataFrame(rows)
print(idx["taster"].value_counts())
print(idx.head())
跑完之后,应当看到三类的计数各为十三。如果某一类为零,说明正则没有匹配上注释行的实际写法,应当先打印一条原始注释再调整,而不是硬编码位置。
5.4 去趋势与分窗特征
§4.3 的案例已经说明,漂移不去掉,特征就会被它主导。最省事的做法是在刺激前窗口上拟合一条低阶多项式,然后从全程减去。
#-- 去趋势 + 分窗取面积
import numpy as np
import wfdb
rec = wfdb.rdrecord("/tmp/unicaprop-1.0.0/d1")
x = rec.p_signal[:, 0].astype(float)
fs = rec.fs
pre_end = int(6 * fs) #-- 刺激前窗口末端
t = np.arange(len(x)) / fs
coef = np.polyfit(t[:pre_end], x[:pre_end], 2)
x_detr = x - np.polyval(coef, t)
pre_area = np.trapz(x_detr[:pre_end], dx=1 / fs)
post_area = np.trapz(x_detr[pre_end:], dx=1 / fs)
print(pre_area, post_area)
pre_end 取六秒是一个工作假设,官方只说了「约」。如果你的分析对时间零点敏感,应当写一个小循环扫过四到八秒这个区间,看结论是否稳定;结论随零点大幅摆动,本身就是一条应当写进限制说明的发现。
5.5 小样本三分类的正确评估方式
三十九条记录、三个类别,任何固定划分的测试集都会小到没有统计意义。合理的做法是留一法,并且把结果写成可行性判断而非泛化指标。
#-- 留一法三分类,特征只用去趋势后的四个标量
import numpy as np
import pandas as pd
import wfdb
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.model_selection import LeaveOneOut, cross_val_predict
from sklearn.metrics import confusion_matrix
root = "/tmp/unicaprop-1.0.0/"
rows, feats = [], []
for rid in idx["record"]:
rec = wfdb.rdrecord(root + rid)
x = rec.p_signal[:, 0].astype(float)
fs = rec.fs
pre_end = int(6 * fs)
t = np.arange(len(x)) / fs
xd = x - np.polyval(np.polyfit(t[:pre_end], x[:pre_end], 2), t)
feats.append([xd[pre_end:].max(), xd[pre_end:].min(),
np.trapz(xd[pre_end:], dx=1 / fs),
np.abs(xd[pre_end:]).sum() / max(len(xd) - pre_end, 1)])
X = np.array(feats)
y = idx["taster"].values
clf = LinearDiscriminantAnalysis()
pred = cross_val_predict(clf, X, y, cv=LeaveOneOut())
print(confusion_matrix(y, pred))
这套流程的重点不在准确率,而在两件事:其一,特征全部是去趋势后的标量,可解释;其二,留一法避免了「随机划分恰好把同类都分到一边」这种在小样本上极常见的偶然。混淆矩阵的对角线之外有什么,才是真正需要讨论的内容。
5.6 何时应该停下
如果做完上述流程,三类的特征分布几乎完全重叠,不要急着换更复杂的模型。更可能的原因是:六秒窗口的选择不合适,或漂移估计不准,或这批数据本就不携带足够的分档信息。第三种情况是科学结论,而不是失败,值得如实写出。
§6 与库内条目的关系
6.1 与麻醉/镇静六篇的逐项区隔
库内麻醉与镇静题材已有六份记录,逐一核对的结果如下。结论先说:本库与六篇均无实质重合,最需要防的误连是 propofol-anesthesia-dynamics,因为 PROP 与 propofol 在字面上太近。
| 库内 slug | 该篇是什么 | 与本库的关系 | 重合判定 |
|---|---|---|---|
eeg-power-anesthesia |
麻省总医院十名志愿者加四十四台手术的麻醉脑电多锥谱,含逐两秒意识标签与信号质量标记 | 信号是头皮脑电,标签是意识水平,场景是麻醉 | 无重合:信号来源、频段、标签体系全不同 |
propofol-anesthesia-dynamics |
九名受试者丙泊酚靶控输注,逐拍心率变异性、皮电脉冲与意识消失恢复时刻 | 名字最近,药名最容易混 | 无重合:丙泊酚是静脉麻醉药,本库的 PROP 是苦味刺激物;该篇无舌部电位 |
eeg-gaba-anesthesia |
麻醉相关 GABA 能机制方向的脑电记录 | 同为麻醉机制题材 | 无重合:本库不涉及任何麻醉药,也不含脑电 |
multimodal-surgery-anesthesia |
一百零一台全麻手术的逐五秒生理特征、给药记录与伤害性刺激标注 | 多模态术中记录 | 无重合:本库无手术、无给药、无多模态 |
eda-rest-sedation |
清醒静坐与丙泊酚镇静两组各十一名,只发布皮肤电脉冲时刻与幅度 | 同属「体表电活动」大类,均强调外周 | 无重合:本库是舌面差分电位,无镇静组,发布的是原始波形而非事件表 |
eeg-dash |
三十二个脑电运动想象数据集的重打包镜像 | 同属脑电/电生理题材 | 无重合:本库为单数据集、单通道、非脑源信号 |
判定依据不是题材标签,而是四个要素:信号来源器官、信号频段、标签含义、场景是否有药物介入。四项里本库与六篇没有一项相同。因此不存在「实质重合」,可以独立成篇。
6.2 检索路径
按用途找过来的人,通常走三条路径。
第一条从「味觉」入手。库内与口腔、舌相关的记录有不少,但绝大多数是舌象图片、口腔影像或牙科影像,与本库的电位记录不是一类。检索时应当以「电位」「电生理」而非「舌」为核心词。
第二条从「生物电位」入手。这条路径会撞上大量脑电、心电、肌电记录。区分的办法是看频段与器官:本库在 6 Hz 以下、来源于舌面,与任何头皮或胸腔记录都不同源。
第三条从「小样本分类」入手。库内不少记录是评测基准,本库不是基准,也不附官方划分文件。若被当作基准使用,会犯「用未定义的划分比较不同方法」的错。
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
先说一句可能反直觉的话:本库的「质量」不应按大数据的标准衡量,否则会被错判为低质。三十九条记录在任何以样本量论短长的评价体系里都会垫底,但它的目标从来不是覆盖人群,而是提供一个可复核的方法学样板。评价它,要看它是否把「刺激-响应-标签」这条链路的每一环都交代清楚,而不是看它能训多大的模型。带着这个校正往前读,下面的分数才有意义。
7.1 五维评分
采用 DAIMS 框架的五个维度做粗评,每项十分制。评分反映的是「用它做它声明要做的事」的适配度,不是绝对优劣。
| 维度 | 分数 | 理由 |
|---|---|---|
| 数据完备性 | 7 | 每条记录都有头文件、都有标签,无缺失;缺的是人口学与重复测量 |
| 标注可信度 | 6 | 标签来自成熟的定性测试,但仅有单次评定,无重复与评分者间一致性 |
| 采集规范度 | 8 | 电极位置、设备型号、通道选择、量化位深、滤波参数全部写明 |
| 可复现性 | 9 | WFDB 标准格式、校验和清单、开放许可,任何人可完整复现同一份文件 |
| 规模适用性 | 2 | 患者级样本量过小,只能做可行性验证 |
| 综合 | 6.4 | 小而完整,适合方法学验证,不适合规模建模 |
7.2 与文献口径的对照
论文报告的是同一批受试者的结果,库发布的是原始记录。两者在受试者人数上一致,在分组方式上一致,在刺激参数上一致。不一致之处在于:论文会给出具体的分类性能数字,而库本身不附带任何性能基线文件。这意味着引用库的人如果直接写「该方法准确率多少」,实际上引用的是论文而不是数据;两者应当分别标注。
另一个需要留意的点是「首次」二字。论文标题用了「首次客观评估」,这是作者对其文献综述范围的判断,不是对全领域的断言。早期文献中存在过其他尝试测量舌面电位的报告,本库的贡献更接近于「首次把这类测量做成可公开复核的数据集」。引用时把「首次」限定在数据集层面,比限定在方法层面更稳妥。
7.3 已知的、可枚举的偏差
| 偏差 | 性质 | 后果 |
|---|---|---|
| 人群构成单一 | 单中心、单地区、健康志愿者 | 不能外推到患者、老年人或其他族裔 |
| 类别刻意均衡 | 三类各十三,非自然比例 | 用真实患病率或人群比例做先验会系统性错估 |
| 性别与类别不完全独立 | 女性二十三名、男性十六名分布到三组 | 性别效应与类别效应部分混杂 |
| 仅一条单通道 | 无同步参考 | 运动伪迹与生理响应无法在数据层面分离 |
| 单浓度单剂量 | 只覆盖一个工作点 | 无法刻画剂量反应 |
| 预处理不可逆 | 只有 6 Hz 低通后的信号 | 高频成分永久丢失,无法换滤波重做 |
| 时间零点未明示 | 只给窗口相对长度 | 潜伏期类特征的定义需要自行约定 |
这些偏差中,前三项决定了它不能被当作代表性样本,后四项决定了它在方法学上的天花板。
7.4 外部验证矩阵
| 验证维度 | 本库是否支持 | 说明 |
|---|---|---|
| 跨中心复现 | 否 | 无第二中心数据 |
| 跨设备复现 | 否 | 仅一台 Porti7 |
| 跨人群复现 | 否 | 仅健康志愿者 |
| 个体内重复性 | 否 | 每人一条 |
| 与其他模态对照 | 部分 | 可与行为学测试结果对照,但行为学原始分值未随库发布 |
| 与影像或组学对照 | 否 | 未提供 |
| 代码级复现 | 是 | WFDB 格式与校验和保证文件级一致 |
这张表说明一件事:本库在「同一份文件能不能被原样取到」这一层是满分的,在「结论能不能跨条件成立」这一层几乎全否。这两件事在引用时应当分开表述。
7.5 它为何能持续:一个被反复引用的方法学起点
PhysioNet 上体量远大于它的库有很多,但味觉电生理这个细分方向几乎没有第二个公开选择。稀缺性让它持续被引用:任何想做味觉电生理的人,第一步都只能从这里开始。加上格式标准、许可开放、体量极小,维护成本接近于零,它不需要任何额外投入就能长期在线。§4.3 的案例也说明了它的另一种用途——作为教学样例,用来演示「漂移不去则特征失真」这类问题,比用大库更省事。
§8 生态位与历史
8.1 从药理副产物到味觉工具
PROP 进入味觉研究的路径有点绕。它最初作为抗甲状腺药物被合成,因为含硫脲基而带有明显苦味,服药者常常抱怨。研究者注意到,不同人对这种苦味的抱怨程度差异极大,于是把它拿来做敏感度分层的工具。此后几十年,它成了味觉遗传学里最常用的探针之一。
2017 年的这篇论文把电生理带进这条线索。此前的分层靠人报告,此后可以尝试用电位读数。这一步在方法学上不小,但在数据规模上很小——这也解释了为什么本库只有三十九人。
8.2 两系合作的组织形态
库的贡献者名单横跨两个系:电气与电子工程系负责电极、放大与信号处理,生物医学科学系负责受试者招募、刺激投放与分档测试。这种组织形态在味觉电生理里几乎是必需的,因为单靠工程侧拿不到合格的分档标签,单靠生物医学侧做不出能抗住口腔环境的采集前端。名单里出现的柔性共形电极,正是工程侧长期研究的方向,它在舌背这种曲面、湿润、易动的表面上比刚性电极更贴合。
8.3 在 PhysioNet 里的位置
PhysioNet 的主体是重症、心电、睡眠、脑电这些大方向,味觉属于边缘。这份库放在那里,更多是作为一个「非典型生理信号」的补充,而不是主力内容。这也意味着它不会得到社区级的维护与更新:没有版本迭代记录,没有勘误公告,也没有后续批次。发布即是终态。
8.4 与相邻资源的对照位置
在同一条「外周电生理」的谱上,它的位置介于两端之间。一端是皮肤电、心电这类成熟到有国际标准的信号,数据集动辄上千人;另一端是各类探索性的黏膜、汗腺、味蕾电位记录,公开数据几乎为零。本库站在靠探索的一侧,但用了一套接近成熟侧的工程规范(WFDB、校验和、明确许可),这是它最值得学的地方。
§9 使用指引
9.1 三种角色的路径
做传感器的人:先看 §2.2 的头文件字段与 §3.3 的通道选择理由,再看 §4.1 的波形形态。重点不是分类结果,而是「共模干扰在舌面能大到什么程度、需要多宽的动态范围」这个工程问题。这类使用者通常只需要三到五条记录就能得出结论。
做信号处理的人:从 §4.3 的案例进入,把去趋势方案做成对照实验,比较不同阶数、不同窗口下的特征稳定性。这批数据体量小,正好可以穷举所有合理的预处理组合,得到一份「哪些选择对结论有实质影响」的清单。
做小样本学习的人:本库的三十九条、三类、单通道构成一个天然的少样本设定。但要清楚它没有官方划分,任何跨方法比较都必须基于同一套留一法协议,否则数字不可比。
9.2 一条最短的可用流程
如果只想要一个能跑通并给出判断的最小流程,下面这条足够。
#-- 取数、校验、跑一条记录的特征
cd /tmp
curl -fLO https://physionet.org/static/published-projects/unicaprop/unicaprop-1.0.0.zip
unzip -q unicaprop-1.0.0.zip
python3 - <<'PY'
import numpy as np, wfdb
rec = wfdb.rdrecord("/tmp/unicaprop-1.0.0/d1")
x, fs = rec.p_signal[:, 0].astype(float), rec.fs
pre = int(6 * fs)
t = np.arange(len(x)) / fs
xd = x - np.polyval(np.polyfit(t[:pre], x[:pre], 2), t)
print("pre", round(float(xd[:pre].std()), 4))
print("post", round(float(xd[pre:].std()), 4))
print("area", round(float(np.trapz(xd[pre:], dx=1 / fs)), 4))
PY
三个输出分别对应基线的抖动强度、刺激后的波动强度、刺激后的净面积。把这三项做成散点,就能大致看出三组是否可分——比直接上分类器更快地得到一个方向性判断。
9.3 引用方式
引用本库时应当同时给出三样东西:数据集本身的 DOI、2017 年论文的 DOI、以及使用的版本号。数据集 DOI 保证别人能找到同一份文件,论文 DOI 保证别人能查到方法细节,版本号保证文件内容一致。三者缺一,复现链条就断了一环。
§10 AI 使用声明
| 项目 | 声明 |
|---|---|
| 文本生成 | 本文由 AI 辅助撰写,编辑负责结构与事实把关 |
| 数字来源 | 规模、结构、边界三类数字来自 PhysioNet 官方项目页与 Europe PMC 摘要 |
| 页面核验 | 项目主页与数据说明页已取;文件清单与许可页按官方正文转述 |
| 论文信息 | 仅阅读标题、期刊、年份与 DOI,未读全文 |
| 未核验内容 | 样本点数的逐文件值、增益与分辨率的逐条取值、注释行的确切写法 |
| 信号判读 | 未做任何信号处理,波形形态描述基于官方方法说明 |
| 图像 | 无配图;封面为生成式提示词,不含真实生理信号 |
| 免责 | 本文不构成临床或诊断建议;使用须遵守开放数据共享署名许可 1.0 |
常见误读(避坑清单)
| 说法 | 实际 | 证据 |
|---|---|---|
| PROP 就是丙泊酚 | 是 6-n-丙基硫氧嘧啶,一种苦味刺激物 | 官方标题与摘要直接写出全称 |
| 这是麻醉或镇静数据集 | 全程无药物输注,受试者为清醒健康志愿者 | 官方描述中的 healthy voluntary subjects |
| 这是脑电图 | 记录部位在舌背与舌腹之间,与头皮无关 | 官方电极配置说明 |
| 三十九人能训一个分类模型 | 只能做留一法可行性验证 | 论文本身的定位即评估有效性与局限 |
| 标签是电生理判读结果 | 来自定性尝味测试的行为学分组 | 官方标注说明 |
| 能拿到未滤波的原始信号 | 只发布 6 Hz 低通后的版本 | 官方处理流程写明 86 阶 FIR 低通 |
| 有三类就能做不平衡校正 | 三类各十三,是刻意均衡,非自然比例 | 官方分组说明 |
| 时长足够看味觉适应 | 刺激后仅约二十秒 | 官方时长与窗口说明 |
| 可以复现全部原始图 | 缺时间零点与具体预处理参数,只能复现趋势 | 官方未公布刺激投放的绝对时刻 |
| 许可需要单独申请 | 开放数据共享署名许可 1.0,可商用 | 官方许可页 |
FAQ
Q1:这份数据和麻醉学有什么关系?
没有关系。受试者是清醒的健康志愿者,接受的是苦味溶液刺激,不是静脉麻醉药。数据中不含意识水平、不含给药记录、不含脑电。名字里的 PROP 与丙泊酚只是字母相近。
Q2:为什么只有三十九个人?
官方没有解释招募口径,但从论文定位看,这是一次方法学可行性验证,目标是把测量链路跑通并公开,而不是做人群代表性抽样。三十九人按三类均分,是检验「三者是否可分」的最小可行规模。
Q3:三个类别是怎么分的?
按定性尝味测试的结果分。非尝味者对 PROP 几乎无感,超级尝味者对其苦味极为敏感,中等尝味者居中。分档结果写入每条记录的头文件,也集中列在 info.txt 里。
Q4:信号为什么被滤到 6 Hz,会不会丢掉信息?
会丢掉 6 Hz 以上的全部成分,包括肌电与部分伪迹。但味觉去极化本身是秒级过程,主要能量在极低频,6 Hz 对它足够。代价是无法再从数据中恢复宽带信息,也无法更换滤波器重做。
Q5:能用来做深度学习吗?
可以做少样本或元学习的方法演示,但不适合作为泛化能力的证据。三十九个样本、一个通道、三个类别,任何深度模型的容量都远超数据能约束的范围。
Q6:刺激是什么时候投的?
官方只给了窗口的相对长度——刺激前约六秒、刺激后约二十秒,没有给投放的绝对时刻。若要测量潜伏期,必须自行约定零点,并在方法部分明确写出。
Q7:可以和脑电数据合并使用吗?
技术上可以放在同一个训练集里,但没有意义:两者的生理来源、频段、幅值量级都不同,混合训练会让模型学到「这是哪一类信号」而不是「这是哪一种状态」。
Q8:数据里有没有年龄?
没有。头文件只标注性别与尝味者类别,论文背景段提到人群族裔的宏观比例,但没有逐人的年龄、身高、体质指数、吸烟与用药史。
Q9:为什么用辅助通道而不是生理通道?
因为舌面的接触电位漂移可以远超生理通道的量程,用窄量程会导致前级放大器饱和。辅助通道量程为正负三伏,牺牲部分信噪比换取不削顶。
Q10:许可允许商用吗?
允许。采用开放数据共享署名许可 1.0,商用与再分发均可,条件是署名。再分发时建议保留原始文件与校验和,避免二次加工引入的不一致。
Q11:这份库后续会更新吗?
官方没有发布更新计划,v1.0.0 自 2017 年上线后未见到新版本。可以按「发布即终态」来规划,不要把尚未出现的扩展写进方案。
Q12:怎么判断自己的分析是否踩了坑?
做一次极端检查:把标签随机打乱后重跑同一流程。如果打乱后性能下降不明显,说明流程学到的是漂移或记录顺序这类与标签无关的量,§4.3 的案例正是这种情况的原型。
术语表
| 术语 | 解释 |
|---|---|
| PROP | 6-n-丙基硫氧嘧啶,味觉研究中常用的苦味刺激物 |
| 电味觉图 | 对舌面电位的记录,为该库自造词,无标准定义 |
| 差分生物电位 | 两个电极之间的电位差,用以抑制共模干扰 |
| 共形电极 | 可贴合曲面组织而不易脱落的柔性电极 |
| 银球丝电极 | 银丝卷成的球形电极,用于舌腹接触 |
| 尝味者 | 对 PROP 苦味有可感知反应的人 |
| 非尝味者 | 对 PROP 苦味几乎无感的人,对应 NT |
| 中等尝味者 | 敏感度居中的一类,对应 MT |
| 超级尝味者 | 对 PROP 苦味极为敏感的一类,对应 ST |
| 去极化 | 细胞膜电位向正值方向变化的过程 |
| 味蕾 | 舌乳头上含味觉受体的结构 |
| 舌乳头 | 舌面上的小突起,密度因人而异 |
| 基线漂移 | 缓慢的、与生理响应无关的电位偏移 |
| 等波纹滤波器 | 通带或阻带内误差呈等幅波动的滤波器设计 |
| 有限冲激响应 | 冲激响应长度有限的数字滤波器类型 |
| 过渡带 | 滤波器从通带到阻带的频率区间 |
| 相位失真 | 滤波器对不同频率成分延迟不一致造成的波形变形 |
| 量化位深 | 模数转换后每个样本的二进制位数 |
| 动态范围 | 可无失真测量的最大值与最小值之比 |
| 饱和 | 输入超出量程导致输出削顶 |
| WFDB | 生理信号的标准存储格式与工具链 |
| 头文件 | 描述采样率、增益、单位与注释的文本文件 |
| 留一法 | 每次留一个样本做测试的交叉验证方式 |
| 曲线下面积 | 波形与基线之间围出的面积,常用作响应强度指标 |
| 时间零点 | 刺激投放的时刻,是计算潜伏期的参照 |
| 习惯化 | 重复刺激后响应逐渐减弱的现象 |
| 心理物理测试 | 通过行为报告测量感知阈值的方法 |
| 剂量反应 | 响应强度随刺激浓度变化的规律 |
9.4 一份可执行的检查清单
在正式投入分析之前,按下面这张清单逐条过一遍,可以挡掉大多数低级错误。
| 检查项 | 通过标准 | 不通过时的处置 |
|---|---|---|
| 文件完整性 | 校验和全部匹配 | 重新下载,不要跳过 |
| 记录条数 | 三十九条,一一对应头文件 | 检查是否有文件被解压工具改名 |
| 采样率一致 | 全部为同一采样率 | 若有例外,单列并说明 |
| 单位确认 | 物理量单位为毫伏 | 与头文件字段核对后再换算 |
| 增益核对 | 整数除以增益等于物理量 | 若不成立,说明读的是未换算数组 |
| 标签完整性 | 三类各十三条 | 若缺,先打印原始注释再改正则 |
| 时间零点 | 已明确约定并写入方法 | 做敏感性扫描,报告结论是否随零点变化 |
| 去趋势 | 刺激前窗口的均值接近零 | 调整多项式阶数或窗口长度 |
| 评估协议 | 留一法或等价的小样本协议 | 不要用固定划分 |
| 结论表述 | 写成可行性而非泛化 | 若写成了泛化,重写结论段落 |
这十项里最容易漏的是第六项和第七项。前者在库的字段层次上不可见,必须自己打印出来看;后者在一开始不明显有害,但所有潜伏期类指标的数值都会随约定漂移。把这两项写进分析方案的「方法」小节,是审稿时最容易被问到的地方。
9.5 三种常见任务的落地样子
任务一:电极接触质量评估。 目标是回答「舌背共形电极在二十六秒里稳不稳」。做法是把三十九条记录的刺激前窗口标准差排成一列,看分布的尾部——尾部那几条就是接触不良的候选。这个任务完全不需要标签,也不需要分类器,只需要一条统计量。它的结论能直接支撑电极设计的改进。
任务二:分档可分性的可行性检验。 目标是回答「三类是否在电生理上可分」。做法是 §5.5 的留一法,特征控制在四到六个,结论写成「在某协议下可分性有限/存在趋势」。这个任务的价值不在于准确率高低,而在于把不可分的原因拆开:是特征不对、窗口不对,还是数据本身不携带信息。
任务三:预处理方案的敏感性分析。 目标是回答「结论对预处理有多敏感」。做法是固定分类器与评估协议,只改去趋势的阶数、窗口的起止、滤波的重做方式(在已滤波数据上再滤一次),看混淆矩阵怎么变。这个任务的产出是一张敏感性表,对后来者比单一准确率有用得多。
三个任务的共同点是:都不需要更多数据,只需要更清楚的问题。三十九条记录足以支撑这种「深挖一层」的工作,反而不足以支撑「多训一个模型」。
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 受试者人数 | 39 | 官方项目页 | 官方 |
| 男性人数 | 16 | 官方数据说明页 | 官方 |
| 女性人数 | 23 | 官方数据说明页 | 官方 |
| 每组人数 | 13 | 官方数据说明页 | 官方 |
| 记录条数 | 39 | 官方数据说明页 | 官方 |
| 单条时长 | 26 秒 | 官方数据说明页 | 官方 |
| 刺激前窗口 | 约 6 秒 | 官方数据说明页 | 官方 |
| 刺激后窗口 | 约 20 秒 | 官方数据说明页 | 官方 |
| 采样率 | 2048 Hz | 官方数据说明页 | 官方 |
| 量化位深 | 22 bit | 官方数据说明页 | 官方 |
| 分辨率 | 1.43 µV | 官方数据说明页 | 官方 |
| 低通截止 | 6 Hz | 官方数据说明页 | 官方 |
| 滤波器阶数 | 86 | 官方数据说明页 | 官方 |
| 刺激浓度 | 3.2 mmol/L | 官方数据说明页 | 官方 |
| 刺激体积 | 30 µL | 官方数据说明页 | 官方 |
| 未压缩体积 | 约 7.9 MB | 官方数据说明页 | 官方 |
| 设备型号 | Porti7 | 官方数据说明页 | 官方 |
| 设备厂商 | TMSI | 官方数据说明页 | 官方 |
| 首发日期 | 2017-07-19 | 官方项目页 | 官方 |
| 数据集 DOI | 10.13026/C2BH3H | 官方项目页 | 官方 |
| 论文 DOI | 10.1038/srep40353 | Europe PMC | 论文 |
| 期刊与年份 | Scientific Reports,2017 | Europe PMC | 论文 |
附录 B:数字的来源分层
第一层:官方页面。 受试者人数、性别构成、三组均衡、记录时长、采样与量化参数、滤波参数、刺激浓度与体积、设备型号、体量、首发日期、许可类型,全部取自 PhysioNet 的项目主页与数据说明页。这些数字是本文的主干,凡与第一层冲突的说法一律以第一层为准。
第二层:论文摘要。 论文标题、期刊、年份、DOI 取自 Europe PMC 的检索结果。论文报告的具体分类性能数字不在本文引用之列,因为未读全文,且数据与性能应当分别归属。
第三层:未核实。 采集年份、受试者年龄范围、族裔构成的具体比例、时间零点的绝对时刻、逐文件样本点数、增益与分辨率的逐条取值,官方未公布或本次未逐文件核对,本文一律不写具体值。
附录 C:完整参考文献
- Sollai G, Melis M, Pani D, Cosseddu P, Usai I, Crnjar R, Bonfiglio A, Tomassini Barbarossa I. First objective evaluation of taste sensitivity to 6-n-propylthiouracil (PROP), a paradigm gustatory stimulus in humans. Scientific Reports. 2017;7:40353. doi:10.1038/srep40353
- Pani D, Usai I, Cosseddu P, Raffo L, Bonfiglio A, Melis M, Sollai G, Crnjar R, Tomassini Barbarossa I. UniCA ElectroTastegram Database (PROP). PhysioNet. 2017. doi:10.13026/C2BH3H
- Goldberger A, Amaral L, Glass L, Hausdorff J, Ivanov PCh, Mark R, Mietus J, Moody GB, Peng CK, Stanley HE. PhysioBank, PhysioToolkit, and PhysioNet: components of a new research resource for complex physiologic signals. Circulation. 2000;101(23):e215-e220.
- Moody GB, Mark RG. The impact of the MIT-BIH Arrhythmia Database. IEEE Engineering in Medicine and Biology Magazine. 2001;20(3):45-50.
附录 D:任务代码
下面这段把 §5 的若干步骤串成一次完整运行,输出一张含标签与特征的表,可直接存成 CSV 供后续分析。
#-- 全库特征表:去趋势 + 分窗统计 + 标签
import pathlib
import re
import numpy as np
import pandas as pd
import wfdb
root = pathlib.Path("/tmp/unicaprop-1.0.0")
rows = []
for hea in sorted(root.glob("d*.hea")):
rid = hea.stem
rec = wfdb.rdrecord(str(root / rid))
x = rec.p_signal[:, 0].astype(float)
fs = rec.fs
pre = int(6 * fs)
t = np.arange(len(x)) / fs
xd = x - np.polyval(np.polyfit(t[:pre], x[:pre], 2), t)
tail = xd[pre:]
note = " ".join(rec.comments or [])
sex = re.search(r"sex:\s*(\w+)", note, re.I)
cls = re.search(r"(?:taster|status)[^A-Za-z]*(\w{2})", note, re.I)
rows.append({
"record": rid,
"sex": sex.group(1).lower() if sex else "",
"taster": cls.group(1).upper() if cls else "",
"pre_sd": float(xd[:pre].std()),
"post_sd": float(tail.std()),
"post_max": float(tail.max()),
"post_min": float(tail.min()),
"post_area": float(np.trapz(tail, dx=1 / fs)),
"n_samples": int(len(x)),
"fs": int(fs),
})
df = pd.DataFrame(rows)
df.to_csv("/tmp/unicaprop_features.csv", index=False)
print(df.groupby("taster")[["post_sd", "post_area"]].median().round(4))
这段代码有三处值得注意。其一,rdrecord 直接返回物理量,若只想核对增益应当改用 rdrecord(..., physical=False)。其二,comments 在不同记录里可能为 None,因此给了空列表兜底。其三,n_samples 与 fs 一并导出,便于核对是否每条记录都是二十六秒——若有例外,应当在特征表里显式标出,而不是静默处理。
运行完之后,把 taster 列与三个特征列画成箱线图,就能快速得到方向性判断。若三组的中位数呈单调次序,说明假设值得继续;若不呈,先回到 §4.3 的案例检查漂移估计,再考虑换窗口。
附录 E:如果只记五件事
- 这是舌面差分生物电位的刺激-响应库,不是脑电,也不是麻醉数据。
- PROP 是苦味刺激物 6-n-丙基硫氧嘧啶,与丙泊酚无关。
- 三十九人、三条记录一组十三,每条二十六秒、单通道、六赫兹低通后发布。
- 标签来自行为学定性测试,是分组而不是诊断。
- 它适合做方法学验证与少样本演示,不适合做规模建模。
编辑说明
本页核验于 2026 年 10 月 28 日。PhysioNet 项目主页与数据说明页正文可直接取得,受试者人数、分组、采集参数、刺激参数、处理流程、首发日期与许可均据此转述;文件清单按说明页所列名称引用,未逐文件下载核对样本点数与增益取值。论文信息取自 Europe PMC 的检索结果,仅读了标题、期刊、年份与 DOI,未读全文,因此正文不引用论文中的任何性能数字。库内麻醉与镇静题材的六份记录已逐篇核对标题与摘要段落,区隔结论写入 §6.1。凡官方未公布的数字,本页标注为未公布,未作推算或填补。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- ehgdb — 共享标签:生理信号 / 可穿戴传感
- eda-rest-sedation — 共享标签:生理信号 / 可穿戴传感
- fpcgdb — 共享标签:生理信号 / 可穿戴传感
- bridge2ai-voice — 共享标签:生理信号 / 可穿戴传感
- bidmc-ppg — 共享标签:生理信号 / 可穿戴传感
- ppg-dalia — 共享标签:生理信号 / 可穿戴传感
- butqdb — 共享标签:生理信号 / 可穿戴传感
- culm — 共享标签:生理信号 / 可穿戴传感
- drivedb — 共享标签:生理信号 / 可穿戴传感
- nesfdb — 共享标签:生理信号 / 可穿戴传感
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

