第 3 层 · 通道清理层 · 第 11 步 / 共 25 步

步骤 11:坏导检测(第二次)

在滤波后数据上再次检测坏导

🕐 18 分钟🎯 难度:进阶🔗 核心 API:mne.preprocessing.find_bad_channels_*⬅️ 前置:步骤 10

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.