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

步骤 12:坏导插值

对坏导进行插值修复

🕐 20 分钟🎯 难度:进阶🔗 核心 API:raw.interpolate_bads⬅️ 前置:步骤 11

1. 目标

基于周边通道的空间信息,用球面样条插值把坏导重建为"假想但合理"的信号。插值后坏导不再污染平均参考、ICA 等下游操作。

2. 何时使用 / 何时跳过

  • 应当使用:当 raw.info['bads'] 非空,且坏导数 < 总数的 10%(>10% 插值不可靠)
  • 必须使用:使用平均参考时(坏导不插值,平均参考会被一个零通道拉偏)
  • 可跳过:研究只关心坏导本身(如单纯质量检查);或坏导数 > 10%

3. 前置条件

  • 已执行步骤 06:montage 必须已设置(插值依赖电极坐标)
  • 已执行步骤 11:坏导列表稳定

4. 核心代码

Python
import mne

# ====== 方式 A:默认插值(球面样条,推荐) ======
# 自动遍历 raw.info['bads'] 并插值
raw.interpolate_bads(reset_bads=True)

# ====== 方式 B:手动指定要插值的通道 ======
# 先把要插值的通道加入 bads 列表,再调用 interpolate_bads(无 picks 参数)
raw.info['bads'] = ['Fp1', 'Cz']
raw.interpolate_bads(
    reset_bads=True,
    method=dict(eeg='spline'),
)

# ====== 方式 C:所有通道都强制插值(不推荐,仅调试用) ======
# raw.interpolate_bads(picks=raw.ch_names)

# ====== 验证 ======
print(f"剩余坏导: {raw.info['bads']}")  # reset_bads=True 后应为空

5. 参数详解(真实签名)

raw.interpolate_bads(reset_bads=True, mode='accurate', origin='auto', method=None, exclude=(), on_bad_position='warn', verbose=None)

参数 含义 推荐值
(无 picks 参数) — 通过 raw.info['bads'] 控制要插值的通道
reset_bads 插值后是否清空坏导列表 True(推荐)
method 插值方法 dict(eeg='spline')(推荐)/ dict(eeg='MNE') / dict(eeg='nan')
mode 边界模式 'accurate'(默认)
origin 参考电极 'auto'(默认,0,0,0.04)
exclude 不参与插值通道 默认空
on_bad_position 通道无位置时如何处理 'warn' / 'raise' / 'ignore'

合法插值方法(method['eeg'] 取值)

方法 含义 适用
'spline' 球面样条插值(默认) 推荐;标准 montage
'MNE' MNE 内部插值算法 与 'spline' 等价
'nan' 置 NaN(仅清空坏导) 调试用

⚠️ 'sphere' 不是合法 method 取值——MNE 不接受;尝试传入会触发 ValueError。

6. 验证方法

Python
# 验证 1:坏导列表已清空
print(f"剩余坏导: {raw.info['bads']}")
assert len(raw.info['bads']) == 0, "reset_bads 未生效"

# 验证 2:插值后数据无 NaN
data, _ = raw.get_data(return_times=True)
assert not np.isnan(data).any(), "插值后出现 NaN"

# 验证 3:可视化(插值通道应与周边高度相关)
# 假设 Fp1 被插值了,与 Fp2、AF3、AF7 对比
fp1_data, _ = raw['Fp1', :5000]
af3_data, _ = raw['AF3', :5000]
corr = np.corrcoef(fp1_data[0], af3_data[0])[0, 1]
print(f"Fp1 vs AF3 相关系数: {corr:.2f}")
# 期望:r > 0.7

# 验证 4:对比插值前后 PSD
# (需要原始 backup)raw_orig vs raw 插值后

7. 常见错误

错误 原因 解决方案
ValueError: Channel positions not set 未执行步骤 06 set_montage 立即回去执行
ValueError: ... 'sphere' is not a valid method 'sphere' 不是合法 method 值 改用 'spline' 或 'MNE'
TypeError: unexpected keyword 'picks' picks 不是 interpolate_bads 的参数 通过 raw.info['bads'] 控制
插值通道振幅异常小 用了不稳定的插值方法 改回 method=dict(eeg='spline')
坏导数 > 10% 数据本身严重异常 不要插值,直接删除该被试
reset_bads=False 后下游仍识别为坏导 列表未清空 显式 raw.interpolate_bads(reset_bads=True)
边缘电极插值偏差大 边缘电极周边少 接受偏差或剔除该被试

8. 官方来源

资源类型 链接
interpolate_bads https://mne.tools/stable/generated/mne.io.Raw.html#mne.io.Raw.interpolate_bads
插值教程 https://mne.tools/stable/auto_tutorials/preprocessing/15_handling_bad_channels.html

9. 学术引用

Perrin, F., et al. (1989). Spherical splines for scalp potential and current density mapping. Electroencephalography and Clinical Neurophysiology, 72(2), 184-187.