脑电分析系列[MNE-Python-2]| MNE中数据结构Epoch及其创建方法
Epoch概念简介
相信很多人第一次接触epoch时,都会有疑惑,这个词在EEG中到底指的是什么。
下面将详细说明一下。
从连续的脑电图信号中提取一些特定时间窗口的信号,这些时间窗口可以称作为epochs.
由于EEG是连续收集的,要分析脑电事件相关的电位时,需要将信号"切分"成时间片段,这些时间片段被锁定到某个事件(例如刺激)中的时间片段。
比如在EEGLAB分析中,EEGLAB将连续数据视为由一个较长的时期(long epoch)组成,而将数据切分后,它由多个较小的时期(small epoch)组成。
举个例子
假设我们有一个长度为60s的信号x,采样频率为1 Hz.
脑电信号的矩阵表示为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对象
这里利用方式2和方式3创建Epochs对象
a. 读取fif文件创建Epoch对象
步骤:
1)读取fif文件,构建raw对象;
2)创建event对象;
3)创建epoch对象;
4)对epoch进行叠加平均得到evoked对象;
5)绘制evoked。
import mne
from mne import io
from mne.datasets import sampledata_path = sample.data_path()raw_fname = data_path + '/MEG/sample/sample_audvis_filt-0-40_raw.fif'
event_fname = data_path + '/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 + 2 more
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()
Read a total of 4 projection items:PCA-v1 (1 x 102) idlePCA-v2 (1 x 102) idlePCA-v3 (1 x 102) idleAverage EEG reference (1 x 60) idleRange : 6450 ... 48149 = 42.956 ... 320.665 secs
Ready.
Current compensation grade : 0
72 matching events found
Applying baseline correction (mode: mean)
Not setting metadata
Created an SSP operator (subspace dimension = 3)
4 projection items activated
Loading data for 72 events and 106 original time points ...Rejecting epoch based on EOG : ['EOG 061']Rejecting epoch based on EOG : ['EOG 061']Rejecting epoch based on EOG : ['EOG 061']Rejecting epoch based on EOG : ['EOG 061']Rejecting epoch based on EOG : ['EOG 061']Rejecting epoch based on MAG : ['MEG 1711']Rejecting epoch based on EOG : ['EOG 061']Rejecting epoch based on EOG : ['EOG 061']Rejecting epoch based on EOG : ['EOG 061']Rejecting epoch based on EOG : ['EOG 061']Rejecting epoch based on EOG : ['EOG 061']Rejecting epoch based on EOG : ['EOG 061']Rejecting epoch based on EOG : ['EOG 061']Rejecting epoch based on EOG : ['EOG 061']Rejecting epoch based on EOG : ['EOG 061']Rejecting epoch based on EOG : ['EOG 061']Rejecting epoch based on EOG : ['EOG 061']
17 bad epochs dropped
b. 从头创建Epoch对象
在实际过程中,有时需要从头构建数据来创建Epochs对象,
方式:利用mne.EpochsArray创建Epochs对象,创建时直接构建numpy数组即可,数组的形状必须是(n_epochs, n_chans, n_times)
数据对应的单位:
V: eeg, eog, seeg, emg, ecg, bio, ecog
T: mag
T/m: grad
M: hbo, hbr
Am: dipole
AU: misc
案例1
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
import numpy as np
import neoimport 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 eventssfreq = 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个通道的700 ms 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()
编译作者:BrainLover编译
不用于商业行为,转载请联系后台
若有侵权,请后台留言,管理员即时删侵!
更多阅读
[MNE-Python-1]| MNE-Python详细安装与使用
[MNE-Python-2]| MNE中数据结构Raw及其用法简介
Nature子刊:利用闭环脑机接口缓解疼痛感
脑-脑接口:人类大脑利用意念控制老鼠走迷宫
投稿通道
如何让你的工作让更多人知晓和受益?
脑机接口社区就是这样一个连接学界、
企业界和爱好者的平台渠道。
社区鼓励高校实验室、企业或个人在我们平台上分享优质内容。
稿件要求
稿件系个人原创作品,若已在其他平台发表,请明确标注。
稿件一经录取,便提供稿费!
投稿通道
微信扫码,备注:投稿+姓名+单位
微信交流群,请扫码上方微信
(备注:姓名+单位+专业/领域行业)
QQ交流群:913607986
你的每一次在看,我都很在意!
脑电分析系列[MNE-Python-2]| MNE中数据结构Epoch及其创建方法相关推荐
- 脑电分析系列[MNE-Python-5]| Python机器学习算法随机森林判断睡眠类型
案例介绍 本案例通过对多导睡眠图(Polysomnography,PSG)数据进行睡眠阶段的分类来判断睡眠类型. 训练:对Alice的睡眠数据进行训练: 测试:利用训练结果对Bob的睡眠数据进行测试, ...
- 脑电分析系列[MNE-Python-6]| Python读取.set文件和.locs文件
本案例主要介绍如何读取eeglab示例文件.set以及.locs文件. .set文件记录的是采集的信息,主要内容包括通道数,事件数,开始时间与结束时间等. .locs文件记录的是电极位置信息. 知识点 ...
- 脑电分析系列[MNE-Python-21]| Python协方差矩阵处理脑电数据
今天主要介绍一下MNE中如何用协方差矩阵来处理脑电数据的. MNE中的许多方法,包括源估计和一些分类算法,都需要根据记录进行协方差估计. 在本教程中,我们将介绍传感器协方差计算的基础知识,并构建一个噪 ...
- Python-EEG工具库MNE中文教程(2)-MNE中数据结构Epoch及其创建方法
目录 Epoch概念简介 a. 读取fif文件创建Epoch对象 b. 从头创建Epoch对象 案例1 案例2 本教程为脑机学习者Rose发表于公众号:脑机接口社区 .QQ交流群:903290195 ...
- 脑电分析系列[MNE-Python-4]| MNE中数据结构Evoked及其对象创建
Evoked结构 Evoked potential(EP)诱发电位或诱发反应是指在出现诸如闪光或纯音之类的刺激后,从人类或其他动物的神经系统,特别是大脑的特定部分记录的特定模式的电位.不同形式和类型的 ...
- 脑电分析系列 | MNE-Python汇总
1 脑电分析系列MNE-Python教程 [MNE-1]| MNE-Python详细安装与使用(更新) [MNE-2]| MNE中数据结构Raw及其用法简介(更新) [MNE-3]| MNE中数据结构 ...
- 脑电分析系列[MNE-Python-19]| 可视化Evoked数据
在前面我们介绍过Evoked的数据结构以及如何创建Evoked对象: 脑电分析系列[MNE-Python-4]| MNE中数据结构Evoked及其对象创建 Evoked potential(EP)诱发 ...
- 脑电分析系列[MNE-Python-11]| 信号空间投影SSP 应用
信号空间投影(SSP) 在前面一篇分享(脑电分析系列[MNE-Python-10]| 信号空间投影SSP数学原理)中提到,投影矩阵将根据您试图投射出的噪声种类而变化.信号空间投影(SSP)是一种通过比 ...
- 脑电分析系列[MNE-Python-13]| bad通道介绍
bad 通道 本教程主要介绍手动标记坏通道以及基于其他传感器的好信号重建"bad"通道. 导入工具库 mport os from copy import deepcopy impo ...
最新文章
- ROS系统——动态修改realsense相机参数方法
- Dora.Interception,为.NET Core度身打造的AOP框架 [1]:更加简练的编程体验
- 【洛谷 1991】 无线通讯网
- yum升级rhel5
- 水泵怎么做_泳池设备日常怎么维护和保养?
- 前端学习(2811):小程序学习之学习目录
- ZOJ 1760 How Many Shortest Path
- sharepoint 域认证的时候给用户一个友好的登陆界面
- lnmp+lamp编译后,编译参数查看
- 中科恒伦助力长江电力移动办公平台账号加固
- 字符串-创建//比较
- torch的使用笔记
- js动态计算移动端rem
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_1-4.在线教育后台数据库设计...
- 5.13 利用图层的矢量蒙版打造浪漫情调 [原创Ps教程]
- 基于linux cli( 命令行) 的翻译工具推荐
- 我的前端故事----疯狂倒计时(requestAnimationFrame)
- 利用.sym跨平台解析iOS符号
- 支付宝出安全漏洞,买了账户安全险的也要小心
- 数据可视化(一):matplotlib
热门文章
- Linux不能上网ping:unknown host问题怎么解决?
- Intellij Idea debug 模式如果发现异常,即添加异常断点在发生异常处
- 解决“错误 D8016 “/ZI”和“/Gy-”命令行选项不兼容 ”问题
- pdf文件之itextpdf插入html内容以及中文解决方案
- 关于java文件下载文件名乱码问题解决方案
- Android:禁用listView上的突出显示单击
- jQuery计数子元素
- 如何在Java中比较日期? [重复]
- 为什么“ cd”在shell脚本中不起作用?
- 如何使用意图将对象从一个Android活动发送到另一个?