步骤 23:落地清理
删除被标记的坏段
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 标准的清理操作。