脑机接口基础学习16---脑电数据Epoching处理

Epoch概念简介:
从连续的脑电图信号中提取一些特定时间窗口的信号,这些时间窗口可以称作为epochs。由于EEG是连续收集的,要分析脑电事件相关电位时,需要将信号“切分”为事件片段,这些事件片段被锁定到某个事件(例如刺激)中的时间片段。
比如在EEGLAB分析中,EEGLAB将连续数据视为由一个较长的时期(long epoch)组成,而将数据切分后,它有多个较小的时期(small epoch)组成。
举个例子
假设我们有一个长度为60s的信号X,采样频率为1Hz。脑电信号的矩阵表示为1x60的矩阵,如果将信号划分成一些2s的信号,则将有30个epoch(信号中每2s就是一个epoch)
关于Epoch基本信息可以查看这篇文章:
认识及创建Epoch
关于Epoch的数据结构和用法简介可以查看这篇文章:
数据结构Epoch用法简介
关于Epoch数据可视化可查看这篇文章:
Epoch数据可视化

#这里介绍脑电数据的Epoching处理

import os
import os.path as op
import numpy as np
import mne
import matplotlib.pyplot as plt
#在MNE中,epochs是指单个试验或一小段时间锁定的原始数据的集合。

#首先,读入原始样本数据:
sample_data_folder=r'E:\脑机接口资料\MNE-sample-data'
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)

#设置EEG平均参考
raw.set_eeg_reference('average',projection=True)

在这里插入图片描述

#要创建时间锁定的epochs,首先需要一组包含有关时间信息的事件。
#这里使用刺激通道来定义事件。

order=np.arange(raw.info['nchan'])

#交换两个通道的绘图顺序,以将触发通道显示为第十个通道

order[9]=312
order[312]=9
raw.plot(n_channels=10,order=order,block=True)
plt.show()

在这里插入图片描述
注意底部的STI 014频道。触发通道用于将所有事件合并到单个通道中。从上图可以看到在整个记录中有几个振幅不同的脉冲。这些脉冲对应于在采集过程中呈现给受试者的不同刺激。
脉冲的值为1,、2、3、4、5、和32。要从原始数据创建事件列表,MNE中只需调用一个专门用于次目的的函数,由于事件列表只是一个numpy数组,所以也可以手动创建一个。如果是从外部源(如单独的事件文件)创建事件,则应注意将事件与原始数据正确对齐。


events=mne.find_events(raw)
print('Found %s events,first five:'%len(events))
print(events[:5])

在这里插入图片描述

'''
绘制事件以了解范例
为图例指定颜色和event_id字典

'''

event_id={'Auditory/Left':1,'Auditory/Right':2,
         'Visual/Left':3,'Visual/Right':4,
         'smiley':5,'button':32}
color={1:'green',2:'yellow',3:'red',4:'c',5:'black',32:'blue'}

mne.viz.plot_events(events,raw.info['sfreq'],raw.first_samp,color=color,
                   event_id=event_id)
plt.show()

在这里插入图片描述
如上图所示,事件列表包含三列
第一列对应于样本编号,要将此转换为秒,可以将采样数除以使用的采样频率。
第二列是在转换时保留给触发器通道的旧值,目前没有使用
第三列是触发ID(脉冲幅度)

这里说明一下为什么这些样本看起来与绘制的数据不一致。例如,第一个事件的样本编号为27922,应该转换为大约46.6秒(27977/600)。但是查看脉冲时,可以在3.6秒时看到第一个脉冲。这是因为Neuromag记录有一个first_samp属性,它表示系统启动和录制开始之间的偏移量。Neuromag记录数据的first_samp等于25800.这意味着使用raw.plot看到的第一个样本的样本号25800一般来说,在使用时不需要担心这个偏移量,因为它在MNE函数中已经被考虑进去了,不过最好要注意这一点。
为了确认一下,我们将事件与原始数据一起绘制。注意垂直线(事件)如何与STI 014上的脉冲很好地对齐。

raw.plot(events=events,n_channels=10,order=order)
plt.show()

在这里插入图片描述
在本例中,我们只对触发器1,2,3和4感兴趣。这些触发器对应于听觉和视觉刺激。这里的event_id可以是int,int列表或dict。使用dict可以将这些id分配给不同的类别。当使用int或列表时,这个信息就会丢失。首先,我们为mne.Epochs构造函数定义一些参数,tmin和tmax指的是与事件相关的偏移量,并使用epoch
来封装事件前200毫秒到事件后500毫秒的数据

tmin,tmax=-0.2,0.5
event_id={'Auditory/Left':1,'Auditory/Right':2,
         'Visual/Left':3,'Visual/Right':4}

经过上面步骤,构建了epochs所需的参数。为了得到一些有意义的结果,我们还希望将这些epoch是作为基线。基线画计算基线期间的平均值并相应地调整数据。epochs构造函数默认使用从tmin到0.0秒的基线周期,作为元祖的第一个元素的None指的是时间窗口的开始(本例中为-200ms)。

这里定义了阈值来去除噪声。阈值被定义为epoch时间窗口内的峰到峰的值。
定义为T/m表示梯度计,T表示磁强计,V表示EEG和EOG电极

baseline=(None,0.0)
reject={'mag':4e-12,'eog':200e-6}
epochs=mne.Epochs(raw,events=events,
                 event_id=event_id,tmin=tmin,
                 tmax=tmax,baseline=baseline,
                 reject=reject,
                 picks=('meg','eog'))#这里只包含MEG和EOG

在这里插入图片描述

#下面绘制epochs查看结果。
#顶部的数字是指ID号,从图中可以看到145个事件中有128个通过了rejection process

epochs.plot(block=True)
plt.show()

在这里插入图片描述

#通过绘制drop日志,来查看为什么提出epoch(一般被伪影等污染的epoch数据需要剔除)

epochs.plot_drop_log()
plt.show()

在这里插入图片描述

'''
若要诱发响应,只需执行epoch.average()。它默认只包含数据通道,为了方便举例,我们还使用pick来包含EOG通道

'''
picks=mne.pick_types(epochs.info,meg=True,eog=True)
evoked_left=epochs['Auditory/Left'].average(picks=picks)
evoked_right=epochs['Auditory/Right'].average(picks=picks)

'''
这里使用了前斜杠(‘/’)来分隔实验条件的各个因素。我们可以使用这些“标签”来选择例如所有
左侧试验(包括视觉左侧和听觉右侧)

'''

epochs_left=epochs['Left']

# ... or to select a very specific subset. This is the same as above:
evoked_left_agin=epochs['Left/Auditory'].average(picks=picks)

在这里插入图片描述

#下面绘制诱发响应

evoked_left.plot(time_unit='s')
evoked_right.plot(time_unit='s')
plt.show()

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值