步骤 12:坏导插值
对坏导进行插值修复
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.