第 3 层 · 通道清理层 · 第 13 步 / 共 25 步

步骤 13:平均参考

设置平均参考

🕐 22 分钟🎯 难度:进阶🔗 核心 API:raw.set_eeg_reference⬅️ 前置:步骤 12

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. (平均参考理论)