热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MNEPython从Raw对象中解析event

今天结合案例代码给大家介绍一下MNE是如何从Raw对象中解析event的。这篇内容主要描述了如何从原始记录中读取实验事件,以及如何在MNE-Python中事件的两种不

今天结合案例代码给大家介绍一下MNE是如何从Raw对象中解析event的。

这篇内容主要描述了如何从原始记录中读取实验事件,以及如何在MNE-Python中事件的两种不同表示形式(事件数组和注释对象)之间进行转换。

在入门教程中,我们看到了从"STIM"通道读取实验事件的示例;在这里,我们将更广泛地讨论事件和注释,提供有关从STIM通道读取的更详细的信息,并给出一个读取事件的示例。在教程"使用事件和注释连续数据"讨论了如何分别绘制、合并、加载、保存和导出事件和注释,后面的教程还介绍了Raw对象的交互式注释。

案例中为了节省内存,我对Raw对象进行了裁剪,只要60秒:

首先导入工具包

import os
import numpy as np
import mne
import matplotlib.pyplot as plt

加载数据

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)

对Raw对象数据进行裁剪,获取60秒数据

raw.crop(tmax=60).load_data()

事件(Events)和注释(Annotations)数据结构

一般来说,事件和注释数据结构都具有相同的目的:它们提供了EEG/MEG记录期间的时间与事件发生时的描述之间的映。换句话说,他们把时间和内容联系起来。主要区别如下:  

单位:事件(Events)这种数据结构以样本为单位表示时间,而注释(Annotations)数据结构以秒为单位表示时间。

描述上的限制:事件数据结构将"what"表示为整数"Event ID"代码,而注释数据结构将what表示为字符串。

持续时间的编码方式:事件数组的事件没有持续时间(尽管可以在事件数组中用成对的开始/偏移事件来表示持续时间),而Annotations对象的每个元素都必须包含持续时间(如果需要一个瞬时事件,则持续时间可以是零)。

内部表示:事件存储为普通的NumPy数组,而注释是在MNE-Python中定义的类似列表的类。

什么是STIM渠道?

STIM通道("刺激通道[stimulus channel]"的缩写)是指不接收来自EEG、MEG或其他传感器的信号的通道。相反,刺激通道记录电压(通常是从实验控制计算机发送的固定大小的短矩形直流脉冲)被时间锁定在实验事件上,例如受试者的刺激或按钮按下反应(这些脉冲有时被称为TTL脉冲、事件脉冲、触发信号,或者仅仅是"触发器[triggers]")。在其他情况下,这些脉冲可能不会被严格地锁定在实验事件上,而是可能发生在两次试验验之间,以表明在接下来的实验中将要发生的刺激类型(或实验条件)。

直流脉冲可能全部在一个STIM通道上(在这种情况下,不同的实验事件或试验类型被编码为不同的电压幅度),或者它们也可能分布在多个通道上,在这种情况下,脉冲发生的信道可以被用来编码不同的事件或条件。

即使在具有多个STIM通道的系统中,通常也有一个通道记录其他STIM通道的加权和,这样就可以将该通道上的电压水平明确解码为特定的事件类型。  

在较老的Neuromag系统(例如用于记录样本数据的系统)上,这个"总和通道"通常是STI 014;在较新的系统中,通常是STI101。

你可以在原始数据文件看到STIM通道:

raw.copy().pick_types(meg=False, stim=True).plot(start=3, duration=6)
plt.show()

从上面的结果可以看到STI 014(总和通道)包含不同幅度的脉冲,而其他通道上的脉冲幅度较为一致。  

从上图中还可以看到,每次在其他STIM通道上有一个脉冲时,STI 014上也有一个相对应的脉冲。

将STIM通道信号转换为事件数组

如果数据在STIM通道上记录了事件,则可以使用mne.find_events()将它们转换成事件数组。  

每个脉冲的开始(或偏移)的样本数被记录为事件时间,脉冲幅度被转换为整数,  

这些样本数以及整数代码对 被存储在NumPy数组中(通常称为"事件数组"或"事件")。

在其最简单的形式中,该函数只需要Raw对象以及用于读取事件的通道的名称:

events = mne.find_events(raw, stim_channel='STI 014')
print(events[:5]) # show the first 5

如果不提供STIM通道的名称,find_events()将首先为变量MNE_STIM_CHANNEL、MNE_STIM_CHANNEL_1等查找MNE-Python配置变量。  

如果没有找到,则尝试使用STI 014和STI101通道,然后使用raw.ch_names中第一个类型为"STIM"的通道。

find_events()有多个选项,包括用于将事件与STIM通道脉冲的开始或偏移对齐,设置最小脉冲持续时间以及处理连续脉冲(它们之间不返回零)的选项。例如,可以通过将output='step'传递给mne.find_events()来有效地编码事件持续时间,更多详细信息,可以参阅find_events()的文档。

将嵌入式事件作为注释读取(Reading embedded events as Annotations)

