步骤 11:坏导检测(第二次)
在滤波后数据上再次检测坏导
1. 目标
在滤波后的干净数据上做第二次坏导检测。滤波消除了漂移与高频噪声,使统计检测更稳定,并能捕获"滤波后才显现的异常通道"。
2. 何时使用 / 何时跳过
- 强烈建议使用:mne-bids-pipeline 的标准做法
- 可跳过:与步骤 07 产生完全一致的结果(说明数据本身很干净,可合并为单次)
3. 前置条件
- 已执行步骤 10:已降采样、滤波已稳定
4. 核心代码
Python
import mne
import numpy as np
# ====== 与步骤 07 复用 LOF 函数 ======
# find_bad_channels_lof 在 MNE 1.7+ 可用
from mne.preprocessing import find_bad_channels_lof
# 1) LOF 检测
bad_lof = find_bad_channels_lof(
raw,
n_neighbors=20,
threshold=1.5,
picks=['eeg'],
)
# 2) RANSAC 检测 — 注意:find_bad_channels_ransac 不在 MNE 核心 API
# 推荐替代:autoreject.Ransac 或 pyprep.NoisyChannels.find_bad_by_ransac
# ====== 基于滤波后 PSD 的精细检测 ======
psd = raw.compute_psd(picks='eeg', fmax=80)
log_power = 10 * np.log10(psd.get_data(power=True))
# 以全局中位数为基准
median_power = np.median(log_power.mean(axis=1))
mad = np.median(np.abs(log_power.mean(axis=1) - median_power))
# 滤波后更稳定的检测(sigma 调小)
threshold_high = median_power + 3 * mad
threshold_low = median_power - 3 * mad
log_pow_mean = log_power.mean(axis=1)
flat = [raw.ch_names[i] for i, p in enumerate(log_pow_mean) if p < threshold_low]
noisy = [raw.ch_names[i] for i, p in enumerate(log_pow_mean) if p > threshold_high]
print(f"PSD 平导: {flat}, 噪导: {noisy}")
# ====== 合并到 raw.info['bads'] ======
raw.info['bads'] = list(set(raw.info['bads']) | set(bad_lof) | set(flat) | set(noisy))
print(f"累计坏导: {raw.info['bads']}")
5. 与步骤 07 的关键差异
| 维度 | 步骤 07(原始) | 步骤 11(滤波后) |
|---|---|---|
| 数据状态 | 含 DC 漂移与高频肌电 | 已带通 + 陷波 |
| 检测目标 | 明显物理异常 | 统计异常 |
| 算法 | LOF + PSD | LOF + PSD(RANSAC 在 MNE 核心不可用) |
| 阈值 | 较保守 | 较激进(信噪比高) |
| 期望检出数 | 较少(仅明显异常) | 更多(含亚临床异常) |
6. 验证方法
Python
# 验证 1:坏导总数
n_bad = len(raw.info['bads'])
n_eeg = sum(1 for ch in raw.info['chs'] if ch['kind'] == 2)
print(f"坏导率: {n_bad}/{n_eeg} = {n_bad/n_eeg*100:.1f}%")
assert n_bad / n_eeg <= 0.20, "坏导过多,请人工复核"
# 验证 2:可视化(坏导标红)
raw.plot(duration=5, n_channels=30)
# 人工核对:坏导确实呈现明显异常
# 验证 3:分布合理性
print(raw.info['bads'])
# 期望:无聚集性(不在同一区域大量出现)
7. 常见错误
| 错误 | 原因 | 解决方案 |
|---|---|---|
| 检测到太多坏导 | 阈值过激 | 调高 threshold(如 2.0)或调大 mad sigma |
| 与步骤 07 完全不重叠 | 数据本身有问题 | 人工逐个复核——两次都是异常才是真坏导 |
| 误把边缘通道当坏导 | 边缘电极噪声本就大 | 评估研究需求,必要时保留 |
| 没有新增坏导 | 数据很干净(好现象) | 跳过本步骤直接到 12 也可 |
8. 官方来源
| 资源类型 | 链接 |
|---|---|
| 同步骤 07 | 见步骤 07 官方链接 |
| mne-bids-pipeline 配置 | https://mne.tools/mne-bids-pipeline/ |
| autoreject 替代 RANSAC | https://autoreject.github.io/ |
| pyprep PREP pipeline | https://github.com/sappelhoff/pyprep |
⚠️ 本教材原稿引用的 DOI
10.1007/978-3-030-14172-6_5("两阶段检测论文")经核实查无对应文献,已删除。
9. 学术引用
Jas, M., et al. (2017). Autoreject: Automated artifact rejection for MEG and EEG. Neuroimage, 159, 417-429.