步骤 14:SSP 投影(眼电)
计算 EOG 投影向量
1. 目标
基于 EOG 通道构建 Signal-Space Projection(信号空间投影)——一种正交分解算法,可识别并去除眼电伪迹在 EEG 通道中的"投影分量"。是 ICA 之外的补充伪迹处理手段。
2. 何时使用 / 何时跳过
- 应当使用:mne-bids-pipeline 默认流程;双眼电(HEOG+VEOG)存在时
- 可跳过:仅用 ICA 已能充分去除眼电;不希望损失任何空间自由度
3. 前置条件
- 已执行步骤 13:平均参考已完成
- 数据中存在至少 1 个
eog类型通道
4. 核心代码
Python
import mne
# ====== 方式 A:自动构建眼电 SSP(推荐新手) ======
# MNE 会自动搜索 'eog' 类型通道并构建投影
# 注意:compute_proj_eog 实际返回 (projs, eog_events) 二元组
projs_eog, eog_events = mne.preprocessing.compute_proj_eog(
raw,
n_eeg=2, # 计算几个 EEG 投影(默认 2)
ch_name=None, # None = 自动从 eog 类型通道选择
average=True, # 把双眼电平均(默认 True)
reject=None, # 自动拒绝阈值
)
print(f"构建的 EOG 投影: {projs_eog}")
print(f"检测到的眨眼事件: {len(eog_events)}")
# 加入到 raw.info['projs']
raw.add_proj(projs_eog)
# ====== 方式 B:显式指定双眼电通道 ======
projs_eog = mne.preprocessing.compute_proj_eog(
raw,
n_eeg=2,
ch_name=['HEOG', 'VEOG'],
average=True,
)
raw.add_proj(projs_eog)
# ====== 验证 ======
print(raw.info['projs'])
for p in raw.info['projs']:
print(p)
5. 参数详解
| 参数 | 含义 | 推荐值 |
|---|---|---|
n_eeg |
EEG 投影维度 | 2(默认;MNE 推荐)/ 1(更保守) |
ch_name |
EOG 通道 | None(自动选 eog 类型)/ 'HEOG' / ['HEOG', 'VEOG'] |
average |
是否把多个 EOG 平均 | True(默认推荐)/ False |
reject |
自动拒绝阈值 | None(用默认值 dict(eeg=5e-5)) |
l_freq / h_freq |
滤波范围 | 默认 1.0–35.0 Hz |
6. SSP 投影与 ICA 的关系
| 维度 | SSP | ICA |
|---|---|---|
| 原理 | 信号空间投影 | 盲源分离 |
| 适用 | 单一类型伪迹(眼电/心电) | 多种类型混合 |
| 数据长度要求 | 低(≥ 1 分钟) | 高(≥ 1 分钟 × 通道数) |
| 损失空间自由度 | 少(1–2 个维度) | 多(N 个成分) |
| 解释性 | 高(与 EOG 强相关) | 中(需人工核对) |
| 可与 ICA 共存 | ✅ | ✅ |
📌 最佳实践:先用 SSP 去除眼电/心电(保留空间自由度),再用 ICA 去除其他伪迹。
7. 验证方法
Python
# 验证 1:投影已添加到 raw
print(f"投影数: {len(raw.info['projs'])}")
assert any('eog' in p['desc'].lower() for p in raw.info['projs']), "未添加 EOG 投影"
# 验证 2:可视化投影模式(topomap)
mne.viz.plot_projs_topomap(raw.info['projs'], raw.info)
# 验证 3:施加 vs 未施加的对比
raw_proj = raw.copy().apply_proj() # 施加投影
# 对比 raw vs raw_proj 的眼电相关时刻差异
# 验证 4:解释方差
# raw.plot_projs_topomap() 不直接显示方差,需结合 ICA 的 plot_properties
8. 常见错误
| 错误 | 原因 | 解决方案 |
|---|---|---|
RuntimeError: No EOG channels found |
未执行步骤 03 标通道类型 | 立即回到步骤 03 |
| EOG 投影不收敛 | EOG 通道数据本身异常 | 检查 EOG 通道是否也是坏导 |
| 与 ICA 互相干扰 | ICA 拟合时已含 SSP 投影 | ICA 应在 SSP 未施加但已记录的状态下拟合(见步骤 16) |
| 损失自由度太多 | n_eeg=4 过多 |
保持 n_eeg=2(默认即足够) |
ValueError: too many values to unpack |
compute_proj_eog 实际返回 (projs, eog_events) 元组 |
改为 projs, eog_events = compute_proj_eog(...) |
9. 官方来源
| 资源类型 | 链接 |
|---|---|
compute_proj_eog |
https://mne.tools/stable/generated/mne.preprocessing.compute_proj_eog.html |
| SSP 教程 | https://mne.tools/stable/auto_tutorials/preprocessing/plot_50_artifact_correction_ssp.html |
| 投影管理 | https://mne.tools/stable/generated/mne.io.Raw.html#mne.io.Raw.add_proj |
10. 学术引用
Uusitalo, M. A., & Ilmoniemi, R. J. (1995). Signal-space projection method for separating MEG or EEG into components. Medical & Biological Engineering & Computing, 33(3), 402-404.