信息速览
In-Gauge 与 En-Gage 是 PhysioNet 上的一份组合数据集,由皇家墨尔本理工大学的 Nan Gao、Max Marschall、Jane Burry、Simon Watkins 与 Flora Salim 五人整理,2023 年 2 月 13 日发布 1.0.0 版。数据来自澳大利亚墨尔本郊区一所约七百人的私立 K-12 学校,两个名字各指一支子研究。In-Gauge 是纵向的环境监测,持续五个半月,覆盖十余间教室的室内气象站、室外气象站与空调出风口温度,按 5 分钟一行汇总成每间教室一个 CSV。En-Gage 是横断面的可穿戴研究,持续四周,追踪二十三名十年级学生与六名教师,用腕带记录皮肤电、血容脉冲、心率、皮肤温度与三轴加速度,并配每日自报问卷。
它真正稀缺的地方不是规模,而是把「房子」和「人」放在同一栋楼里同时记了两套账。建筑环境领域长期苦于仿真与实际用能的偏差:工程师按标准算出房间应当被用到什么程度,实际使用者却另有节奏。教育场景的情感计算则长期苦于实验室里的短时任务与真实课堂之间的落差。这份发布把两类缺口摆在同一所学校的课表上,环境侧的五分钟网格与可穿戴侧的赫兹级波形可以接在同一个课次编号上。
全库未压缩约 12.8 GB,压缩包约 5.1 GB,按 ODC-By 1.0 开放,下载无需注册。下文先说清这两支子集各自的边界与它们能对上的地方,再逐层拆开目录、字段、采集口径与取数路径。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 全名 | In-Gauge and En-Gage: Understanding Occupants’ Behaviour, Engagement, Emotion, and Comfort Indoors with Heterogeneous Sensors and Wearables |
| 中文名 | 室内居住者行为、投入、情绪与舒适的多传感与可穿戴数据集 |
| 托管平台 | PhysioNet(MIT 计算生理学实验室维护) |
| 版本与日期 | 1.0.0,2023 年 2 月 13 日;仅此一版 |
| 作者 | Nan Gao、Max Marschall、Jane Burry、Simon Watkins、Flora Salim |
| 机构 | 皇家墨尔本理工大学(RMIT)为主,斯威本科技大学与新南威尔士大学参与 |
| 采集地点 | 澳大利亚维多利亚州墨尔本郊区一所私立 K-12 学校 |
| 子集一 | In-Gauge:环境纵向监测,5.5 个月,2019 年 10 月至 2020 年 3 月 |
| 子集二 | En-Gage:可穿戴横断面,4 周,2019 年 9 月与 10 月各两周 |
| 教室数 | 正文称 17 间,longitudinal 目录实际 16 份 CSV |
| 参与者 | 23 名学生(15 至 17 岁)+ 6 名教师(33 至 62 岁),共 29 人 |
| 环境侧规格 | 5 分钟一行,23 列,逐教室一个 CSV |
| 可穿戴侧规格 | E4 腕带:EDA 4 Hz、BVP 64 Hz、ACC 32 Hz、TEMP 4 Hz、HR 1 Hz、IBI 事件式 |
| 问卷量 | 学生回复 488 份,教师回复 22 份 |
| 可穿戴总时长 | 1415.56 小时 |
| 课时副本 | 221 个课时子目录 + 20 个按日原始子目录 |
| 许可 | ODC-By 1.0(仅署名) |
| DOI | 10.13026/srm3-7z33(1.0.0) |
| 官方入口 | https://physionet.org/content/in-gauge-and-en-gage/1.0.0/ |
§1 它要解决的具体麻烦
1.1 建筑仿真与真实用能之间,一直缺一份「人在干什么」的记录
建筑性能模拟是设计阶段的常规动作。工程师输入房间几何、围护结构、空调参数,再输入一条「占用时刻表」,跑出能耗与室内环境预测。这条占用时刻表通常是标准假设:工作日早八点到晚六点满员,周末空置。真实情况远不是这样。
学校是最极端的例子。一间教室在课表上属于某个班,但那个班一周只来几节;课间、午餐、集会、周三的特殊课程都会打乱占用;假期整栋楼空着,空调却被误开。这些偏差最终体现在两个数字上:空调到底开了多久,以及开了之后室内环境到底怎样。官方背景段把这层动机写得很直白:模拟值与实际建筑性能之间常存在较大差异,而居住者操作空调的行为,正是这个差异里最不容易被标准捕捉的一部分。
In-Gauge 这一支就是为这件事准备的。它把空调出风口的温度、室内的二氧化碳与噪声、室外的温湿风雨辐射一起记下来,再把课表换算成占用状态,让「开了空调」这件事可以在五分钟粒度上被当作一个可预测的标签。
1.2 三条常见的错误期待
期待一:以为两个名字是同一批人的两种标注。 不是。两支子研究在同一校园,时间线有部分重叠,但 In-Gauge 没有任何个体标识,En-Gage 的二十几名佩戴者是否坐过被监测的那十几间教室,官方没有给出对应关系。把两边按人拼起来,是一个官方并未支持的假设。
期待二:以为腕带数据只有一份。 En-Gage 发布了两套组织方式。按日期排的是原始会话,二十个星期×星期几的子目录,每段会话六个 CSV,保留 Unix 起始时刻与真实采样率;按课时排的是另一种视图,两百余个课时子目录,每个子目录下按参与者分,时间戳换成了当日时刻。两者是同一批数据的两种切法,不是两倍的数据量。把它们相加,就会把样本量虚增一倍。
期待三:以为这套数据是医疗数据集。 全部参与者都是健康的学生与教师,没有诊断、没有治疗、没有随访。皮肤电与心率在这里的意义是唤醒与活动的代理,用来推断注意力与情绪,不承担任何医学判定。PhysioNet 托管它,是因为平台对生理信号的收录范围宽,而不是因为它有临床用途。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 训练空调开关的预测模型 | 16 份教室 CSV,逐行给出制冷/制热状态与室内外气候 | 够,是本库最贴合官方意图的用法 |
| 研究二氧化碳与占用、课次的关系 | 室内二氧化碳、课次编号、占用标志三列齐备 | 够 |
| 分析热舒适与着装、就座位置的关系 | 488 份学生问卷含热感觉、偏好、着装、平面坐标 | 够 |
| 用皮肤电或心率推断课堂投入 | 4 Hz 皮肤电与 1 Hz 心率,配五维投入自评 | 够做可行性,样本仅 29 人 |
| 把某位学生的信号接到他所在教室的室内气候 | 两边没有人员—教室对应表 | 不够,只能按时间与课次间接对齐 |
| 比较不同季节或不同气候区 | 只有一所学校、一个学期 | 不够 |
| 构建一个可上线的学生情绪监测系统 | 29 人、单一私立学校、无外部验证 | 不够 |
| 做临床或生理机制研究 | 无病史、无诊断、无对照干预 | 不够 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 手上有一个建筑能耗模型,想用真实占用与空调状态校准 | 五分钟粒度的制冷/制热状态与室内外气候,可直接当标签 | 先按 §2.5 的口径确认用 16 间还是 17 间,再按教室切分训练与测试 |
| 在做一个课堂投入的估计模型,缺少真实课堂数据 | 五维投入自评与同时段腕带信号,覆盖两百余节课 | 用 §5.3 的课时副本索引,按参与者分组划分,避免同一人跨集合 |
| 想验证「热环境是否影响注意力」这个假设 | 问卷里热感觉、热偏好与投入三条同时存在 | 只做同一校园内的关联分析,结论限定在这个场景 |
| 在做教育数据挖掘,需要课表级的时间结构 | 248 行的课次表,含房间、起止、周次、星期、课型 | 用课次表做时间轴,而不是用腕带时间戳反推 |
| 需要一份小体量的多模态素材做教学演示 | 单间教室的 CSV 只有数兆,单独下载即可 | 取一份 longitudinal CSV 加一段腕带会话,先跑通再看全量 |
| 要给一篇环境行为学或学习分析的论文找可引用数据 | 有 DOI、固定版本、Nat. Sci. Data 数据描述论文 | 引用时写清版本、DOI 与所用的子集,见 §9.3 |
| 想找一份青少年生理信号库做模型预训练 | 29 人、四周、单校 | 不够,另找体量更大的队列 |
1.5 一句话判断
它的价值不在于任何一支子集单独有多强,而在于两支被放在同一张课表上:环境侧告诉你房间什么时候开着空调,可穿戴侧告诉你那时候坐进去的人心跳与皮肤电是什么样,而把这两句话接起来的那根线,官方只给你课次编号。
1.6 不适合谁:四条边界
不适合拿它做人群层面的推断。 学生来自一所私立学校的一个年级,教师只有六位,全部参与者都在同一个城市、同一种气候、同一套建筑规范下。任何「青少年在教室里的平均生理反应」这类表述,在这份数据上都站不住。
不适合拿它做临床或健康风险研究。 没有病史、没有体检、没有随访。腕带测到的皮肤电与心率只能说明当时的唤醒水平,不能反推任何健康状态。
不适合拿它做跨建筑或跨气候的泛化验证。 建筑只有一栋(或数栋,官方未细列),空调只有一种类型,气候只有一个。模型的泛化能力在这份数据上无法被检验,只能被描述。
不适合拿它做「两支子集合并计数」的样本量论证。 环境侧是房间级时间序列,可穿戴侧是人级会话;两边单位不同、粒度不同、时段只有部分重叠。写作时若把它们加成一个总数,会得到一个既不是人数也不是时长的数字。§4.3 的案例已经说明,把「P17 的第四节课」这类问题答清楚,需要的不是更多数据,而是官方缺的那张房间对照表。
§2 数据构成与规格
2.1 顶层五个目录,两套完全不同的组织逻辑
解压后的顶层很干净:longitudinal、participant_class_info、survey、class_wearable_data 四个目录,加一份 raw_wearable_data.zip。前三个属于 In-Gauge 与两支共用的元数据,后两个属于 En-Gage 的可穿戴部分。
| 路径 | 属于哪支 | 内容 | 形态 |
|---|---|---|---|
longitudinal/ |
In-Gauge | 逐教室环境 CSV | 16 份,每份约 5.3 MB |
participant_class_info/ |
共用 | 学生与教师背景表、课次表 | 3 份 CSV |
survey/ |
En-Gage | 学生与教师问卷回复 | 2 份 CSV |
raw_wearable_data.zip |
En-Gage | 按日期的原始腕带会话 | 1.5 GB 压缩包,解压为 20 个子目录 |
class_wearable_data/ |
En-Gage | 按课时的腕带信号 | 221 个子目录 |
README.txt |
全部 | 字段字典与目录说明 | 纯文本,11.2 KB |
LICENSE.txt |
全部 | ODC-By 1.0 全文 | 纯文本,19.9 KB |
SHA256SUMS.txt |
全部 | 逐文件校验和 | 纯文本,669 KB |
README 是这份数据里最有用的一份文档。它把每个字段的取值范围逐条列出,比官网页面的数据描述段细。例如课次编号一列,README 写明 -1 表示课外时间、0 表示 8:50 至 9:00 的晨会、1 至 8 分别对应具体的节次、9 表示课间休息或周三的特殊课程。这类信息只看官网是拿不到的。
2.2 字段与记录的完整字典
In-Gauge 的每份 CSV 都有同一套 23 列。前七列是时间与课次结构,接下来四列是室内环境,九列是室外气象,最后三列是空调状态与可用性。
| 列名 | 含义 | 取值 | 备注 |
|---|---|---|---|
| Time | 当日时刻 | 00:00:00 至 23:55:00 | 步长 5 分钟 |
| Day | 采集日序号 | 1 至 169 | 1 为第一天,README 写 169,实际文件到 110 |
| Occupied | 是否占用 | 0 否 / 1 是 | 由课表换算 |
| SchoolDay | 是否上学日 | 0 否 / 1 是 | 已计入维州学校假期 |
| Hour | 小时 | 0 至 23 | 冗余列,便于分组 |
| LessonNumber | 课次编号 | -1 至 9 | -1 为课外,9 为课间或周三特课 |
| LessonPct | 课内进度 | 0.0 至 1.0 | 当前课次已过比例 |
| IndoorTemperature | 室内温度 | 摄氏度 | 浮点 |
| IndoorHumidity | 室内湿度 | 百分比 | 整数 |
| IndoorCO2 | 室内二氧化碳 | ppm | 整数 |
| IndoorNoise | 室内噪声 | 分贝 | 整数 |
| OutdoorTemperature | 室外温度 | 摄氏度 | 浮点,双站平均 |
| OutdoorHumidity | 室外湿度 | 百分比 | 浮点 |
| OutdoorDewpoint | 室外露点 | 摄氏度 | 浮点 |
| OutdoorWindDirection | 风向 | 0 至 360 度 | 0 为北风,90 为东风 |
| OutdoorWindSpeed | 风速 | 米每秒 | 浮点 |
| OutdoorGustSpeed | 阵风速度 | 米每秒 | 浮点 |
| Precipitation | 降水 | 毫米 | 浮点 |
| UvLevel | 紫外线指数 | 整数 | 全球太阳紫外线指数 |
| SolarRadiation | 太阳辐射 | 瓦每平方米 | 整数 |
| CoolingState | 制冷状态 | 0 关 / 1 开 | 阈值推断 |
| HeatingState | 制热状态 | 0 关 / 1 开 | 阈值推断 |
| UsabilityMask | 当日是否可用 | True / False | 假期与缺失过多时为 False |
有一处需要在使用前先处理的细节:README 把 Day 的上限写成 169,即五个半月的全部日历日;而本次访问的某一份教室文件,实际只到第 110 天。这两个数字并不矛盾——169 是研究的日历跨度,110 是该教室有记录的天数,中间的空档由 UsabilityMask 与插值共同覆盖。写分析时若以 169 为分母计算覆盖比例,会把同一段时间数两遍。
2.3 一条记录的完整解剖
取一份教室 CSV 的头两行,可以看到一行的样子。凌晨零点,教室未被占用,室外 13.25 摄氏度、湿度八成多一点,风向 135 度,室内二氧化碳五百出头,制冷与制热都是关,可用性掩码是 False。
Time,Day,Occupied,SchoolDay,Hour,LessonNumber,LessonPct,IndoorTemperature,IndoorHumidity,IndoorCO2,IndoorNoise,OutdoorTemperature,OutdoorHumidity,OutdoorDewpoint,OutdoorWindDirection,OutdoorWindSpeed,OutdoorGustSpeed,Precipitation,UvLevel,SolarRadiation,CoolingState,HeatingState,UsabilityMask
00:00:00,1,0,1,0,-1,-1.0,18.9,58,519,35,13.25,81.5,10.085,135.0,1.2,1.65,0.0,0.0,0.0,0,0,False
00:05:00,1,0,0,0,-1,-1.0,18.9,58,515,35,13.22,81.5,10.14,135.0,1.1,1.6,0.0,0.0,0.0,0,0,False
这一行里藏着几个容易忽略的约定。第一,室内列对该教室唯一,室外列则在 16 份文件里完全重复——README 明说这些列「在所有文件里都是重复的」,做多教室分析时只应取一次,否则同一阵风会被算十六遍。第二,LessonPct 在课外时段是 -1.0,不是一个合法的进度值,任何按进度做加权的计算都要先把它排除。第三,SchoolDay 在第一行给 1、第二行给 0,同一天里出现两种取值,这是官方文件里的一处内部不一致,官方未说明成因,分析时以天为单位取众数更稳妥。
2.4 可穿戴侧的三张表与六种信号
En-Gage 的元数据分三份,信号分六种。
| 表或信号 | 文件 | 行数或采样率 | 主键或单位 |
|---|---|---|---|
| 学生背景 | student.csv |
23 行 | Pid |
| 教师背景 | teacher.csv |
6 行 | Pid,形如 t1 至 t6 |
| 课次表 | class_table.csv |
248 行 | Class_id |
| 学生问卷 | student_survey.csv |
488 行 | Pid + Week + Weekday |
| 教师问卷 | teacher_survey.csv |
22 行 | Wristband_id + Week + Weekday |
| 加速度 | ACC.csv |
32 Hz | 1/64 g,三列 |
| 血容脉冲 | BVP.csv |
64 Hz | 未标定幅度 |
| 皮肤电 | EDA.csv |
4 Hz | 微西门子 |
| 心率 | HR.csv |
1 Hz | 次每分,十秒跨度平均 |
| 心搏间期 | IBI.csv |
事件式 | 秒,两列 |
| 皮肤温度 | TEMP.csv |
4 Hz | 摄氏度 |
课次表的 248 行是四周内的全部课时,跨 R1 至 R7 七间教室加一个课外分组,课程名含 Assembly、Chapel、English、Form、Health、Language、Maths、PE、Politics、Science 等。课次表还有一列 is_Form,取值为 0、all 或 R1、R2、R3,用来区分全班合上、小组分上与非分组课。这一列是把「这一节课有多少人在场」从课表推出来的唯一线索。
2.5 两个口径:17 间教室与 16 份文件
这是本库最容易被引用错的一处。官方在同一次发布里给出了两个数。
| 口径 | 出处 | 数值 | 说明 |
|---|---|---|---|
| 教室数 | 官方摘要与方法段 | 17 | 安装室内气象站的教室数 |
| 教室文件数 | longitudinal 目录实况 | 16 | 逐教室一份 CSV |
| 教室文件数 | 数据描述论文 | 16 | 与目录一致 |
| 课次表房间 | class_table.csv | 8 个取值 | R1 至 R7 加 Out |
官方未解释 17 与 16 的差额。README 只说「文件名对应教室名称」,没有给出教室清单。稳妥的做法是:引用教室数时写「正文称 17 间」,描述可分析单元时写「16 份文件」。若研究工作依赖逐教室的样本量,以文件数为准;若引言需要概述研究规模,按官方口径写 17 并注明差异。额外再补一句:课次表只出现 R1 至 R7 七间教室加一个 Out,与 16 份环境文件的房间名不一致,两边按房间号直接连接的尝试会失败。
2.6 一节腕带会话的解压与校验
即便只取一段,腕带侧的解压也要走一遍,因为它决定后面所有路径写法。整包里的 raw_wearable_data.zip 需要单独展开,展开后是二十个以「周次_星期几」命名的子目录。
#-- 从整包中单独抽出按日期副本,并看结构
unzip -q in-gauge-and-en-gage/1.0.0/raw_wearable_data.zip -d wearable_raw
ls wearable_raw | head -5
find wearable_raw -maxdepth 2 -name "*.csv" | wc -l
find wearable_raw -maxdepth 2 -name "EDA.csv" | wc -l
第三条与第四条命令的差异值得留意。前者数全部 CSV,后者只数皮肤电。一段会话有六个文件,若两者的比值不是六,说明存在不完整的会话——某个信号缺失,或写入中断。官方没有给出会话完整性的核对办法,这条比值是使用者能自己建立的最简单的一道检查。
| 检查项 | 期望关系 | 不合预期时的含义 |
|---|---|---|
| CSV 总数与 EDA 文件数 | 六比一 | 存在缺文件的会话 |
| 会话目录名 | 下划线后为参与者编号 | 命名异常或存在非参与者会话 |
| 每个子目录的会话数 | 不少于一人一日 | 当日有参与者未佩戴 |
| HR 与 IBI 是否同时存在 | 应当同时 | 一处缺失意味着另处不可信 |
2.7 与同类资源的规格对照
| 资源 | 环境侧 | 生理侧 | 问卷 | 人群 | 许可 |
|---|---|---|---|---|---|
| 本库 | 16 至 17 间教室,5 分钟,5.5 个月 | E4 六路,4 周 | 488 + 22 份 | 29 名师生 | ODC-By |
| 办公建筑居住者行为库 | 多为办公室,单点传感 | 无 | 偶有 | 上班族 | 各库不同 |
| 情感计算公开库 | 实验室房间 | 多导联 | 有情绪标签 | 志愿者 | 多为研究用 |
| 校园环境监测库 | 多校或单校 | 无 | 无 | 不涉及个人 | 多为开放 |
| 学生可穿戴队列 | 常缺环境侧 | 腕带 | 有 | 青少年 | 多为受限 |
对照下来,本库的位置很明确:它是少数把环境与生理在同一场景同时收齐的资源,代价是两边都只有一所学校。
§3 两个名字各是什么:一份发布里的两支子研究
3.1 In-Gauge:以房间为单位的时间序列
In-Gauge 这个名字的设计意图写在官方背景段里——它对应「gauge」,即把室内环境量出来。这支研究的采集期是 2019 年 10 月到 2020 年 3 月,跨一个南半球的春末到初秋。设备有三类:两台室外气象站,一装在北北西向的迎风侧,一装在南南东向的背风侧;十余台室内气象站,装在教室约 0.9 米高处;以及贴在分体空调出风口上的温湿度传感器。
三类设备的共同点是都以五分钟为周期记录。这个周期不是随意的,它同时满足三个约束:气象站本身的上报节奏、空调出风口温度变化的可分辨性、以及整学期文件体量的可管理性。十分钟会漏掉课间空调被关掉又重新打开的动作,一分钟则会让单份文件膨胀到数百兆。
0.9 米的安装高度值得单说一句。官方给出的理由是要考虑儿童身高低于成人,而在热舒适标准的建议里,0.1、0.6、1.1 米分别对应脚踝、坐姿躯干与站姿躯干。教室里的感知主体是坐着的学生,0.9 米大致落在坐姿头部与站姿腰部之间,是一个折中。
3.2 En-Gage:以人为单位的事件流
En-Gage 对应「engage」,把课堂投入量出来。采集期是四周,分两段:2019 年 9 月初起两周,10 月底起两周。参与者 23 名学生与 6 名教师,学生全部来自十年级,年龄 15 至 17 岁,其中女生 13 名、男生 10 名;教师年龄 33 至 62 岁,女生 4 名。招募范围是该年级的全体学生与全体教师,最终自愿参与的比例在论文里给出为三分之一上下。
佩戴是日常式的:非惯用手腕,每天早晨由每个班选出一名代表发放腕带,放学后收回,同时提醒同伴按时填写在线问卷。这个流程决定了数据的形状——它不是连续几周的闭环记录,而是一段段当日在校期间的会话,中间夹着午休、体育课与回家后的空档。
问卷有三个固定时点:每天第 2、4、5 节课结束后,分别落在 11:00、13:25、15:35 前后。学生问卷 17 列,覆盖热感觉、热偏好、着装、就座坐标、五维投入、情绪唤醒度与效价、以及答题自信度。教师问卷 13 列,题目与学生的略有改写,例如投入五题从「我上课时专注」改成「我教学时专注」。
3.3 两支子集能对上的地方与对不上的地方
| 维度 | In-Gauge | En-Gage | 能否直接对接 |
|---|---|---|---|
| 时间粒度 | 5 分钟一行 | 4 Hz 至事件式 | 不能,需降采样 |
| 载体单位 | 教室 | 人 | 不能,需经课次表 |
| 时间范围 | 2019 年 10 月至 2020 年 3 月 | 2019 年 9 月与 10 月各两周 | 部分重叠 |
| occupants 标识 | 无 | Pid 与腕带编号 | 不能,缺映射 |
| 课次标识 | LessonNumber 0 至 9 | Class_id 1 至 248 | 不能,两套独立编号 |
| 房间标识 | 文件名即房间号 | Room 列 R1 至 R7 | 名称不同,需人工映射 |
| 天气 | 室外九列 | 与 In-Gauge 同一批气象站 | 能,但只有时间重叠段 |
官方对两边的连接方式说得很克制:两研究在同一校园、时间线部分重叠,因此纵向研究里收集的天气与占用信息可以给横断面研究提供背景,反之亦然。注意这里说的是「背景」,不是「逐条配对」。§4.3 的案例会说明,真正可用的连接方式只有一条——按课时。
3.4 两支子集的伦理与知情框架
两支子研究共用一套伦理安排,这一点在官方伦理段写得很短,但对使用者判断数据边界有直接影响。审批来自皇家墨尔本理工大学的科学、工程与健康学院人类伦理咨询网络,项目另经校长批准,未成年人另需监护人书面同意。参与者得到的是参与证书与每周一张电影券。
| 项 | In-Gauge | En-Gage | 对使用者的含义 |
|---|---|---|---|
| 伦理审批 | 同一咨询网络 | 同一咨询网络 | 批件覆盖范围一致 |
| 校方批准 | 是 | 是 | 校名未公开 |
| 未成年人同意 | 不涉及个人 | 监护人书面同意 | 未成年人数据的使用应更谨慎 |
| 匿名化 | 不涉及个人 | 参与者编号 | 编号与身份映射不在发布范围内 |
| 日期处理 | 保留日序号 | 剥离日期 | 两侧的时间还原方式不同 |
| 报酬 | 未提及 | 证书加电影券 | 参与动机可能影响配合度 |
最后一行常被忽略。有报酬的自愿参与,与随机抽样的配合度不同,这会让问卷完成率与佩戴依从性偏高。这不是数据质量问题,而是样本产生机制的描述,写方法段时值得提一句。
§4 它最独特的东西:把两条不相干的时间轴钉在同一张课表上
4.1 建筑物有它的时钟,人有他的时钟
五分钟网格是建筑的时钟。它规整、连续、可预测,适合做序列模型:给定上一步的室内温度与室外温度,预测下一步空调是开还是关。这是一个标准的时序分类问题,输入维度不高,序列长度一千有余。
赫兹波形是人的时钟。它不规则、断续、由课表与个人习惯共同切分,适合做窗口级特征:在一节课的四十分钟里取皮肤电的均值与斜率、心率的中位数与变异性,再与这节课的投入自评对应。
把两个时钟放在一起,会得到一个在别的数据集里很少见的任务:给定建筑的状态,预测人的状态;或者反过来,从人的状态反推建筑被怎样使用。官方在用途段给出的三个方向,正好都落在这条线上。
4.2 为什么「课次」是唯一可靠的连接键
课次表是全库唯一同时带着房间、时间、周次、星期与课程名的表。它的每一行是一个具体的课时:第几周的星期几、几点到几点、在哪个房间、上什么课。有了它,两边才可能被放到同一个坐标系里。
腕带侧的做法印证了这一点。按课时整理的副本,正是用这张表把每一段腕带信号切进对应的课时目录;官方给的切分规则也很具体——问卷在 11:25 前提交的算第 2 节,12:15 至 14:15 之间提交的算第 4 节,14:15 之后提交的算第 5 节。这三条规则不是随便定的,它们对应三个问卷时点与三节课的结束时刻。
反过来,环境侧的 LessonNumber 列则是从同一张课表压缩出来的更粗的版本:一至八节,加上 -1 与 9。它不区分是哪个班、哪门课,只告诉你「现在处于第几节」。这意味着环境侧只能为腕带侧提供「课次层面的背景」,不能提供「这门课在这个房间里的具体气候」。
4.3 案例:十年级学生 P17 的第四节课
下面这个案例是本文的贯穿线索。参与者编号 P17 是 23 名学生之一,参与了四周的佩戴;第 1 周星期 2 的第四节课,他在 R3 教室上 Language。本节只做一件事——把这件事需要的四张表列清楚,看看每一步能拿到什么、拿不到什么。
| 步骤 | 需要的表 | 拿到的信息 | 拿不到的 |
|---|---|---|---|
| 定位课时 | class_table.csv |
Class_id、Room=R3、Start=11:00、Finish=12:00 前后、Subject=Language | 这间教室当时是否开着空调 |
| 定位环境 | longitudinal/ 中对应 R3 的文件 |
该时段室内温度、二氧化碳、课次编号 4 | 该教室的编号与课次表 Room 列的对应关系 |
| 定位信号 | class_wearable_data/<Class_id>/17/ |
EDA、BVP、ACC、HR、IBI、TEMP 六份 CSV | 该生是否是这节课的实名参与者 |
| 定位自评 | student_survey.csv |
12:15 前提交的那份问卷算第 4 节 | 问卷与信号之间的秒级对齐 |
这张表最有价值的一行是第二行。R3 是课次表里的房间名,而环境文件的文件名是教室编号(形如 19、20、KB1),两套命名之间没有任何对照表。这意味着「P17 在 R3 上课时,教室的二氧化碳是多少」这个问题,在这份数据上无法确定地回答——除非研究者自己知道哪份文件对应 R3,而这个信息官方没有给。
4.4 这条设计带来的两种研究路线
路线一,从建筑到人。以课次为单位,把环境侧的四项室内指标汇总到每一节课,作为特征;把腕带侧的一节课信号汇总成若干统计量,作为另一组特征;把问卷的五维投入评分的均值作为标签。这条路线的问题是标签太少——488 份问卷摊到两百余节课与二十几名参与者上,平均每节课不到两份。
路线二,从人到建筑。以五分钟为单位,把该教室的占用与课次作为输入,预测空调状态。这条路线不涉及任何腕带信号,用的是 In-Gauge 这一支的全部价值。它的问题在别处:空调状态本身是阈值推断出来的,用一个推断量当标签,模型的性能上限受推断规则限制。
两条路线各自成立,但都不需要对方。真正需要两边的,是第三条——「在开着空调的教室里,学生的唤醒水平与热感觉是否相关」。这条问题的样本量被问卷数锁死在数百量级,且只能在单一校园内回答。
§5 怎么把它取下来并用起来
5.1 获取路径与体量
官方提供三种取法:整包下载约 5.1 GB 的 ZIP,解压后 12.8 GB;用 wget 递归拉取整个目录;或用 AWS 命令行从开放桶同步。前两种不需要任何凭证,第三种也不需要——桶是公开只读的。
体量主要来自腕带。按课时整理的目录数量最多,但每段信号只有一节课的长度;按日期整理的压缩包 1.5 GB,解压后占大头。环境侧反而很小,16 份 CSV 各 5 MB 出头,加起来不到一百兆。
#-- 只取入门所需的三样:一份教室 CSV、元数据、问卷
BASE=https://physionet.org/files/in-gauge-and-en-gage/1.0.0
mkdir -p gauge_demo && cd gauge_demo
curl -sO "$BASE/README.txt"
curl -sO "$BASE/longitudinal/19.csv"
curl -sO "$BASE/participant_class_info/class_table.csv"
curl -sO "$BASE/participant_class_info/student.csv"
curl -sO "$BASE/survey/student_survey.csv"
ls -lh
这段命令只拉两份文件里的公共部分与三张元数据表,合计不到十兆。先跑通这一层,再决定要不要整包下载,是这份数据最省事的入门方式——尤其在腕带侧动辄上 GB 的情况下。
5.2 核对文件清单与口径
下载完整包后,第一件事不是读数据,而是对清单。目录实况与官方正文的差异已在 §2.5 列出,动手之前先把它们记下来。
#-- 核对 longitudinal 目录下到底有几份教室文件
import pathlib
root = pathlib.Path("in-gauge-and-en-gage/1.0.0")
lon = root / "longitudinal"
files = sorted(p.name for p in lon.glob("*.csv"))
print("教室文件数:", len(files))
print("教室编号:", ", ".join(p.removesuffix(".csv") for p in files))
cls = (root / "participant_class_info" / "class_table.csv").read_text(encoding="utf-8")
rooms = sorted({ln.split(",")[1] for ln in cls.splitlines()[1:] if ln.strip()})
print("课次表房间:", rooms)
overlap = set(files) & {r + ".csv" for r in rooms}
print("两套命名可自动对上:", len(overlap))
这段代码通常会把「可自动对上」打印成零。这不是数据坏了,而是两套命名体系本来就不同源:环境文件用楼里的教室编号,课次表用 R 加序号。任何想按房间做连接的分析,都必须先由人工建立对照,而官方没提供,这是这份数据在接入环节的第一个硬约束。
5.3 用课次表做时间轴
课次表的 248 行是 En-Gage 侧的时间骨。下面这段把课次表摊开,检查四周内的星期分布与房间分布,这是做任何按课时分析之前的基本功课。
#-- 读课次表,看周次、星期、房间的覆盖
import csv
from collections import Counter
with open("participant_class_info/class_table.csv", encoding="utf-8-sig") as f:
rows = list(csv.DictReader(f))
print("课时总数:", len(rows))
print("周次分布:", sorted(Counter(r["Week"] for r in rows).items()))
print("星期分布:", sorted(Counter(r["Weekday"] for r in rows).items()))
print("房间分布:", sorted(Counter(r["Room"] for r in rows).items()))
print("周次×星期组合数:", len({(r["Week"], r["Weekday"]) for r in rows}))
最后一行是判断覆盖是否完整的快捷方式。四周乘以五个工作日应当得到二十个组合;若小于这个数,说明某些教学日没有课时记录,或者课次表只覆盖了有腕带信号的那部分课时。无论是哪种,都会影响把课次表当作完整日历使用的做法。
5.4 读一段腕带信号
腕带会话的六个 CSV 格式不完全相同。五个带采样率的文件,前两行分别是 Unix 起始时刻与采样率,第三行起才是数值;心搏间期那个文件没有采样率行,第一列是距会话起点的秒数,第二列是该次间期的时长。
#-- 读一段 E4 会话的 EDA,并恢复绝对时间
import numpy as np
import datetime as dt
def load_e4(path):
with open(path, encoding="utf-8") as f:
head = [f.readline().strip() for _ in range(2)]
start, rate = float(head[0]), float(head[1])
arr = np.loadtxt(path, delimiter=",", skiprows=2, ndmin=2)
t0 = dt.datetime.utcfromtimestamp(start)
return arr, rate, t0
eda, rate, t0 = load_e4("class_wearable_data/2/17/EDA.csv")
print("采样率", rate, "样本数", len(eda), "起点", t0.isoformat())
print("时长分钟", round(len(eda) / rate / 60, 1))
这段代码有两个必须知道的坑。第一,起始时刻是 UTC,而所有问卷与课次表都是当地时刻;墨尔本在采集期大部分处于夏令时,偏移是十一小时,而不是十小时。第二,按课时整理的副本已经把时间戳换成了当日时刻,前两行不再是 Unix 秒,若沿用同一函数去读,第一行会被当成一个巨大的浮点数,得到明显离谱的结果。两种副本要用两个读取函数。
5.5 把环境与课时叠在一起
把一份教室 CSV 按课次编号切分,可以为每节课算出一个房间级的摘要。下面这段给出最基础的版本:每个课次编号对应多少行、室内温度的中位数是多少。
#-- 按课次编号汇总一份教室 CSV 的室内温度
import csv
import numpy as np
buckets = {}
with open("longitudinal/19.csv", encoding="utf-8-sig") as f:
for r in csv.DictReader(f):
if r["UsabilityMask"].strip().lower() != "true":
continue
k = int(r["LessonNumber"])
buckets.setdefault(k, []).append(float(r["IndoorTemperature"]))
for k in sorted(buckets):
v = np.array(buckets[k])
print(f"课次 {k:>2}: 行数 {v.size:>4} 温度中位数 {np.median(v):.1f} 摄氏度")
输出的课次 -1 会占掉大部分行数,因为它对应全部课外时段——夜里、周末与假期。做教学场景分析时,-1 这一桶通常要整体丢掉,而不是当作一个类别保留。
5.6 对齐问卷与课时
问卷的时间对齐是这份数据里最容易被想当然的一步。官方给的三条规则是区间规则,不是精确配对。
#-- 按官方三条规则把学生问卷分配到第 2、4、5 节
import csv
import datetime as dt
def slot_of(tstr):
h, m, s = (int(x) for x in tstr.split(":"))
t = dt.time(h, m, s)
if t <= dt.time(11, 25):
return 2
if dt.time(12, 15) <= t <= dt.time(14, 15):
return 4
if t > dt.time(14, 15):
return 5
return None
with open("survey/student_survey.csv", encoding="utf-8-sig") as f:
rows = list(csv.DictReader(f))
print("问卷总数:", len(rows))
print("落不进三节课的:", sum(1 for r in rows if slot_of(r["Time"]) is None))
输出通常会把「问卷总数」打印成四百余份,把「落不进三节课的」打印成两位数。后者就是 11:25 到 12:15 之间提交的那部分。§4.3 的案例里 P17 的第四节课问卷,正好落在这条规则的第二段区间内,因此可以确定被切进第 4 节;但同一节课若有同伴在 11:20 交了卷,那份就会被切进第 2 节,两人的自评于是被分到两个课时里。这是区间对齐的固有代价,写方法段时应当说明是否做了丢弃或合并。
5.7 用 SHA256 清单校验整包
整包发布附带一份逐文件校验和清单,体量不大但覆盖面最广。下载完成后先跑一遍,能一次性排除传输中断与解压截断两类问题。
#-- 在解压后的版本目录内逐文件校验
cd in-gauge-and-en-gage/1.0.0
sha256sum -c SHA256SUMS.txt --quiet
echo "退出码: $?"
wc -l SHA256SUMS.txt
清单条数与实际文件数对上,说明解压完整;对不上则说明清单只覆盖部分目录,通常是腕带压缩包内的内容不在清单范围内。这一点官方未说明,第一次使用时很容易误以为丢了文件。
5.8 从心率推一些简单的课堂量
心率是六个信号里最容易解释的一个,1 赫兹、十秒跨度平均,适合做分钟级的趋势而不适合做逐搏分析。下面这段给出一个按课时切片并统计的最小实现。
#-- 取一节腕带会话的心率,算均值与四分位
import numpy as np
def load_rate(path):
with open(path, encoding="utf-8") as f:
f.readline()
rate = float(f.readline().strip())
v = np.loadtxt(path, delimiter=",", skiprows=2, ndmin=1)
return v, rate
hr, rate = load_rate("class_wearable_data/2/17/HR.csv")
q1, q2, q3 = np.percentile(hr, [25, 50, 75])
print("采样率", rate, "样本数", len(hr))
print("均值", round(float(hr.mean()), 1), "中位数", round(float(q2), 1))
print("四分位", round(float(q1), 1), round(float(q3), 1))
这段输出只适合当入口,不适合当结论。心率在一节课里会因起身、点名、看黑板而起伏,均值掩盖了这些动作;真正要做关联分析时,至少要把加速度能量当作控制变量一起看。下表列出几个常用量及其代价。
| 量 | 计算方式 | 用在哪里 | 注意 |
|---|---|---|---|
| 课内心率均值 | 课时片段内全部样本求平均 | 与投入自评做相关 | 受体育课影响剧烈 |
| 课内心率中位数 | 同上,取中位数 | 对运动伪迹更稳 | 仍不能排除课间歇 |
| 课内皮肤电均值 | EDA 片段求平均 | 唤醒代理 | 零点漂移需先处理 |
| 课内皮肤电斜率 | 片段的线性拟合斜率 | 唤醒上升趋势 | 强依赖窗口长度 |
| 课内加速度能量 | ACC 三轴平方和均值 | 活动量控制变量 | 常用于剔除运动段 |
| 有效样本占比 | 片段内非零样本比例 | 数据可用性 | 与官方质控口径不同 |
§6 与库内相关资源的关系
6.1 关系图谱
这份数据在库里的位置有点特别。它既不是纯生理信号库,也不是纯环境库,所以两侧各能找到一半的近亲。
| 关系 | 库内对象 | 共同点 | 差异 |
|---|---|---|---|
| 同平台 | PhysioNet 上的其它 PhysioNet 项目 | 托管、DOI、版本化 | 本库是少数非临床场景的公开资源 |
| 生理侧近亲 | 各类单导皮肤电与心率库 | E4 或类似腕带,含 EDA 与 BVP | 那些库多在实验室或睡眠场景 |
| 环境侧近亲 | 建筑环境与居住者行为类开放库 | 五分钟级室内外气候 | 那些库少有同步生理 |
| 人群近亲 | 青少年队列类资源 | 未成年人样本 | 那些多有临床随访 |
| 调查侧近亲 | 问卷与量表类资源 | Likert 自评 | 那些少有同时段信号 |
6.2 检索路径
| 你想找的 | 在这份库里搜什么 | 在库内别处找什么 |
|---|---|---|
| 皮肤电与情绪 | EDA、Arousal、Valence | 情感计算与情绪识别类资源 |
| 课堂与学习投入 | Engage_1 至 Engage_5、Class_id | 教育数据挖掘类资源 |
| 室内气候与空调 | IndoorCO2、CoolingState | 建筑能耗与室内空气质量类资源 |
| 青少年可穿戴 | 学生 23 名、15 至 17 岁 | 青少年队列类资源 |
| 多模态融合 | 环境加生理加问卷三源 | 多模态类资源 |
6.3 与库内纯生理信号资源的分工
库里有不少以单导或少数导联生理信号为主体的资源,它们的共同特征是采集条件受控、标签明确、适合做算法基准。本库与它们的分工很清楚:那些资源回答「这个信号能多准地识别某个状态」,本库回答「这个信号在真实场景里是什么样」。前者的对标对象是论文里的表格,后者的对标对象是课堂里的一节课。
这个分工也决定了引用方式。如果一篇论文要证明某个皮肤电特征在受控条件下有效,引本库是不合适的,因为本库没有受控任务、没有对照刺激。反过来,若一篇论文要说明某个特征在真实课堂里的分布形状,引本库就非常恰当。
6.4 若要用它做跨库对比,先对齐的三件事
跨库对比是这类数据最常见的误用来源。要让对比有意义,至少要在三件事上达成一致:时间窗、人群定义、标签来源。
| 对齐项 | 本库的做法 | 常见别库的做法 | 不对齐时的后果 |
|---|---|---|---|
| 时间窗 | 一节课,四十到九十分钟 | 固定三十秒或五分钟 | 均值与方差的量级不可比 |
| 人群定义 | 十年级学生加授课教师 | 成人志愿者 | 皮肤电基线水平差异被当成效应 |
| 标签来源 | 课后自评,区间对齐 | 同步刺激或即时按键 | 标签滞后被忽略 |
| 活动控制 | 无,含体育课 | 有,多为静坐 | 运动伪迹进入信号 |
| 设备 | E4 腕带 | 多导联或指端电极 | 腕部与指端测量本身不等效 |
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
在给这份数据打分之前,先要校正一个常见的错位:它是两份研究被装进同一个发布,不是一个研究的两条支线。任何单一维度的评分,都会在两边之间摇摆。
具体来说,In-Gauge 侧的数据完整度很高——五分钟网格连续、插值规则明确、可用性掩码逐日标注;En-Gage 侧则天然断续——每天一段在校时间、每周五天、四周为止。若把两边当成一个整体去评「时间连续性」,得到的分数会失真。因此下表的五个维度,每一项都会注明主要适用于哪一侧。也要提醒一句:若把这份数据当作纯生理信号库来评,几乎每一项都会被低估,这是一种预设错位。
7.1 DAIMS 五维评分
DAIMS 是本库惯用的数据质量框架,五个维度各五分。下表按两边分别给分,再给一个合并判断。
| 维度 | In-Gauge 侧 | En-Gage 侧 | 依据 |
|---|---|---|---|
| 数据量与覆盖 | 4 | 2 | 环境侧五个半月、十余教室,够用;可穿戴侧二十九人、四周 |
| 标注与元数据 | 4 | 3 | 环境侧字段字典完整;可穿戴侧的问卷区间对齐稍粗 |
| 可用性与许可 | 5 | 5 | ODC-By 仅署名,无注册,无地区限制 |
| 文档与可解释 | 4 | 3 | README 细,但两套命名未给对照表 |
| 结构与一致性 | 3 | 3 | 17 与 16 的差额、SchoolDay 同日两值、Day 上限两说 |
| 合计 | 20 | 16 | 环境侧明显强于可穿戴侧 |
合并判断是三分之四:环境侧可以直接当建筑能耗建模的校准素材,可穿戴侧适合做可行性与关联分析,不适合做训练集。
7.2 分数的具体依据
规模一项给环境侧四分而非满分,扣在单校单学期。建筑能耗模型的泛化能力依赖跨建筑、跨气候的样本,而这里只有一栋。
标注一项给可穿戴侧三分,扣在对齐。问卷本身是标准量表,题目清晰、编码明确、缺失有留白;但问卷与信号之间的连接依赖区间规则,且问卷是在课后提交的,同一节课的多个问卷可能相隔数分钟。
结构一项两边都只给三分,是本表里最值得展开的一项。已知的三处不一致如下:教室数 17 与文件数 16;SchoolDay 在同一日内出现两种取值;Day 的上限 README 写 169 而个别文件只到 110。这三处都不影响数据可用性,但都会在自动化流程里制造静默错误。
7.3 已知的、可枚举的偏差
| 偏差 | 方向 | 典型影响 |
|---|---|---|
| 单校、私立、十年级 | 人群偏同质 | 任何比例都不能外推 |
| 自愿参与 | 参与者可能更守时、更配合 | 问卷完成率与信号质量偏高 |
| 教师仅授课时佩戴 | 教师样本的有效时长短 | 教师侧不宜做日内节律分析 |
| 日间非连续采集 | 放学后无信号 | 无法研究晚间与睡眠 |
| 空调状态阈值推断 | 状态标签含误判 | 预测模型的上限受限 |
| 占用由课表换算 | 缺席、生病未反映 | 占用标志偏理想化 |
| 问卷课后提交 | 回忆偏差 | 自评与生理的时间错位 |
| 两周×两段的横断面 | 学期效应未控 | 九月与十月底可能不可直接比 |
7.4 外部验证矩阵
| 验证来源 | 能验证什么 | 不能验证什么 |
|---|---|---|
| 数据描述论文(Sci Data 2022) | 全部规模数字与采集协议 | 现场之外的泛化 |
| 同组作者的课堂投入论文 | 投入量表在真实课堂的可分性 | 其它学校是否可复现 |
| 同组作者的就座体验分析 | 位置与投入的关系 | 房间气候是否中介了这个关系 |
| 同组作者的自评可靠性研究 | 自报数据与信号的一致性 | 独立团队的对齐规则 |
| 本次的文件目录核对 | 16 份教室文件、248 行课次表 | 17 与 16 差额的成因 |
这张表说明一件事:关于这份数据的所有主张,目前都能在同组作者的系列论文里找到落点,但还没有一项在独立团队、独立学校的数据上被复现。对一个单校研究来说,这是结构性的,不是缺陷。
7.5 它为何能持续:一组被反复引用的公开原始素材
单校、单学期、二十九人的数据,通常很难活过发表后的两三年。这类数据能撑住的原因,是它占据了一个别人不愿意重做的位置。重做这件事需要协调一所学校、采购十余台室内气象站、让二十九个人连续四周佩戴腕带、每天准时填写问卷、再处理几千小时的断续会话。成本极高,收益只是一份公开。
更重要的是,它同时占了两个位置。做建筑能耗的、做学习分析的、做情感计算的,三拨人各自找数据时会撞上同一份,但各取一半。这种「一份数据服务三个社区」的结构,让它的引用曲线比单一用途的数据更平缓。
§8 生态位与历史
8.1 从居住者行为到多点传感的这条线
建筑能耗研究在上世纪末还是工程问题:围护结构、设备效率、运行策略。到了两千年后,研究者逐渐意识到,同样的建筑在不同使用方式下能耗差异巨大,于是出现了「居住者行为」这一支。早期的做法是用问卷和访谈,后来转向计量插座与门磁,再后来是室内气象站与二氧化碳传感。
这条线的转折点,是把「行为」从票数式的统计变成了时间序列。一旦有了五分钟粒度的占用与空调状态,居住者行为建模就可以从回归分析走到序列预测,也就有了本库 In-Gage 一侧的直接用途。
8.2 从实验室情绪测量到自然场景
可穿戴生理信号进入教育场景,是更晚的事。情感计算的早期数据集多在实验室,被试坐着看图片或视频,对刺激做出情绪反应,信号干净、标签明确。问题是这种设置与真实课堂几乎无关:课堂里的注意力起伏是分钟级的,情绪是低强度的,考试压力与日常状态的差别也不是一张图片能模拟的。
En-Gage 这一侧的策略是放弃精密控制,换取场景真实。没有刺激、没有对照、没有任务,只有日常的课。代价是标签的确定性下降——投入自评本身是主观的,而且是在课后回忆。
8.3 同组作者的系列工作
| 年份 | 工作 | 与本库的关系 |
|---|---|---|
| 2020 | 课堂投入的野外预测(n-Gage) | 确立了投入五维的结构,本库沿用 |
| 2021 | 自报数据的可靠性考察 | 解释了为什么问卷对齐只能做到区间级 |
| 2021 | 图分享版数据集 | 本库的前身发布 |
| 2022 | 课堂就座体验分析 | 用本库的就座坐标与投入评分 |
| 2022 | 数据描述论文(Sci Data) | 本库的正式描述与规模数字来源 |
| 2023 | PhysioNet 1.0.0 发布 | 本库本身,补上了周次与星期的索引 |
8.4 它在今天的可用性
这份数据的采集已经是几年前的事。设备层面 E4 腕带仍在流通,采集协议没有过时;场景层面,疫情之后的课堂形态与在校时间发生过变化,这使得「2019 年的课堂」成为一个特定的历史横断面,而不是普遍样本。
这反而给了它一个新的用途:作为对照基线。任何新的课堂研究,都可以把自己的教室环境与生理指标,与这份几年前的单校基线做个粗略对照,看看是否落在同一个量级。这个用法不严谨,但很有用。
§9 使用指引
9.1 三种角色的路径
| 角色 | 最短路径 | 主要收获 | 主要风险 |
|---|---|---|---|
| 建筑环境研究者 | 取 16 份教室 CSV → 按教师分组 → 训练空调状态分类器 | 一组真实占用与空调标签 | 忽略 17 与 16 的口径,误报样本量 |
| 学习分析研究者 | 取课次表与问卷 → 按参与者分组 → 与腕带特征做关联 | 真实课堂的投入与生理 | 用课时副本数量虚增样本 |
| 情感计算工程师 | 取 EDA 与 HR → 做窗口特征 → 看与自评的相关方向 | 一个先验方向 | 把相关当因果,直接上线 |
第三类人最需要警惕的是最后一行。在这份数据里,皮肤电与投入自评的相关方向可以观察,但强度与稳定性都受限于二十九人。任何据此设计的产品逻辑,都需要另找一支更大的队列验证。
9.2 一条最短的可用流程
下面这条流程只走建筑侧:取一份教室 CSV,按课次聚合室内温度,再按制冷与制热状态分组,输出一个可以直接画进论文的最小表格。
#-- 最短流程:单教室的课次聚合与空调状态分组
import csv
import numpy as np
path = "longitudinal/19.csv"
rows = []
with open(path, encoding="utf-8-sig") as f:
for r in csv.DictReader(f):
if r["UsabilityMask"].strip().lower() != "true":
continue
rows.append({
"lesson": int(r["LessonNumber"]),
"temp": float(r["IndoorTemperature"]),
"cool": int(r["CoolingState"]),
"heat": int(r["HeatingState"]),
})
arr = {k: np.array([r[k] for r in rows]) for k in ("lesson", "temp", "cool", "heat")}
in_class = arr["lesson"] >= 0
print("可用行数", len(rows), "课内行数", int(in_class.sum()))
for name, mask in (("制冷", arr["cool"] == 1), ("制热", arr["heat"] == 1), ("两者皆关", (arr["cool"] + arr["heat"]) == 0)):
sel = in_class & mask
if sel.any():
print(name, "行数", int(sel.sum()), "室内温度均值", round(float(arr["temp"][sel].mean()), 2))
这段代码里的两个掩码缺一不可。UsabilityMask 去掉的是假期与缺失过多的整天,课内掩码去掉的是夜间与周末。两个都加上之后,剩下的才是「教室真的在上课时」的那部分行。§4.3 的案例里 P17 第四节课需要的环境背景,正是这张表里「课次等于 4」的那一桶。
9.3 引用方式
使用本库时,官方要求同时引用两件事:PhysioNet 的项目版本(作者列全、标注 1.0.0 版、DOI 10.13026/srm3-7z33),以及原始的数据描述论文(Gao 等,Scientific Data 第 9 卷,文章号 261,DOI 10.1038/s41597-022-01347-w)。若分析只用其中一支,应在方法段写明用的是 In-Gauge 还是 En-Gage,以及是否包含了按日期的原始副本。
方法段建议补三点:教室数按 16 还是 17 计;问卷与课时的对齐是否采用了官方的三条规则;腕带信号的质控是否做了、做了哪一版。第三点尤其重要,因为官方只提供了一个中值滤波的示例,没有给出统一质控版本,不同团队的结果不可直接比较。
9.4 一条走不通的路,以及绕开它要付的代价
回到 §4.3 的案例:想让「P17 在 R3 上第四节课」同时拿到室内气候与腕带信号,最短的路看起来是拿房间号去连。这条路的尽头是一条死巷——课次表的 R3 与环境文件的教室编号之间没有对照表,官方也没有给出教室清单,任何自动匹配的尝试都会得到空集。
绕开的方式有三种,代价各不相同。
| 绕法 | 做法 | 能拿到什么 | 代价 |
|---|---|---|---|
| 按课次粗对齐 | 用 LessonNumber 与问卷的三条规则,不分房间 | 课次级别的室内温度均值与腕带片段 | 房间维度的信息丢失 |
| 人工建表 | 向作者索取或按楼宇图纸重建房间对照 | 完整的房间级连接 | 依赖外部信息,复现性下降 |
| 只做单侧 | 放弃连接,分别做建筑侧与人侧的分析 | 两套独立结论 | 失去本库最独特的价值 |
第一种是多数团队会选的折中,它保住了「同一节课」这个时间锚,代价是房间不再是变量。第二种只在能取得原始对照的小圈子里可行,公开复现时几乎不可用。第三种是诚实的做法,但等于把这篇数据当两份数据用。三条路没有哪条绝对正确,值得注意的是第三条路常常被悄悄当作第一条路来叙述。
§10 AI 使用声明
| 项目 | 声明 |
|---|---|
| 文本生成 | 本文由 AI 辅助撰写,编辑负责结构与事实把关 |
| 数字来源 | 规模、结构、边界三类数字来自 PhysioNet 官方项目页、库内 README、官方数据描述论文 |
| 文件核验 | longitudinal 目录已列出,取得 16 份 CSV 的文件名;一份教室 CSV 与三张元数据表已读取并核对其列名与取值 |
| 论文信息 | 数据描述论文经公开页面读取,未获取全文 PDF |
| 未核验内容 | 17 与 16 差额的成因、课次表房间与教室编号的对照、按日期副本的逐会话完整性 |
| 图像 | 无配图;封面为生成式提示词,不含真实传感器或人物 |
| 免责 | 本文不构成临床建议;使用须遵守 ODC-By 1.0 的署名条款 |
常见误读(避坑清单)
| 说法 | 实际 | 证据 |
|---|---|---|
| 这是一份儿童生理信号医疗数据集 | 是建筑环境与教育场景的行为数据,参与者健康、无临床结局 | 官方摘要与伦理段 |
| In-Gauge 与 En-Gage 是两批数据,可以各自独立下载 | 同一次发布、同一校园、时间线部分重叠 | 官方方法段的明确表述 |
| 有 17 份教室文件 | 正文称 17 间教室,longitudinal 目录实际 16 份 | 目录列表与数据描述论文 |
| 腕带数据是连续四周的闭环记录 | 每天仅在校时段一段会话,放学后无信号 | README 对会话目录的说明 |
| 按日期与按课时是两套数据 | 同一批信号的两种切法 | README 与官方数据描述段 |
| 空调开关是设备直报 | 由出风口温差阈值推断,官方承认需人工目检 | 数据描述论文的方法段 |
| 问卷与信号逐条时间对齐 | 按三条区间规则切到课次级 | README 的对齐规则 |
| 许可是传染性的 ODbL | 是 ODC-By,仅要求署名 | LICENSE.txt 与官方访问区 |
| 室内外气象列每份文件各不相同 | 室外列在所有文件中完全重复 | README 对 longitudinal 的说明 |
| 教师与学生样本可以合并做日内节律分析 | 教师仅授课时佩戴,有效时段短 | 数据描述论文的佩戴说明 |
FAQ
Q1:两个名字是两个人名吗?
不是。In-Gauge 对应「把室内环境量出来」,En-Gage 对应「把课堂投入量出来」,是两支研究各自的代号,与参与者无关。
Q2:为什么教室数有两种说法?
官方正文与摘要写 17 间教室装了室内气象站,而 longitudinal 目录只有 16 份 CSV,数据描述论文也写 16 个文件。差额那一间官方未解释,引用时两个口径并列即可。
Q3:能不能把两支子集按人连起来?
不能。环境侧没有任何个体标识,只有房间与时间;可穿戴侧有参与者编号,但没有记录他坐哪间教室。官方只说两边的时间线部分重叠,没说人员能对上。
Q4:ESD 是 4 赫兹,够用吗?
够用于分钟级的情绪唤醒趋势,不够用于逐次汗腺脉冲的形态分析。4 赫兹的奈奎斯特上限是 2 赫兹,皮肤电的快速上升沿会被削平。要做脉冲级分析,需要更高采样率的数据源。
Q5:1415 小时是怎么算的?
是所有参与者所有会话的时长之和。它不等于「29 人乘以若干天」,因为每人佩戴天数不同,且每天只覆盖在校时段。做成人均指标前,必须先按参与者逐人汇总。
Q6:教师只有 6 人,能用吗?
可以用于描述,不能用于统计推断。6 个人的样本量下,任何组间比较的功效都很低。官方的做法是把教师侧作为学生侧的补充材料,而不是独立的分析对象。
Q7:能不能用它训练一个情绪识别模型?
可以做可行性试验,但不建议作为主训练集。标签是自评的图片选择,只有唤醒度与效价两级各四档,且样本仅二十余人。用它训练出的模型,换一所学校就会失效。
Q8:为什么问卷只有 488 份?
因为问卷在每天三个固定时点提交,且是自愿的。四周、二十几个参与者、每天三次,理论上限也只有千余份;加上缺勤与遗忘,最终落到四百多份。官方给出的回复率在三成上下。
Q9:室外气象数据在 16 份文件里重复,怎么处理?
只取一份。若按教室并行处理,要在读入后立即丢弃室外列,或者把它们单独抽成一张以时间为键的表。重复读取不会改变结果,但会让特征表膨胀十六倍。
Q10:能不能用它做隐私相关的推演?
不建议。数据已剥离日期,只留周次与星期;参与者按编号匿名。但教室、学校类型与年龄段都是可识别线索,做去匿名化推演既不合适也超出这份数据的用途。
术语表
| 术语 | 英文 | 含义 |
|---|---|---|
| 居住者行为 | occupant behaviour | 建筑使用者对设备、门窗、照明的操作行为 |
| 热舒适 | thermal comfort | 对热环境的满意程度,常用七级量表 |
| 热感觉 | thermal sensation | 从冷到热的七档主观判断,本库取值负三到正三 |
| 皮肤电活动 | electrodermal activity, EDA | 皮肤电导随汗腺活动的变化,单位微西门子 |
| 血容脉冲 | blood volume pulse, BVP | 光电容积脉搏波的原始波形 |
| 心搏间期 | inter-beat interval, IBI | 相邻两次心搏的间隔时间 |
| 三轴加速度 | 3-axis acceleration, ACC | 三方向加速度,本库量程正负两倍重力 |
| 占用标志 | occupancy | 该时段房间是否有人的二值标记 |
| 可用性掩码 | usability mask | 标记某日数据是否可靠可用的布尔列 |
| 课次编号 | lesson number | 校内节次的编码,负一表示课外 |
| 课内进度 | lesson progress | 当前课次已过的比例,零到一 |
| 课时副本 | class-wise copy | 按课次切分的腕带信号目录 |
| 会话 | session | 一次从佩戴到摘下的连续记录 |
| 学习投入 | learning engagement | 课堂中的行为、情绪与认知投入 |
| 唤醒度 | arousal | 情绪维度之一,从平静到兴奋 |
| 效价 | valence | 情绪维度之一,从负性到正性 |
| 图片情绪量表 | photographic affect meter | 用图片网格采集情绪的两维自评 |
| 李凯特量表 | Likert scale | 五级同意度量表,本库取负二到正二 |
| 就座坐标 | seating location | 教室平面缩略图上的像素坐标 |
| 分体空调 | split air-conditioner | 室内机加室外机的空调形式 |
| 二氧化碳浓度 | CO2 concentration | 室内空气新鲜度的常用代理指标 |
| 太阳辐射 | solar radiation | 单位面积的太阳辐照功率 |
| 露点 | dew point | 空气冷却至饱和的温度 |
| 署名许可 | ODC-By | 开放数据共享许可,仅要求署名 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 发布版本 | 1.0.0 | 官方项目页 | 官方页面 |
| 发布日期 | 2023-02-13 | 官方项目页 | 官方页面 |
| 教室数(正文口径) | 17 | 官方摘要与方法段 | 官方页面 |
| 教室文件数 | 16 | longitudinal 目录 | 官方页面 |
| 学生人数 | 23 | 官方摘要与 student.csv | 官方页面加文件 |
| 教师人数 | 6 | 官方摘要与 teacher.csv | 官方页面加文件 |
| 学生问卷份数 | 488 | student_survey.csv 行数 | 文件 |
| 教师问卷份数 | 22 | 官方数据描述与 teacher_survey | 官方页面 |
| 可穿戴总时长 | 1415.56 小时 | 官方方法段 | 官方页面 |
| 课时子目录数 | 221 | 官方数据描述 | 官方页面 |
| 按日子目录数 | 20 | README 与官方描述 | 官方页面 |
| 课次表行数 | 248 | class_table.csv 行数 | 文件 |
| 环境列数 | 23 | longitudinal CSV 表头 | 文件 |
| EDA 采样率 | 4 Hz | README | 官方页面 |
| BVP 采样率 | 64 Hz | README | 官方页面 |
| ACC 采样率 | 32 Hz | README | 官方页面 |
| 环境步长 | 5 分钟 | README | 官方页面 |
| 压缩包体量 | 5.1 GB | 官方文件区 | 官方页面 |
| 未压缩体量 | 12.8 GB | 官方文件区 | 官方页面 |
| 许可 | ODC-By 1.0 | LICENSE.txt 与访问区 | 官方页面 |
| DOI | 10.13026/srm3-7z33 | 官方引用区 | 官方页面 |
附录 B:数字的来源分层
| 层级 | 数字 | 说明 |
|---|---|---|
| 官方页面 | 17 间教室、23 名学生、6 名教师、488 份学生问卷、22 份教师问卷、1415.56 小时、221 个课时目录、20 个按日子目录、5.1 GB、12.8 GB、ODC-By 1.0 | 官方项目页正文、README、数据描述论文三处互相印证 |
| 文件核对 | 16 份教室 CSV、248 行课次表、23 行学生表、6 行教师表、23 列环境字段 | 本次访问目录与元数据表所得,属结构信息 |
| 未核实 | 17 与 16 的差额成因、R1 至 R7 与教室编号的对照、按日期副本的逐会话完整性 | 官方未说明,本文不填 |
附录 C:完整参考文献
- Gao N, Marschall M, Burry J, Watkins S, Salim F. In-Gauge and En-Gage: Understanding Occupants’ Behaviour, Engagement, Emotion, and Comfort Indoors with Heterogeneous Sensors and Wearables (version 1.0.0). PhysioNet. 2023. RRID:SCR_007345. DOI: 10.13026/srm3-7z33.
- Gao N, Marschall M, Burry J, et al. Understanding occupants’ behaviour, engagement, emotion, and comfort indoors with heterogeneous sensors and wearables. Scientific Data. 2022;9:261. DOI: 10.1038/s41597-022-01347-w.
- Gao N, Shao W, Rahaman MS, Salim FD. n-Gage: Predicting in-class Emotional, Behavioural and Cognitive Engagement in the Wild. Proceedings of the ACM on Interactive, Mobile, Wearable and Ubiquitous Technologies. 2020;4(3):1-26.
- Gao N, Rahaman MS, Shao W, Ji K, Salim FD. Individual and Group-wise Classroom Seating Experience: Effects on Student Engagement in Different Courses. arXiv:2112.12342. 2022.
- Gao N, Rahaman MS, Shao W, Salim FD. Investigating the Reliability of Self-report Data in the Wild: The Quest for Ground Truth. UbiComp/ISWC Adjunct. 2021:237-242.
- Haldi F, Robinson D. The Impact of Occupants’ Behaviour on Building Energy Demand. Journal of Building Performance Simulation. 2011;4(4):323-338.
附录 D:任务代码
下面这段把前面几节的步骤串成一条完整的管线:读一份教室 CSV、按课次聚合、读学生问卷、按官方三条规则切到课次、把两边在课次编号上做一次粗对齐,最后输出一张按课次的对照表。
#-- 环境与问卷在课次粒度上的粗对齐
import csv
import datetime as dt
import numpy as np
ROOT = "in-gauge-and-en-gage/1.0.0"
def env_by_lesson(path):
bucket = {}
with open(path, encoding="utf-8-sig") as f:
for r in csv.DictReader(f):
if r["UsabilityMask"].strip().lower() != "true":
continue
k = int(r["LessonNumber"])
bucket.setdefault(k, []).append(float(r["IndoorTemperature"]))
return {k: float(np.mean(v)) for k, v in bucket.items()}
def slot_of(tstr):
h, m, s = (int(x) for x in tstr.split(":"))
t = dt.time(h, m, s)
if t <= dt.time(11, 25):
return 2
if dt.time(12, 15) <= t <= dt.time(14, 15):
return 4
if t > dt.time(14, 15):
return 5
return None
def survey_by_slot(path):
bucket = {}
with open(path, encoding="utf-8-sig") as f:
for r in csv.DictReader(f):
k = slot_of(r["Time"])
if k is not None:
bucket.setdefault(k, []).append(r)
return bucket
env = env_by_lesson(f"{ROOT}/longitudinal/19.csv")
sur = survey_by_slot(f"{ROOT}/survey/student_survey.csv")
print(f"{'课次':<6}{'室内温度均值':<14}{'问卷份数':<10}")
for k in sorted(set(env) | set(sur)):
t = env.get(k)
n = len(sur.get(k, []))
tstr = "-" if t is None else f"{t:.2f}"
print(f"{k:<6}{tstr:<14}{n:<10}")
输出的每一行都应当被当作「同一节课」而不是「同一条记录」。环境侧的一行是一间教室的整节课平均,问卷侧的一行是若干份课后自评;两者的时间跨度不同、单位不同、样本单位不同。这张表能回答「这节课教室里平均多少度、有几个人填了问卷」,不能回答「这个人上课时教室多少度」。
附录 E:如果只记五件事
- 这是一次发布里的两支子研究:In-Gauge 是五个半月的教室环境纵向监测,En-Gage 是四周的二十九人腕带与问卷研究。
- 教室数有两个口径,正文写 17 间,目录只有 16 份文件,引用时并列。
- 两支子集的人员与教室无法逐一对应,唯一可靠的连接键是课次编号与课次表。
- 可穿戴侧有两种组织方式,按日期与按课时是同一批数据的两种切法,不要相加。
- 许可是 ODC-By 1.0,只要求署名;数据适合建筑能耗建模与关联分析,不适合做人群推断或产品训练。
编辑说明
本篇的核验时间是 2026 年 10 月 28 日。核验方式为:直接访问 PhysioNet 项目页取得正文与文件区;列出 longitudinal 目录并取得十六份 CSV 的文件名;读取其中一份教室 CSV 的前两行与行数;读取学生表、教师表、课次表、学生问卷表的表头与行数。未下载腕带压缩包,因此按日期副本的逐会话完整性、按课时副本的逐目录一致性均未核对。文中所有数字按「官方页面 / 文件核对 / 未核实」三层标注,未核实项不填数。两份口径并存之处(17 与 16、Day 上限 169 与 110、SchoolDay 同日两值)均按并列呈现,不作判对错的处理。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- bp-graphene-bioimpedance — 共享标签:生理信号 / 可穿戴传感 / 时序数据
- noneeg — 共享标签:生理信号 / 可穿戴传感 / 时序数据
- sleep-accel — 共享标签:生理信号 / 可穿戴传感 / 时序数据
- daphnet-fog — 共享标签:生理信号 / 可穿戴传感 / 时序数据
- big-ideas-glycemic-wearable — 共享标签:生理信号 / 可穿戴传感 / 时序数据
- tiles-2018-sleep — 共享标签:生理信号 / 可穿戴传感 / 调查数据
- mhealth — 共享标签:生理信号 / 可穿戴传感 / 时序数据
- uci-har — 共享标签:生理信号 / 可穿戴传感 / 时序数据
- wrist — 共享标签:生理信号 / 可穿戴传感 / 时序数据
- gait-in-aging — 共享标签:生理信号 / 可穿戴传感 / 时序数据
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

