步骤 13:平均参考
设置平均参考
1. 目标
为所有 EEG 通道建立一个公共参考点。最常用的是平均参考(所有 EEG 通道的均值作为参考),等价于"零参考"在数学上。
2. 何时使用 / 何时跳过
- 强烈建议使用:多通道(≥ 32 导)EEG 研究
- 可跳过:设备已提供物理参考(如 Cz 参考实验设计)
- REST 参考替代:理论上更优(无穷远参考,Yao 2001),但操作复杂
3. 前置条件
- 已执行步骤 08:带通已完成(必须先带通再参考!先参考再带通会破坏参考信号)
- 已执行步骤 12:坏导已插值
4. 核心代码
Python
import mne
# ====== 方式 A:标准平均参考(推荐) ======
raw.set_eeg_reference(ref_channels='average', projection=False)
# ====== 方式 B:投影式平均参考(推荐用于 source localization) ======
# 会创建 raw.info['projs'] 中的平均参考投影
# 后续 epochs.apply_proj() 才会真正施加
raw.set_eeg_reference(ref_channels='average', projection=True)
# ====== 方式 C:REST 参考(无穷远参考) ======
# REST = Reference Electrode Standardization Technique(Yao, 2001)
# 原理:通过球面样条把任意参考重建为"无穷远"零电位
# 不是 Laplacian!Laplacian 是另一种方法(CSD, compute_current_source_density)
#
# ⚠️ 必须先构造 forward:
# forward = mne.make_forward_solution(raw.info, trans=trans, src=src, bem=bem, eeg=True)
# 然后:
from mne.preprocessing import compute_current_source_density # 仅用于对比
forward = mne.make_forward_solution(raw.info, ...) # 需先构造 forward
raw.set_eeg_reference(ref_channels='REST', forward=forward)
# ====== 方式 D:自定义参考通道 ======
raw.set_eeg_reference(ref_channels=['Cz'], projection=False)
# 注意:Cz 作为参考会使该通道数据变为 0
# ====== 方式 E:双耳参考(A1+A2 平均) ======
raw.set_eeg_reference(ref_channels=['A1', 'A2'], projection=False)
5. 参数详解
| 参数 | 含义 | 推荐值 |
|---|---|---|
ref_channels |
参考通道 | 'average'(默认推荐)/ 通道名列表 |
projection |
是否创建投影 | False(直接施加)/ True(延迟施加) |
ch_type |
应用类型 | 'eeg'(默认) |
forward |
前向 operator 信息(仅 projection=True) | 略 |
投影式 vs 直接式
| 维度 | projection=False |
projection=True |
|---|---|---|
| 时机 | 立即修改数据 | 仅记录,待 apply_proj() |
| 适用 | ERP/时域分析 | 源定位 + 多次尝试不同参考 |
| 代价 | 修改不可逆 | 需手动施加 |
顺序问题澄清
⚠️ "必须先带通再参考"不是绝对规则。
线性滤波与平均参考在数学上可交换:filter(reference(raw))≡reference(filter(raw))。 真正的问题只出现在projection=True时: - 先带通后投影:投影保留在raw.info['projs'],后续可施加 - 先投影后带通:低频投影分量会被带通滤掉,投影失效 - 直接式projection=False时,顺序对结果没有数学影响因此本教材仍推荐"先带通后参考"作为默认顺序,原因纯粹是概念清晰:参考过的数据已不是设备原始记录。
6. 验证方法
Python
# 验证 1:所有 EEG 通道均值接近 0(仅在 projection=False 时)
data = raw.get_data(picks='eeg')
mean_per_timepoint = data.mean(axis=0)
print(f"每时刻 EEG 均值范围: [{mean_per_timepoint.min()*1e6:.2f}, {mean_per_timepoint.max()*1e6:.2f}] µV")
# 期望:均值振幅 < 1 µV
# 验证 2:可视化
raw.plot(duration=5, n_channels=30)
# 期望:所有 EEG 通道振幅均值集中在 0
# 验证 3:投影式参考的检查
if 'projs' in raw.info:
for proj in raw.info['projs']:
print(proj)
# 应有 'Average EEG reference' 投影
# 验证 4:PSD 检查(不应因参考改变)
psd = raw.compute_psd(picks='eeg')
psd.plot()
7. 常见错误
| 错误 | 原因 | 解决方案 |
|---|---|---|
| ERP 振幅明显小于预期 | 带通前平均参考 → 参考信号被滤掉 | 严格执行"先带通后参考" |
ValueError: ... must have at least 2 EEG channels |
数据中 EEG 通道 < 2 | 检查步骤 03 / 04 |
| 投影式参考后 epochs 数据未变化 | 忘记调用 epochs.apply_proj() |
在 epochs 创建后施加 |
| 用了 1 导参考,剩余数据"形变" | 参考点选取不当 | 改用平均参考 |
| EOG 通道被错误纳入平均 | EOG 未正确标为 'eog' | 回到步骤 03 重新标注 |
TypeError: set_eeg_reference() got multiple values for argument 'ref_channels' |
'REST' 被同时传给了位置参数和 ref_channels= 关键字 |
用 raw.set_eeg_reference(ref_channels='REST', forward=fwd) |
TypeError: forward when ref_channels="REST" must be an instance of Forward, got None |
未传 forward |
先 make_forward_solution() 构造再传入 |
8. 官方来源
| 资源类型 | 链接 |
|---|---|
set_eeg_reference |
https://mne.tools/stable/generated/mne.io.Raw.html#mne.io.Raw.set_eeg_reference |
| 参考教程 | https://mne.tools/stable/auto_tutorials/preprocessing/55_setting_eeg_reference.html |
| 平均参考理论 | https://mne.tools/stable/auto_tutorials/preprocessing/plot_55_setting_eeg_reference.html |
9. 学术引用
Yao, D. (2001). A method to standardize a reference of scalp EEG recordings to a point at infinity. Physiological Measurement, 22(4), 693-711. (REST 原始文献)
Nunez, P. L., & Srinivasan, R. (2006). Electric Fields of the Brain: The Neurophysics of EEG (2nd ed.), Chapter 6. Oxford University Press. (平均参考理论)