【声明:本blog为原创,转载请先联系~】
之前主要一直在使用matlab做一些预处理,主要基于eeglab,不过最近由于结果呈现的需要,发现py的mne库功能更强大丰富,开源性也更好,所以这里以mnelab(基于mne库做的GUI界面)入手,记录一下其强大而简单的功能。
mnelab/mne包链接指向库(膜拜大佬):
https://github.com/mne-tools/mne-python
https://github.com/cbrnr/mnelab
(1)安装需依赖的库及版本环境:
MNELAB requires Python >= 3.6. In addition, the following Python packages are required:
如果需要其他的计算/导出/导入格式,还需要安装以下的库
Optional dependencies provide additional features if installed:
mne做不了以下事情:
MNELAB comes with the following features that are not (yet) available in MNE:
(2)安装指令:
A.pip下安装
python3 -m pip install PyQt5
) or PySide2 (python3 -m pip install PySide2
).python3 -m pip install mnelab
).You can start MNELAB in a terminal with mnelab(windows系统指令)
or python3 -m mnelab(linux系统指令)
.
B.anaconda下安装
An (unofficial, but regularly updated) conda package can be installed from conda-forge. We strongly suggest to install MNELAB into its own dedicated environment to ensure smooth installation and operation:
conda create -y -n mnelab -c conda-forge mnelab
(1)数据预处理
EEG数据一般在后续操作前需要对其进行数据的简单预处理,以我个人经验,将其分为大致以下几个步骤:
这里以实际实验数据(.vhdr/vmark/eeg)数据格式为例,open读取后的文件内容
code:
data = read_raw("C:/Users/Administrator/Desktop/实验数据/2020.1.5下午before/03.vhdr", preload=True)
<1>脑区电极的定位,即确定channel locations。
mnelab:edit——》set montage
code:
data.set_montage('standard_1020', raise_if_subset=False)
<2>选择/删除电极。这里主要结合自己的研究内容,我主要研究EEG信号,因此在我们的研究中需要删除ECG、EMG、EOG等不需要的通道
mnelab:edit——》pick channels
code:
raw.drop({'ECG'})
<3>在分段前进行滤波,防止后滤波而导致的锯齿化数据(顺序:先滤波——》再降采样、分段等),常用一般滤波[0.5,30]hz(后续可根据具体需求进一步进行sub-band多子带滤波)
mnelab:tools——》filter data
data.filter(0.5, 30.0)
<4>重置参考电极,这里常以TP9 TP10双耳平均电极作为参考(与研究目的也有关,这里讲p300的参考电极)
公式:所有电极数据 —(TP9+TP10)/2
mnelab:edit——》set reference
code:
data.set_eeg_reference(['TP9', 'TP10'])
结果:左图为重置参考前,右图为重置参考后(可以明显看到TP9 TP10处数据变缓和,因为以其叠加平均后作为参考)
补充:其他的参考方式:
一些常见的参考方案以及ref_channels参数的相应值如下:
(1)无需重新引用(No re-referencing):
如果EEG数据已经在使用正确的参考信号,则设置ref_channels = []。这将阻止MNE-Python自动添加平均参考投影。
(2)平均参考(Average reference):
通过设置ref_channels ='average'来对当前EEG信号进行平均,创建一个新的虚拟参考电极。
如果在info['bads']中设置了错误的EEG通道,则会自动排除它们。
raw.set_eeg_reference('average', projection=True)
evoked_car = mne.Epochs(raw, **epochs_params).average()
evoked_car.plot(axes=ax2,
titles=dict(eeg='Average reference'),
show=False,
time_unit='s')
"""
使用所有通道的平均值作为参考
"""
raw_avg_ref = raw.copy().set_eeg_reference(ref_channels='average')
(3)单电极(A single electrode):
将ref_channels设置为包含将用作新参考的通道名称的列表,例如ref_channels = ['Cz']。
多个电极的平均值(The mean of multiple electrodes:):
通过计算从两个或多个选定通道记录的当前EEG信号的平均值,可以创建一个新的虚拟参考电极(自动计算所选取通道的平均值)
将ref_channels设置为通道名称列表,指定要使用的通道。
例如,要使用平均乳突参考,在使用10-20命名方案时,请设置ref_channels = ['M1','M2']。
<5>对数据根据mark进行分段,同时去除基线(extract epochs),去基线常以“0时刻”(选定的事件)开始前一段时间作为基线
mnelab:tools——》create events from annotations(因为我们数据格式为vhdr,自带vmark信息)
这时可以看到,events这里读取了三种mark信息,1(非靶刺激),2(靶刺激)和99999(刺激开始点)
code:
events, _ = mne.events_from_annotations(data)
<6>分段extract epochs,去基线(一般以0目标前几百ms作为去基线标准baseline)
mnelab:tools——》extract epochs
这里选择“2”(靶刺激作为分段),总时长-0.2s-1s,去基线以-0.2s-0s为baseline
code:
data = mne.Epochs(data, events, event_id=[2], tmin=-0.2, tmax=1.0, baseline=(-0.2, 0.0), preload=True)
【未完待续】