今天主要介绍一下MNE-Python中进行脑电图处理和事件相关电位(ERP)。

有后台留言问,代码是在哪里运行的。这里说明一下,案例介绍的代码均在jupyter notebook中运行的,当然这些代码也可以在PyCharm等IDE中运行(不过可能存在在不同环境下代码需要稍微改动的情况。)

Python脑电图处理案例:

import mne
from mne.datasets import sample
# 加载数据文件
data_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'
# 这些EEG数据已经默认有平均参考(average reference)
raw = mne.io.read_raw_fif(raw_fname, preload=True)

# 只筛选 EEG 和 EOG数据
raw.pick_types(meg=False, eeg=True, eog=True)# 查看 raw 信息, 可以发现有59个EEG通道和1个EOG通道
print(raw.info)

实际上,拥有一些EOG通道的EEG通道是很普遍的。在实际获取EEG数据时,会受到眼动等活动的影响。

如果要更改通道类型,可以使用mne.io.Raw.set_channel_types()方法。
例如,要将EOG通道视为EEG,可以使用以下方法更改其类型:

raw.set_channel_types(mapping={'EOG 061': 'eeg'})
print(raw.info)

比较上面前后两个打印中的红框内容,可以发现,EOG已被EEG取代了。

# 更改EOG通道的名称
raw.rename_channels(mapping={'EOG 061': 'EOG'})# 为了讲述案例,我们将EOG频道重设为EOG类型。
raw.set_channel_types(mapping={'EOG': 'eog'})
"""
样本数据集中的EEG通道有对应通道位置。这些位置可在每个通道说明的"位置"中找到。下面是获取第一个通道的位置
"""print(raw.info['chs'][0]['loc'])
[-0.03737009  0.10568011  0.07333875
  0.00235201  0.11096951 -0.035004580.   1.   0.    0.    0.    1. ]
"""
可以使用mne.io.Raw.plot_sensors()绘制通道位置。
如果您的数据没有位置,则可以使用MNE随附的Montages来设置
"""
raw.plot_sensors()

raw.plot_sensors('3d')  # in 3D

设置脑电图参考

首先,从原始对象中删除参考。

这显示的移除了MNE默认的EEG平均参考。

raw_no_ref, _ = mne.set_eeg_reference(raw, [])

EEG channel type selected for re-referencing

EEG data marked as already having the desired reference. Preventing automatic future re-referencing to an average reference.

Removing existing average EEG reference projection.

然后,定义了Epochs,并计算了左听觉状态的ERP。

reject = dict(eeg=180e-6, eog=150e-6)
event_id, tmin, tmax = {'left/auditory': 1}, -0.2, 0.5
events = mne.read_events(event_fname)
epochs_params = dict(events=events, event_id=event_id, tmin=tmin, tmax=tmax,reject=reject)evoked_no_ref = mne.Epochs(raw_no_ref, **epochs_params).average()
del raw_no_ref  # save memorytitle = 'EEG Original reference'
evoked_no_ref.plot(titles=dict(eeg=title), time_unit='s')
evoked_no_ref.plot_topomap(times=[0.1], size=3., title=title, time_unit='s')

设置平均参考电极

"""
平均参考:通常默认情况下添加,但也可以显式添加。
"""raw.del_proj()
raw_car, _ = mne.set_eeg_reference(raw, 'average', projection=True)
evoked_car = mne.Epochs(raw_car, **epochs_params).average()
del raw_car  # save memorytitle = 'EEG Average reference'
evoked_car.plot(titles=dict(eeg=title), time_unit='s')
evoked_car.plot_topomap(times=[0.1], size=3., title=title, time_unit='s')

自定义参考:使用通道EEG 001和EEG 002的平均值作为参考

raw_custom, _ = mne.set_eeg_reference(raw, ['EEG 001', 'EEG 002'])
evoked_custom = mne.Epochs(raw_custom, **epochs_params).average()
del raw_custom  # save memorytitle = 'EEG Custom reference'
evoked_custom.plot(titles=dict(eeg=title), time_unit='s')
evoked_custom.plot_topomap(times=[0.1], size=3.,title=title, time_unit='s')

可以使用' / '分隔的'标记'来选择Epochs中的试验子集。

首先,我们创建一个包含4个条件的Epochs对象。

