第 5 层 · 分段拒绝层 · 第 22 步 / 共 25 步

步骤 22:自动拒绝

使用 autoreject 自动拒绝坏段

🕐 30 分钟🎯 难度:进阶🔗 核心 API:autoreject.AutoReject⬅️ 前置:步骤 21

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.