Python-EEG工具库MNE中文教程(13)-"bad"通道介绍

本分享为脑机学习者Rose整理发表于公众号:脑机接口社区(微信号:Brain_Computer).QQ交流群:903290195

本教程主要介绍手动标记坏通道以及基于其他传感器的好信号重建"bad"通道。

导入工具库

import os
from copy import deepcopy
import numpy as np
import mne
"""
加载本地文件
sample_audvis_raw.fif
如果本地默认位置没有该文件,
则从网上下载测试案例
"""
sample_data_folder = mne.datasets.sample.data_path()
sample_data_raw_file = os.path.join(sample_data_folder, 'MEG', 'sample',
                                    'sample_audvis_raw.fif')
raw = mne.io.read_raw_fif(sample_data_raw_file, verbose=False)

标记坏频道/标记不良通道(marking bad channels)

有时个别通道出现故障,提供的数据中噪声过高而无法使用。
通过使用MNE-Python,可以很容易地跟踪分析流中的这些通道,而无需实际删除这些通道中的数据。
它具体实现是通过跟踪列表中的坏通道索引并在执行分析或绘图任务时查看该列表。坏通道列表存储在Info对象的'bads'字段中,该字段附加到Raw、Epochs和诱发对象。

# 查看 bad 通道
print(raw.info['bads'])

['MEG 2443', 'EEG 053']

从上面的打印中可以看到,从磁盘中加载的.fif文件中存在标记为"坏"的通道。
其中EEG 053就是一个坏的通道,这里可以看一下它和其他一些EEG通道一起有什么不好的地方。
可以使用标准plot()方法来实现,而不是逐个列出通道名称(['EEG 050','EEG 051',…]),
这里使用正则表达式来使用pick_channels_regexp()函数来选择050和059之间的所有EEG通道(.是通配符):

picks = mne.pick_channels_regexp(raw.ch_names, regexp='EEG 05.')
raw.plot(order=picks, n_channels=len(picks))

也可以对坏的MEG通道(MEG 2443)进行相同的操作。Neuromag系统(就像用来记录示例数据的系统)使用MEG通道号的最后一位数字来表示传感器类型,这里的正则表达式将选择所有以2开头、以3结尾的通道:

picks = mne.pick_channels_regexp(raw.ch_names, regexp='MEG 2..3')
raw.plot(order=picks, n_channels=len(picks))

说明:为了将标记为"bad"的通道与其他正常的通道区分出来,这里用浅灰色绘制"bad"通道。
这些图清楚地表明,EEG 053根本没有检测到头皮电位,而MEG 2443的内部噪声似乎比它的邻居要大得多——它的信号比其他MEG通道大几个数量级。
如果要更改标记为"bad"的频道,可以直接编辑raw.info['bads'];这是一个普通的Python列表,因此可以使用常见的列表方法来操作:

original_bads = deepcopy(raw.info['bads'])
raw.info['bads'].append('EEG 050')               # 添加单个通道
raw.info['bads'].extend(['EEG 051', 'EEG 052'])  # 添加多个通道
bad_chan = raw.info['bads'].pop(-1)  # 移除列表中的最后一项
raw.info['bads'] = original_bads     # 更改整个列表

也可以交互地在raw.plot()或epoch .plot()的plot窗口中切换通道是否标记为“bad”,方法是单击垂直轴上的通道名称(在raw.plot()窗口中,当然也可以通过单击plot区域中的通道跟踪来实现这一点)。每次切换通道时,bads字段都会立即更新,并在plot窗口关闭后保留其修改状态。

mne中的坏频道列表。Info对象的bads字段在跨MNE-Python代码库的几十个函数和方法中被自动考虑。这与函数或方法签名中的参数exclude='bads'一致。通常,这个exclude参数还接受一组通道名称或索引,因此如果希望包含坏的通道,可以通过传递exclude=来实现。

例如:当然可以通过单击垂直轴上的通道名称(在raw.plot()窗口中,也可以在raw.plot()或epochs.plot()的绘制窗口中以交互方式切换通道是否标记为“不良”。 可以通过单击绘图区域中的通道轨迹来执行此操作。每次切换通道时,bads字段都会立即更新,并且在关闭绘图窗口后将保留其修改后的状态。

在MNE-Python代码库中的数十种函数和方法中,会自动考虑mne.Info对象的bads字段中的不良通道列表,这与函数或方法签名中的参数exclude ='bads'一致地完成。 通常,此exclude参数还接受通道名称或索引的列表,因此,如果要包括不良通道,可以通过传递exclude = [](或其他一些要排除的通道列表)来实现。例如:

good_eeg = mne.pick_types(raw.info, meg=False, eeg=True)
all_eeg = mne.pick_types(raw.info, meg=False, eeg=True, exclude=[])
print(np.setdiff1d(all_eeg, good_eeg))
print(np.array(raw.ch_names)[np.setdiff1d(all_eeg, good_eeg)])

[367]
['EEG 053']

参考
Python-EEG工具库MNE中文教程(13)-"bad"通道介绍
脑机学习者Rose笔记分享,QQ交流群:903290195
更多分享,请关注公众号

原文地址:https://www.cnblogs.com/RoseVorchid/p/12098922.html