脑机接口基础学习03-认识及创建Epoch

前面两篇文章一直在写Epoch,那么Epoch到底是什么东西?
概念简介:从连续的脑电图信号中提取一些特定时间窗口的信号,这些时间窗口可以称作为epochs
由于EEG是连续收集的,要分析脑电事件相关的电位时,需要将信号‘切分’成时间片段,这些时间片段被锁定到某个事件(例如刺激)中的时间片段,比如在EEGLAB分析中,EEGLAB将连续数据视为由一个较长的周期(long epoch)组成,而将数据切分后,它由多个较小的时期(small epoch)组成

举个例子:
假如我们有一个长度为60s的信号X,采样频率为1Hz,脑电信号的矩阵表示1x60矩阵,如果将信号划分为一些2s的信号,则将有30个peoch(信号中每2s就是一个epoch)
在MNE中,Epoch对象是一种把连续型数据作为时间段集合的表示方法,形状为(n_events,n_channels,n_times)的数组形式:
创建Epochs对象方式有三种:
(1)通过Raw对象和事件点(event times)
(2)通过读取.fif文件数据生成Epoch对象
(3)通过mne.EpochsArray从头创建Epoch对象
来看一个简单的小例子:

'''
###读取fif文件创建Epoch对象
步骤:
(1)读取fif文件,构建raw对象
(2)创建event对象
(3)创建epoch对象
(4)对epoch进行叠加平均得到evoked对象
(5)绘制evoked
'''
#导入python库函数
import mne
from mne import io
from mne.datasets import sample
import matplotlib.pyplot as plt

raw_fname=r'E:\脑机接口资料\MNE-sample-data\MEG\sample\sample_audvis_filt-0-40_raw.fif'
event_fname=r'E:\脑机接口资料\MNE-sample-data\MEG\sample\sample_audvis_filt-0-40_raw-eve.fif'
event_id,tmin,tmax=1,-0.2,0.5


#读取fif文件,创建raw对象
raw=io.read_raw_fif(raw_fname)
#读取包含event的fif文件,创建event对象
events=mne.read_events(event_fname)

'''
挑选通道:EEG+MEG-bad channels

'''
raw.info['bads']+=['MEG 2443','EEG 053'] #bads+2more
picks=mne.pick_types(raw.info,meg=True,eeg=False,stim=True,eog=True,exclude='bads')

#读取Epoch数据
epochs=mne.Epochs(raw,events,event_id,tmin,tmax,proj=True,
                 picks=picks,baseline=(None,0),preload=True,
                 reject=dict(grad=4000e-13,mag=4e-12,eog=150e-6))

'''
对epochs数据进行求平均获取诱发响应

'''
evoked=epochs.average()
evoked.plot(time_unit='s')
plt.show()

输出结果:
在这里插入图片描述
在这里插入图片描述
下面来看一下如何从头创建Epoch对象
在实际过程中,有时需要从头创建数据来创建Epoch对象,方式:利用mne.EpochsArray创建Epochs对象,创建时直接构建numpy数组即可,数据对应的单位:
V:eeg,eog,seeg,emg,ecg,bio,ecog
T:mag
T/m:grad
M:hbo.hbr
Am:dipole
AU:misc

案例1

#引入python包
import mne
import numpy as np
import matplotlib.pyplot as plt

'''
主要步骤如下:
第一步:构建数据
构建一个大小为10x5x200的三维数组,数组中数据是随机数:
第一维数据表示:10 epochs
第二维数据表示:5 channels
第三维数据表示:2 seconds per epoch

'''

#采样频率

sfreq=100
data=np.random.randn(10,5,sfreq*2)

#创建一个info结构

info=mne.create_info(ch_names=['MEG1','MEG2','EEG1','EEG2','EOG'],
                    ch_types=['grad','grad','eeg','eeg','eog'],
                    sfreq=sfreq)

'''
构建events
在创建Epochs对象时,必须提供一个‘events’数组,
事件(event)描述的是某一种波形(症状)的起始点,其为一个三元组,形状为(n_events,3):
第一列元素以整数来描述事件起始采样点;
第二列元素对应的是当前事件来源的刺激通道(stimulus channel)的先前值(previous value),该
值大多数情况是0;
第三列元素表示的是该event的id

'''
events=np.array([
    [0,0,1],
    [1,0,2],
    [2,0,1],
    [3,0,2],
    [4,0,1],
    [5,0,2],
    [6,0,1],
    [7,0,2],
    [8,0,1],
    [9,0,2],
])

'''
设置事件的id
如果是dict,则以后可以使用这些键访问关联的事件。示例:dict(听觉=1,视觉=3)
如果是int,将创建一个id为string的dict
如果是列表,则使用列表中指定ID的所有事件
如果没有,则所有事件都将一起使用,并使用与事件id整数对应的字符串整数名称创建dict

'''
#创建event id,受试者或者微笑或者皱眉
event_id=dict(smiling=1,frowning=2)

#tmin:event开始前的时间,如果未指定,则默认为0

#设置事件开始前时间为-0.1s
tmin=-0.1

'''
创建epochs对象

'''
#利用mne.EpochsArray创建epochs对象

custom_epochs=mne.EpochsArray(data,info,events,tmin,event_id)
print(custom_epochs)

#绘制
_=custom_epochs['smiling'].average().plot(time_unit='s')

在这里插入图片描述
案例2

#引入python包

import numpy as np
import neo

import mne
import matplotlib.pyplot as plt

'''
设置 event id,用来识别 events

'''
event_id=1
#第一列表示样本编号
events=np.array([[200,0,event_id],
               [1200,0,event_id],
               [2000,0,event_id]]) # List of three arbitrary events
sfreq=1000#采样频率
times=np.arange(0,10,0.001)#Use 10000 samples(10s)

sin=np.sin(times*10)#乘以10缩短周期
cos=np.cos(times*10)

'''
利用sin和cos创建一个2个通道的700ms epochs的数据集

只要是(n_epochs,n_channels,n_times)形状的数据,都可以被用来创建

'''

epochs_data=np.array([[sin[:700],cos[:700]],
                    [sin[1000:1700],cos[1000:1700]],
                    [sin[1800:2500],cos[1800:2500]]])

ch_names=['sin','cos']
ch_types=['mag','mag']
info=mne.create_info(ch_names=ch_names,sfreq=sfreq,ch_types=ch_types)
epochs=mne.EpochsArray(epochs_data,info=info,events=events,
                      event_id={'arbitrary':1})
epochs.plot(scalings='auto')
plt.show()

在这里插入图片描述
OK,今天的脑机接口学习结束

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值