从0到1:如何用统计学“看透”不同睡眠PSG数据集的差异(域偏差分析实战)
你可能正在处理来自不同医院、不同设备或不同人群的睡眠多导睡眠图(PSG)数据集(比如 Sleep-EDF, SleepDG, HMC 等),并发现一个棘手的问题:在一个数据集上训练得很好的模型,换到另一个数据集上效果就一落千丈。
这个问题,我们称之为域偏差(Domain Bias)或域偏移(Domain Shift)。
这篇博客的唯一目的,就是带你——一个“小白”——从最基础的统计学原理和公式出发,一步步学会如何量化和评判这些数据集之间的差异。
路线图
我们将分步骤进行,就像爬楼梯一样:
- Step 1: 描述性统计 - <em>给你的数据集“量体温”</em>
- Step 2: 数据分布 - <em>看清数据集的“长相”</em>
- Step 3: 假设检验 - <em>判断“差异”是否真的存在</em>
- Step 4: 分布相似性度量 - <em>域偏差的“量化”</em>
- Step 5: 综合分析 - <em>如何向他人展示你的发现</em>
Step 1: 描述性统计 (Descriptive Statistics)
这是最基础的第一步。我们要为每个数据集计算一些“身份信息”。
- 类比: 想象你有两组人(两个数据集),你需要先知道他们的平均身高、体重范围等基本信息。
1.1 中心趋势 (Central Tendency)
它告诉我们数据的“中心”在哪里。
a) 均值 (Mean)
就是我们常说的“平均数”。它对“异常值”(比如一个特别大的伪影)非常敏感。
公式:
对于一个特征(比如C4-A1通道的EEG信号幅度),其均值为 μ\muμ:
μ=1N∑i=1Nxi\mu = \frac{1}{N} \sum_{i=1}^{N} x_iμ=N1i=1∑Nxi
其中,NNN 是样本总数(比如总Epochs数),xix_ixi 是第 iii 个样本的值。
b) 中位数 (Median)
将所有数据从高到低排序,排在最中间的那个数。它对异常值不敏感,更“稳健”。
公式:
Median=Value at the (N+12)-th position\text{Median} = \text{Value at the } \left( \frac{N+1}{2} \right)\text{-th position}Median=Value at the (2N+1)-th position
1.2 离散程度 (Dispersion)
它告诉我们数据有多“分散”或多“集中”。
a) 方差 (Variance)
衡量每个数据点离均值有多远。方差越大,数据越分散。
公式:
σ2=1N∑i=1N(xi−μ)2\sigma^2 = \frac{1}{N} \sum_{i=1}^{N} (x_i - \mu)^2σ2=N1i=1∑N(xi−μ)2
b) 标准差 (Standard Deviation)
方差的平方根。它的好处是单位和原始数据相同(比如 μV\mu VμV),因此更容易解释。
公式:
σ=σ2=1N∑i=1N(xi−μ)2\sigma = \sqrt{\sigma^2} = \sqrt{\frac{1}{N} \sum_{i=1}^{N} (x_i - \mu)^2}σ=σ2=N1i=1∑N(xi−μ)2
PSG应用与域偏差初探:
假设你计算了两个PSG数据集(数据集A 和 数据集B)的统计数据:
特征 | 指标 | 数据集 A (医院A) | 数据集 B (医院B) |
---|---|---|---|
患者年龄 | 均值 (μ\muμ) | 45.2 岁 | 58.7 岁 |
EEG (C4-A1) 幅度 | 标准差 (σ\sigmaσ) | 15.3 μV\mu VμV | 28.1 μV\mu VμV |
结论:
- 年龄差异: 数据集B的患者平均年龄显著大于A。这是一个协变量偏移 (Covariate Shift)。这可能导致模型学到的“年龄相关的睡眠特征”在另一个数据集上失效。
- 信号幅度差异: 数据集B的EEG信号标准差远大于A。这可能意味着B的设备灵敏度不同,或者伪影(Artifacts)更多。这是数据本身的偏移。
Step 2: 数据分布 (Data Distribution)
均值和方差只是“总结”。我们更想知道数据整体的“长相”。
- 类比: 知道两组人的平均身高还不够,我想知道他们中“高个子”和“矮个子”各占多少比例。
这就是概率密度函数 (Probability Density Function, PDF) 或 直方图 (Histogram) 要做的事。
公式 (概念):
我们经常假设数据(尤其是生物信号)服从正态分布(高斯分布)。
f(x)=1σ2πe−12(x−μσ)2f(x) = \frac{1}{\sigma\sqrt{2\pi}} e^{-\frac{1}{2}(\frac{x-\mu}{\sigma})^2}f(x)=σ2π1e−21(σx−μ)2
这个公式的重点是:一个分布可以由它的 μ\muμ 和 σ\sigmaσ 完整定义。
PSG应用与可视化:
我们可以画出两个数据集某个特征(比如某个频带的能量)的分布图。
假设的可视化图:
[一个显示两个不同分布的假设图表]|数据集 A | .(μ=10, σ=2) | . .| . .| . .概率密度 | . . 数据集 B| . . (μ=15, σ=4)| . .| . .|. .|________________._________________特征值 (例如: Delta波能量)图1:假设数据集A与数据集B的特征分布对比
结论:
从上图(假设)中我们肉眼可见:
- 均值不同: B的中心(15)远大于A的中心(10)。
- 方差不同: B的分布更“胖”(σ=4\sigma=4σ=4),说明其特征值更分散。
这就是最直观的域偏差!
Step 3: 假设检验 (Hypothesis Testing)
我们在Step 1和Step 2中“看到”了差异。但这个差异是**“显著的”(真的有不同),还是“偶然的”**(可能只是抽样巧合)?
- 类比: 你在A组抽了10个人,B组抽了10个人,发现A组平均身高175cm,B组176cm。这个1cm的差异是“真的”吗?还是你下次再抽10个人,可能A组就177cm了?
假设检验就是来回答这个问题的。
3.1 零假设 (H0H_0H0) vs 备择假设 (HAH_AHA)
- 零假设 (H0H_0H0): “没有差异”。(例如:μA=μB\mu_A = \mu_BμA=μB)
- 备择假设 (HAH_AHA): “存在差异”。(例如:μA≠μB\mu_A \neq \mu_BμA=μB)
我们的目标是**“拒绝”H0H_0H0**。
3.2 t-检验 (t-test)
最常用的检验之一,用于比较两个组的均值是否有显著差异。
公式 (独立双样本t-test):
它会计算一个 ttt 值,这个值越大,说明差异越“明显”。
t=xˉA−xˉBsp1nA+1nBt = \frac{\bar{x}_A - \bar{x}_B}{s_p \sqrt{\frac{1}{n_A} + \frac{1}{n_B}}}t=spnA1+nB1xˉA−xˉB
其中,xˉA,xˉB\bar{x}_A, \bar{x}_BxˉA,xˉB 是A和B的样本均值;nA,nBn_A, n_BnA,nB 是样本量;sps_psp 是合并标准差(有点复杂,这里先理解概念)。
3.3 p-值 (p-value)
t-test 会给我们一个 ppp 值。
- p值的“小白”解释: 如果零假设(H0H_0H0)是真的(即A和B没有差异),我们能观测到当前这种(甚至更极端)差异的概率。
- 判断标准: 通常,我们设置一个显著性水平 α\alphaα(比如 α=0.05\alpha = 0.05α=0.05)。
- 如果 p<αp < \alphap<α (例如 p=0.001p = 0.001p=0.001):说明“如果A和B没差异,我们基本不可能看到现在的数据”。因此,我们拒绝H0H_0H0,认为**“差异是显著的”**。
- 如果 p>αp > \alphap>α (例如 p=0.3p = 0.3p=0.3):说明“这个差异很可能是偶然”。我们无法拒绝H0H_0H0。
PSG应用:
你对Step 1中的“患者年龄”进行t-test:
- H0H_0H0:数据集A和B的患者平均年龄相同。
- HAH_AHA:数据集A和B的患者平均年龄不同。
- 你运行检验,得到 p=0.0001p = 0.0001p=0.0001。
- 结论: p<0.05p < 0.05p<0.05,我们拒绝H0H_0H0。数据集A和B的患者年龄存在统计学上的显著差异。这是一个必须在模型训练中考虑的严重域偏差。
Step 4: 分布相似性度量 (深入域偏差)
t-test 只比较“均值”。但有时两个分布均值相同,但“形状”完全不同(比如一个高瘦,一个矮胖)。我们需要更高级的工具来比较整个分布。
4.1 K-S 检验 (Kolmogorov-Smirnov Test)
K-S 检验用于比较两个分布的累积分布函数 (CDF)。
- 类比: 它不是比较“平均身高”,而是比较“身高在170cm以下的人的比例”、“180cm以下的人的比例”…等等所有点。
- 公式 (概念): 它计算两个CDF之间的最大垂直距离 DDD。
D=maxx∣FA(x)−FB(x)∣D = \max_{x} |F_A(x) - F_B(x)|D=xmax∣FA(x)−FB(x)∣ - K-S 检验也会给出一个 ppp 值。如果 p<0.05p < 0.05p<0.05,说明两个分布形状显著不同。
4.2 JS 散度 (Jensen-Shannon Divergence)
这是信息论中一个非常强大的工具,用于衡量两个概率分布的“相似性”。
- 小白解释: 它衡量“用一个分布去描述另一个分布”有多“困难”。
- 基础 - KL 散度 (Kullback-Leibler Divergence):
DKL(P∣∣Q)=∑xP(x)log(P(x)Q(x))D_{KL}(P || Q) = \sum_{x} P(x) \log\left(\frac{P(x)}{Q(x)}\right)DKL(P∣∣Q)=x∑P(x)log(Q(x)P(x))
它衡量用 QQQ 替 PPP 时的“信息损失”。注意:DKL(P∣∣Q)≠DKL(Q∣∣P)D_{KL}(P || Q) \neq D_{KL}(Q || P)DKL(P∣∣Q)=DKL(Q∣∣P) (不对称)。 - JS 散度 (JSD): 它是KL散度的“升级版”,具有对称性。
JSD(P∣∣Q)=12DKL(P∣∣M)+12DKL(Q∣∣M)JSD(P || Q) = \frac{1}{2} D_{KL}(P || M) + \frac{1}{2} D_{KL}(Q || M)JSD(P∣∣Q)=21DKL(P∣∣M)+21DKL(Q∣∣M)
其中,M=12(P+Q)M = \frac{1}{2}(P + Q)M=21(P+Q) 是两个分布的平均分布。
JS 散度的值域是 [0, 1](如果用log2)或 [0, ln(2)](如果用ln):
- JSD=0JSD = 0JSD=0:两个分布完全相同。
- JSDJSDJSD 越大:两个分布差异越大。
PSG应用 (核心):
这才是你分析域偏差的“杀手锏”!
- 提取特征: 对每个Epoch(例如30秒的PSG片段)提取特征(比如功率谱密度 Power Spectral Density, PSD)。
- 创建分布: 将所有Epoch的特征值做成直方图(PDF),这就是 PAP_APA (数据集A的特征分布) 和 PBP_BPB (数据集B的特征分布)。
- 计算 JSD:
DomainBiasScore=JSD(PA∣∣PB)\text{DomainBiasScore} = JSD(P_A || P_B)DomainBiasScore=JSD(PA∣∣PB)
结论:
你得到了一个单一的数值(比如 0.42),它量化了两个数据集在“这个特征上”的域偏差有多大。你可以为所有重要特征(不同通道、不同频带)都计算这个分数。
Step 5: 综合分析 (可视化你的发现)
最后,你不能只给老板看一堆 ppp 值和 JSD 分数。你需要一个直观的全局视图。
技术:降维与可视化 (t-SNE / PCA)
PSG特征(比如所有通道的PSD)可能有几百甚至上千维。我们无法直接画图。我们需要用降维技术把它们“压”到2D或3D。
- PCA (主成分分析): 线性降维,寻找数据“方差最大”的方向。
- t-SNE (t-分布随机邻域嵌入): 非线性降维,非常擅长“聚类”,能把相似的数据点“拉”到一起。
操作流程:
- 从数据集A和数据集B中抽取(比如各5000个)Epochs的特征。
- 将数据集A的特征标记为“蓝色”。
- 将数据集B的特征标记为“红色”。
- 将所有(10000个)高维特征数据扔进 t-SNE 算法,让它降到2D。
- 绘制散点图。
可能的分析结果:
-
情况一:域偏差极大
- 你看到的图像是:左边一大片“蓝色”点,右边一大片“红色”点。两坨分得清清楚楚。
- 结论: 域偏差非常严重。模型能轻易“记住”它在哪个数据集上。
-
情况二:域偏差很小
- 你看到的图像是:“蓝色”和“红色”的点均匀地混合在一起,像一碗“红豆蓝莓粥”。
- 结论: 两个数据集的特征空间非常相似,模型泛化性会很好。
总结:你的最终评判流程
从0开始评判睡眠PSG数据集的域偏差,你应该:
- 看基本盘 (描述性统计): 计算 μ,σ\mu, \sigmaμ,σ。检查患者元数据(年龄、性别)和信号基本属性(幅度、噪声水平)。
- 看差异 (假设检验): 对你怀疑有差异的指标(如年龄)跑一个 t-test,用 ppp 值确认差异是否显著。
- 看全局 (分布度量): 对关键的EEG/EOG/EMG特征(如频带能量),计算 JS散度 (JSD),得到一个量化的偏差分数。
- 看全貌 (可视化): 跑一个 t-SNE,用“颜色”区分数据集。如果能“一眼分开”,就是最直观的域偏差证据。
通过这套组合拳,你就可以从一个“小白”变成一个能用数据和公式清晰说明“这两个PSG数据集差异到底有多大”的专业分析师了。