event_id = {'left/auditory': 1, 'right/auditory': 2,'left/visual': 3, 'right/visual': 4}
epochs_params = dict(events=events, event_id=event_id, tmin=tmin, tmax=tmax,reject=reject)
epochs = mne.Epochs(raw, **epochs_params)print(epochs)

接下来,我们创建左刺激和右刺激试验的平均值。

我们可以使用基本的操作,例如,构建和绘制不同的ERP。

left, right = epochs["left"].average(), epochs["right"].average()# create and plot difference ERP
joint_kwargs = dict(ts_args=dict(time_unit='s'),topomap_args=dict(time_unit='s'))
mne.combine_evoked([left, -right], weights='equal').plot_joint(**joint_kwargs)
    Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EEG : ['EEG 001']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']

这是权重相等的差异。 如果试验编号不平衡,则也可以考虑使每个条件的事件数相等(使用epochs.equalize_event_counts)。 例如,首先,我们为每种情况创建单独的ERP。

aud_l = epochs["auditory", "left"].average()
aud_r = epochs["auditory", "right"].average()
vis_l = epochs["visual", "left"].average()
vis_r = epochs["visual", "right"].average()all_evokeds = [aud_l, aud_r, vis_l, vis_r]
print(all_evokeds)
"""
这可以通过Python列表理解来简化
"""all_evokeds = [epochs[cond].average() for cond in sorted(event_id.keys())]
print(all_evokeds)# 然后,我们也以这种方式构造和绘制左右试验的未加权平均值:
mne.combine_evoked([aud_l, -aud_r, vis_l, -vis_r], weights='equal').plot_joint(**joint_kwargs)
    Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EEG : ['EEG 001']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']Rejecting  epoch based on EOG : ['EOG']
[<Evoked  |  'left/auditory' (average, N=56), [-0.1998, 0.49949] sec, 59 ch, ~3.1 MB>, <Evoked  |  'left/visual' (average, N=67), [-0.1998, 0.49949] sec, 59 ch, ~3.1 MB>, <Evoked  |  'right/auditory' (average, N=62), [-0.1998, 0.49949] sec, 59 ch, ~3.1 MB>, <Evoked  |  'right/visual' (average, N=56), [-0.1998, 0.49949] sec, 59 ch, ~3.1 MB>]

通常,在字典或列表中存储诱发对象是有意义的——无论是不同的条件,还是不同的主题。

"""
如果将它们存储在一个列表中,就可以很容易地对它们求平均值,例如,跨主题(或条件)的总平均值。
"""
grand_average = mne.grand_average(all_evokeds)
mne.write_evokeds('tmp\\tmp-ave.fif', all_evokeds)# 如果“诱发对象”对象存储在词典中,则可以按名称检索它们。
all_evokeds = dict((cond, epochs[cond].average()) for cond in event_id)
print(all_evokeds['left/auditory'])# 除了显式访问外,还可以用于设置标题。
for cond in all_evokeds:all_evokeds[cond].plot_joint(title=cond, **joint_kwargs)

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

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

更多阅读

EEG公开数据集汇总

学习神经科学,发展人工智能

探索双耳助听器中的人体通信

手部的运动区域也与整个身体相连

他们想把广告植入你的梦境

EEG伪影详解和过滤工具的汇总(二)

EEG伪影类型详解和过滤工具的汇总(一)

MNE中数据结构Epoch及其创建方法

投稿通道

如何让你的工作让更多人知晓和受益?

脑机接口社区就是这样一个连接学界、

企业界和爱好者的平台渠道。

社区鼓励高校实验室、企业或个人在我们平台上分享优质内容。

稿件要求

稿件系个人原创作品,若已在其他平台发表,请明确标注。

稿件一经录取,便提供稿费!

投稿通道

微信扫码,备注:投稿+姓名+单位

微信交流群,请扫码上方微信

(备注:姓名+单位+专业/领域行业)

QQ交流群:913607986

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