一些EEG/MEG系统生成文件,其中事件存储在单独的数据数组中,而不是作为脉冲存储在一个或多个STIM通道中。例如,EEGLAB格式将事件作为数组的集合存储在.set文件中。读取这些文件时,MNE-Python会自动将存储的事件转换成Aannotation对象,并将其存储为Raw对象的Annotations属性:

testing_data_folder = mne.datasets.testing.data_path()
eeglab_raw_file = os.path.join(testing_data_folder, 'EEGLAB', 'test_raw.set')
eeglab_raw = mne.io.read_raw_eeglab(eeglab_raw_file)
print(eeglab_raw.annotations)

可以通过三个属性访问注释(Annotations)对象中的核心数据:开始、持续时间和描述。在这里我们可以看到EEGLAB文件中存储了154个事件,它们的持续时间都是0秒,有两种不同类型的事件,第一个事件发生在录音开始后大约1秒:

print(len(eeglab_raw.annotations))
print(set(eeglab_raw.annotations.duration))
print(set(eeglab_raw.annotations.description))
print(eeglab_raw.annotations.onset[0])

154
{0.0}
{'rt', 'square'}
1.000068359375

有关注释(Annotations)对象的更多信息,包括如何以交互方式向原始(Raw)对象添加注释,以及如何绘图、连接、加载、保存和导出注释对象,可以在注释连续数据的教程中找到。

事件数组和注释对象之间的转换

一旦将实验事件读入MNE-Python(作为事件数组或注释对象),就可以根据需求对这两种格式之间进行转换。这样做可能是因为,例如,需要一个事件数组来提取连续数据。

要将注释对象转换为事件数组,请在包含注释的Rwa文件上使用函数mne.events_from_annotations()。


该函数将为raw.annotations.description的每个唯一元素分配一个整数Event ID,并将返回描述到整数事件ID的映射以及派生的事件数组。默认情况下,在每个注释开始时创建一个事件;这可以通过events_from_annotations()的chunk_duration参数进行修改,以在每个注释范围内创建等间隔的事件(请参见下面的为每个注释创建多个事件,或参见直接创建等距事件的事件数组的等距事件数组)。

events_from_annot, event_dict = mne.events_from_annotations(eeglab_raw)
print(event_dict)
print(events_from_annot[:5])

Used Annotations descriptions: ['rt', 'square']
{'rt': 1, 'square': 2}
[[128 0 2][217 0 2][267 0 1][602 0 2][659 0 1]]

如果要控制将哪些整数映射到每个唯一的描述值,则可以传递一个dict,将映射指定为events_from_annotations()的event_id参数;此dict将未经修改地返回为event_dict。

custom_mapping = {'rt': 77, 'square': 42}
(events_from_annot,event_dict) = mne.events_from_annotations(eeglab_raw, event_id=custom_mapping)
print(event_dict)
print(events_from_annot[:5])

Used Annotations descriptions: ['rt', 'square']
{'rt': 77, 'square': 42}
[[128 0 42][217 0 42][267 0 77][602 0 42][659 0 77]]

要进行相反的转换(从事件(Events)数组到注释(Annotations)对象),可以创建从整数事件ID到字符串描述的映射,并使用Annotations构造函数创建注释对象,使用set_annotations()方法将注释添加到原始(Raw)对象。因为样本数据是在Neuromag系统上记录的(其中样本编号是在采集系统启动时开始的,而不是在记录启动时开始的),所以我们还需要传入orig_time参数,以便onsets与记录开始时正确对齐:

mapping = {1: 'auditory/left', 2: 'auditory/right', 3: 'visual/left',4: 'visual/right', 5: 'smiley', 32: 'buttonpress'}
onsets = events[:, 0] / raw.info['sfreq']
durations = np.zeros_like(onsets) # assumes instantaneous events
descriptions = [mapping[event_id] for event_id in events[:, 2]]
annot_from_events = mne.Annotations(onset=onsets, duration=durations,description=descriptions,orig_time=raw.info['meas_date'])
raw.set_annotations(annot_from_events)

现在,在绘制原始数据时,注释将自动显示,并根据它们的标签值进行颜色编码:

raw.plot(start=5, duration=5)

不用于商业行为,转载请联系后台

若有侵权,请后台留言,管理员即时删侵!

更多阅读

上海交大计算机系吕宝粮教授团队荣获IEEE情感计算汇刊最佳论文

如何识别ICA成分

采访深圳先进院李骁健:脑机接口全球竞赛,中国不落后

ICA独立成分分析去除脑电伪影

Nature子刊 | 睡眠时型会影响人类大脑生理的认知功能

迈向“超人认知”:脑机接口的未来

北理工研究团队在脑-控移动机器人上取得重要进展

你的每一次在看,我都很在意!



推荐阅读
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • C语言常量与变量的深入理解及其影响
    本文深入讲解了C语言中常量与变量的概念及其深入实质,强调了对常量和变量的理解对于学习指针等后续内容的重要性。详细介绍了常量的分类和特点,以及变量的定义和分类。同时指出了常量和变量在程序中的作用及其对内存空间的影响,类似于const关键字的只读属性。此外,还提及了常量和变量在实际应用中可能出现的问题,如段错误和野指针。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
author-avatar
书友69132746
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有