步骤 22:自动拒绝
使用 autoreject 自动拒绝坏段
1. 目标
在 Epochs 层级上检测并丢弃被伪迹污染的整段数据。两种主流方法: 1. 阈值拒绝:基于振幅阈值的简单规则(手工设定) 2. autoreject:自动学习最佳阈值与通道投票的机器学习方法
2. 何时使用 / 何时跳过
- 应当使用:任何 ERP 研究
- 可跳过:纯功能连接、time-frequency 分析(更倾向用小波去噪或拒绝 channel)
3. 前置条件
- 已执行步骤 21:Epochs 已创建并
preload=True
4. 核心代码
方法 A:手动阈值拒绝
Python
import mne
# 阈值拒绝(创建时就设,或事后 drop)
reject_criteria = dict(
eeg=150e-6, # 150 µV(标准 ERP)
eog=250e-6, # 250 µV(眼电允许稍大)
# ecg=200e-6, # 可选
# emg=300e-6, # 可选
)
# 方式 1:创建时拒绝
epochs_clean = mne.Epochs(
raw, events, event_id=event_id,
tmin=-0.2, tmax=0.8, baseline=(-0.2, 0),
reject=reject_criteria,
preload=True,
)
# 方式 2:事后拒绝(保留原始 epochs 对象)
epochs.drop_bad(reject=reject_criteria)
print(f"拒绝后剩余: {len(epochs)} / {len(epochs.events)}")
方法 B:autoreject(推荐)
Python
# 安装:pip install autoreject
from autoreject import AutoReject, Ransac
# 方式 1:全局 AutoReject(推荐新手)
ar = AutoReject(
n_interpolate=[1, 2, 4, 8, 16], # 候选插值邻居数
consensus=[0.1, 0.25, 0.5, 0.75, 1.0], # 候选一致性比例
picks=['eeg'],
n_jobs=-1,
random_state=42,
)
ar.fit(epochs)
epochs_clean = ar.transform(epochs)
# 方式 2:RANSAC 通道插值
from autoreject import Ransac
ransac = Ransac(picks=['eeg'], random_state=42)
ransac.fit(epochs)
epochs_clean = ransac.transform(epochs)
5. 参数详解
手动阈值参数
| 通道类型 | 推荐阈值 | 依据 |
|---|---|---|
eeg |
100–200 µV | 视觉诱发的 N100/P200 通常 5–30 µV |
eog |
250–500 µV | 眨眼可超过 200 µV |
ecg |
200–500 µV | R 波可达 500 µV |
autoreject 参数
| 参数 | 含义 | 推荐值 |
|---|---|---|
n_interpolate |
候选插值数(邻居通道数) | [1, 2, 4, 8, 16] |
consensus |
候选一致性阈值 | [0.1, 0.25, 0.5, 0.75, 1.0] |
picks |
参与通道 | ['eeg'] |
n_jobs |
并行核数 | -1(全核) |
random_state |
随机种子 | 42 |
6. 手动 vs autoreject 对比
| 维度 | 手动阈值 | autoreject |
|---|---|---|
| 学习曲线 | 低 | 中 |
| 数据自适应 | ❌ 固定阈值 | ✅ 自动学习 |
| 通道插值 | ❌ 不插值 | ✅ 可自动插补 |
| 计算时间 | 快 | 慢(需拟合) |
| 跨研究一致性 | 高 | 中(数据依赖) |
| 推荐场景 | 标准化研究 | 探索性研究 |
7. 验证方法
Python
# 验证 1:拒绝比例
n_before = len(epochs)
n_after = len(epochs_clean)
rejection_rate = 1 - n_after / n_before
print(f"拒绝率: {rejection_rate*100:.1f}%")
# 期望:5–25%(过少 = 阈值过松,过多 = 阈值过严)
# 验证 2:可视化
epochs_clean.plot(n_epochs=10, n_channels=20)
# 期望:剩余 epoch 都相对干净
# 验证 3:保存模型(如 autoreject)
# 注意:autoreject 使用 HDF5 格式,文件名必须 .h5 / .hdf5(不是 .fif)
ar.save('autoreject_subject-01.h5', overwrite=True)
# 加载:from autoreject import read_auto_reject
# ar = read_auto_reject('autoreject_subject-01.h5')
8. 常见错误
| 错误 | 原因 | 解决方案 |
|---|---|---|
| 拒绝率 > 50% | 阈值过严 | 提高阈值或换 autoreject |
| 拒绝率 < 1% | 阈值过松 | 调低阈值 |
| autoreject 太慢 | 候选网格过大 | 减少 n_interpolate / consensus 数量 |
| autoreject 内存爆炸 | EEG 通道过多 | 减少 epoch 数或 n_jobs=1 |
| 视觉检查发现残余坏段 | 任何方法都不能 100% 干净 | 配合人工剔除:epochs.drop(indices=bad_idx) |
9. 官方来源
| 资源类型 | 链接 |
|---|---|
epochs.drop_bad |
https://mne.tools/stable/generated/mne.Epochs.html#mne.Epochs.drop_bad |
| autoreject 主页 | https://autoreject.github.io/ |
| autoreject API | https://autoreject.github.io/stable/api.html |
| autoreject 教程 | # autoreject 在 MNE 官方无独立教程页,详见 autoreject.github.io |
10. 学术引用
Jas, M., et al. (2017). Autoreject: Automated artifact rejection for MEG and EEG. Neuroimage, 159, 417-429.