脑电分析系列[MNE-Python-20]| 脑电图处理和事件相关电位(ERP)相关推荐

  1. 脑电分析系列[MNE-Python-5]| Python机器学习算法随机森林判断睡眠类型

    案例介绍 本案例通过对多导睡眠图(Polysomnography,PSG)数据进行睡眠阶段的分类来判断睡眠类型. 训练:对Alice的睡眠数据进行训练: 测试:利用训练结果对Bob的睡眠数据进行测试, ...

  2. 脑电分析系列[MNE-Python-21]| Python协方差矩阵处理脑电数据

    今天主要介绍一下MNE中如何用协方差矩阵来处理脑电数据的. MNE中的许多方法,包括源估计和一些分类算法,都需要根据记录进行协方差估计. 在本教程中,我们将介绍传感器协方差计算的基础知识,并构建一个噪 ...

  3. 脑电分析系列[MNE-Python-6]| Python读取.set文件和.locs文件

    本案例主要介绍如何读取eeglab示例文件.set以及.locs文件. .set文件记录的是采集的信息,主要内容包括通道数,事件数,开始时间与结束时间等. .locs文件记录的是电极位置信息. 知识点 ...

  4. 脑电分析系列[MNE-Python-2]| MNE中数据结构Raw及其用法简介(更新)

    Raw对象主要用来存储连续型数据,核心数据为n_channels和times,也包含Info对象. 下面可以通过几个案例来说明Raw对象和相关用法. Raw结构查看: # 引入python库 impo ...

  5. 脑电分析系列[MNE-Python-19]| 可视化Evoked数据

    在前面我们介绍过Evoked的数据结构以及如何创建Evoked对象: 脑电分析系列[MNE-Python-4]| MNE中数据结构Evoked及其对象创建 Evoked potential(EP)诱发 ...

  6. 脑电分析系列 | MNE-Python汇总

    1 脑电分析系列MNE-Python教程 [MNE-1]| MNE-Python详细安装与使用(更新) [MNE-2]| MNE中数据结构Raw及其用法简介(更新) [MNE-3]| MNE中数据结构 ...

  7. 脑电分析工具MNE教程

    资料来源:脑电分析系列 | MNE-Python汇总 目录 1.安装与使用 2.数据结构Raw 3.Epoch 4.Evoked 5.案例 (1)导入工具库 (2)加载数据 (3)测试数据 (4)提取 ...

  8. 脑电分析系列[MNE-Python-11]| 信号空间投影SSP 应用

    信号空间投影(SSP) 在前面一篇分享(脑电分析系列[MNE-Python-10]| 信号空间投影SSP数学原理)中提到,投影矩阵将根据您试图投射出的噪声种类而变化.信号空间投影(SSP)是一种通过比 ...

  9. 脑电分析系列 | eeglab汇总

    1 脑电分析系列eeglab教程 eeglab教程系列(1)-安装教程 eeglab教程系列(2)-加载.显示数据 eeglab教程系列(3)-绘制脑电头皮图 eeglab教程系列(4)-绘制通道光谱 ...

最新文章

  1. Splay ---- 区间翻转 区间最大值 区间加 P4146 序列终结者
  2. php将换行变为 p 标签,editplus 将文本换行替换为p标签
  3. linux ffmpeg加速和合并视频命令
  4. 了解mysqlpump工具
  5. 什么技能产品经理不会提,但技术人必须懂?
  6. Java动态解析域名
  7. SOA和微服务之间的区别
  8. [软技能] png-8和png-24有什么区别?
  9. oracle 中累加函数,Oracle 分析函数分组累加!
  10. GitHub 长期被中国人“霸榜”?看完榜单我呆了...
  11. CSS3 制作魔方 - 相关立体样式
  12. Qt学习笔记之Hello World
  13. Javaweb项目在线学习平台系统(Spring+SpringMVC+MyBatis)
  14. 用计算机亩换算成平方,亩换算(平方米换算亩计算器)
  15. 55-硅谷课堂1(项目概述+MyBatisPlus使用+搭建项目环境+开发讲师管理接口)
  16. list容量限制测试
  17. oracle认证071和061,别只为Oracle Database 18c的发布而兴奋了, 看一看你的Oracle认证考试到期了吗?...
  18. 01redis安装及入门(含阿里云服务器出现的问题)
  19. 微信js-sdk 微信自定义分享显示图片和描述不显示
  20. 2022年汽车驾驶员(技师)试题及在线模拟考试

热门文章

  1. (自)协方差矩阵与互协方差矩阵简介
  2. PCB如何更合理的拼版
  3. 冬令营第四天(1.21)
  4. 嵌入式ARM设计编程(三) 处理器工作模式
  5. 207:PGA Tour Prize Money
  6. 毕业设计 树莓派人脸识别系统(Python)
  7. 什么是全量数据、增量数据?如何统一一套系统?
  8. 【思考】开学第一课--大学的终结,终生学习
  9. ip r route -n
  10. 1.2折半查找法的使用