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

步骤 23:落地清理

删除被标记的坏段

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

1. 目标

在所有拒绝方法完成后,最终落地删除被标记为坏的 epoch。drop_bad 是 mne.Epochs 中将标记转化为实际数据删除的标准步骤。

2. 何时使用 / 何时跳过

  • 必须使用:当用 epochs.drop()、reject 标记、或者 epochs['bad'] 索引后
  • 可跳过:在 mne.Epochs 创建时已设 reject=... 且所有坏 epoch 已直接被剔除

3. 前置条件

  • 已执行步骤 22:拒绝逻辑已完成
  • preload=True

4. 核心代码

Python
import mne

# ====== 方式 A:手动索引剔除 ======
# 只能用整数索引,不能用字符串名称
epochs.drop([0, 1, 2], reason='manual_inspection')   # 按 index

# ====== 方式 B:基于 drop_bad 的阈值触发剔除 ======
# 注意:drop_bad 是"触发器",具体规则由 reject 参数或预标记决定
epochs.drop_bad(
    reject=dict(eeg=150e-6),  # 用此触发剔除
    flat=dict(eeg=1e-6),      # 平坦阈值
)
print(f"剩余: {len(epochs)} 个 epoch")

# ====== 方式 C:仅清理 bad 索引标签,不改数据 ======
# epochs.drop_bad()  # 默认 reject='existing',会应用创建时的 reject 准则

# ====== 验证:拒绝统计 ======
print(f"已标记为 bad 的 epoch 数: {(epochs.drop_log != ('',)) .sum()}")
print(f"实际剩余 epoch 数: {len(epochs)}")

5. 参数详解

参数 含义 推荐值
reject 振幅拒绝阈值 同步骤 22
flat 平坦拒绝阈值 dict(eeg=1e-6)
verbose 日志 'INFO'

drop_log 的结构

每个 epoch 的 drop 原因都记录在 epochs.drop_log[i] 中:

Python
print(epochs.drop_log[0])  # 可能输出: ('manual_inspection',)
print(epochs.drop_log[1])  # 可能输出: ()  # 表示该 epoch 通过

6. 与 reject 的关系

步骤 行为
mne.Epochs(reject=...) 创建时直接剔除坏 epoch
epochs.drop_bad(reject=...) 触发剔除(在已创建的对象上)
epochs.drop(indices=bad_idx) 手动剔除指定索引

📌 最佳实践:用 mne.Epochs(reject=None) 创建 + epochs.drop_bad(reject=...) 触发,便于二次调整阈值。

7. 验证方法

Python
# 验证 1:剩余 epoch 数
print(f"剩余: {len(epochs)}")

# 验证 2:drop_log 分析
from collections import Counter
all_reasons = [reason for log in epochs.drop_log for reason in log]
reasons_counter = Counter(all_reasons)
print(f"拒绝原因分布: {reasons_counter}")

# 验证 3:可视化剩余 epoch
epochs.plot(n_epochs=10, n_channels=20)

# 验证 4:各条件的剩余数
for condition in epochs.event_id:
    n = len(epochs[condition])
    print(f"{condition}: {n} 个 epoch")

8. 常见错误

错误 原因 解决方案
drop_bad 没剔除任何 epoch reject 阈值过松 提高灵敏度或降低阈值
拒绝原因不明确 没传 reason 参数 用 epochs.drop(idx, reason='xxx')
Epoch 数突然降至 0 flat 阈值过严 调小 flat 或删除该参数
drop_log 显示 'MEG' 而非 'EEG' EEG 数据被识别为 MEG 检查步骤 03 通道类型
TypeError: ... indices must be integers 用了字符串名索引 改用整数索引:epochs.drop([0, 1])

9. 官方来源

资源类型 链接
epochs.drop https://mne.tools/stable/generated/mne.Epochs.html#mne.Epochs.drop
epochs.drop_bad https://mne.tools/stable/generated/mne.Epochs.html#mne.Epochs.drop_bad
epochs.drop_log https://mne.tools/stable/generated/mne.Epochs.html#mne.Epochs.drop_log

10. 学术引用

无需单独引用。本步骤是 MNE 标准的清理操作。