从0到1:如何用统计学“看透”不同睡眠PSG数据集的差异(域偏差分析实战)

你可能正在处理来自不同医院、不同设备或不同人群的睡眠多导睡眠图(PSG)数据集(比如 Sleep-EDF, SleepDG, HMC 等),并发现一个棘手的问题:在一个数据集上训练得很好的模型,换到另一个数据集上效果就一落千丈。

这个问题,我们称之为域偏差(Domain Bias)或域偏移(Domain Shift)

这篇博客的唯一目的,就是带你------一个"小白"------从最基础的统计学原理和公式出发,一步步学会如何量化评判这些数据集之间的差异。


路线图

我们将分步骤进行,就像爬楼梯一样:

  1. Step 1: 描述性统计 - <em>给你的数据集"量体温"</em>
  2. Step 2: 数据分布 - <em>看清数据集的"长相"</em>
  3. Step 3: 假设检验 - <em>判断"差异"是否真的存在</em>
  4. Step 4: 分布相似性度量 - <em>域偏差的"量化"</em>
  5. 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

结论:

  1. 年龄差异: 数据集B的患者平均年龄显著大于A。这是一个协变量偏移 (Covariate Shift)。这可能导致模型学到的"年龄相关的睡眠特征"在另一个数据集上失效。
  2. 信号幅度差异: 数据集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的特征分布对比

结论:

从上图(假设)中我们肉眼可见

  1. 均值不同: B的中心(15)远大于A的中心(10)。
  2. 方差不同: 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+nB1 xˉ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=max⁡x∣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应用 (核心):

这才是你分析域偏差的"杀手锏"!

  1. 提取特征: 对每个Epoch(例如30秒的PSG片段)提取特征(比如功率谱密度 Power Spectral Density, PSD)。
  2. 创建分布: 将所有Epoch的特征值做成直方图(PDF),这就是 PAP_APA (数据集A的特征分布) 和 PBP_BPB (数据集B的特征分布)。
  3. 计算 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-分布随机邻域嵌入): 非线性降维,非常擅长"聚类",能把相似的数据点"拉"到一起。

操作流程:

  1. 从数据集A和数据集B中抽取(比如各5000个)Epochs的特征。
  2. 将数据集A的特征标记为"蓝色"
  3. 将数据集B的特征标记为"红色"
  4. 将所有(10000个)高维特征数据扔进 t-SNE 算法,让它降到2D。
  5. 绘制散点图。

可能的分析结果:

  • 情况一:域偏差极大

    • 你看到的图像是:左边一大片"蓝色"点,右边一大片"红色"点。两坨分得清清楚楚。
    • 结论: 域偏差非常严重。模型能轻易"记住"它在哪个数据集上。
  • 情况二:域偏差很小

    • 你看到的图像是:"蓝色"和"红色"的点均匀地混合在一起,像一碗"红豆蓝莓粥"。
    • 结论: 两个数据集的特征空间非常相似,模型泛化性会很好。

总结:你的最终评判流程

从0开始评判睡眠PSG数据集的域偏差,你应该:

  1. 看基本盘 (描述性统计): 计算 μ,σ\mu, \sigmaμ,σ。检查患者元数据 (年龄、性别)和信号基本属性(幅度、噪声水平)。
  2. 看差异 (假设检验): 对你怀疑有差异的指标(如年龄)跑一个 t-test ,用 ppp 值确认差异是否显著
  3. 看全局 (分布度量): 对关键的EEG/EOG/EMG特征(如频带能量),计算 JS散度 (JSD) ,得到一个量化的偏差分数
  4. 看全貌 (可视化): 跑一个 t-SNE,用"颜色"区分数据集。如果能"一眼分开",就是最直观的域偏差证据。

通过这套组合拳,你就可以从一个"小白"变成一个能用数据和公式清晰说明"这两个PSG数据集差异到底有多大"的专业分析师了。

相关推荐
NAGNIP7 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
冬奇Lab9 小时前
一天一个开源项目(第36篇):EverMemOS - 跨 LLM 与平台的长时记忆 OS,让 Agent 会记忆更会推理
人工智能·开源·资讯
冬奇Lab9 小时前
OpenClaw 源码深度解析(一):Gateway——为什么需要一个"中枢"
人工智能·开源·源码阅读
AngelPP12 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年12 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼13 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS13 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区14 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈14 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang15 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx