当前位置:   article > 正文

脑电分析系列[MNE-Python-2]| MNE中数据结构Epoch及其创建方法

.fif脑电信号文件

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。

  1. import mne
  2. from mne import io
  3. from mne.datasets import sample
  4. data_path = sample.data_path()
  5. raw_fname = data_path + '/MEG/sample/sample_audvis_filt-0-40_raw.fif'
  6. event_fname = data_path + '/MEG/sample/sample_audvis_filt-0-40_raw-eve.fif'
  7. event_id, tmin, tmax = 1, -0.2, 0.5
  8. # 读取fif文件,创建raw对象
  9. raw = io.read_raw_fif(raw_fname)
  10. # 读取包含event的fif文件,创建event对象
  11. events = mne.read_events(event_fname)
  12. """
  13. 挑选通道:EEG + MEG - bad channels
  14. """
  15. raw.info['bads'] += ['MEG 2443', 'EEG 053'] # bads + 2 more
  16. picks = mne.pick_types(raw.info, meg=True, eeg=False, stim=True, eog=True,
  17. exclude='bads')
  18. # 读取Epoch数据
  19. epochs = mne.Epochs(raw, events, event_id, tmin, tmax, proj=True,
  20. picks=picks, baseline=(None, 0), preload=True,
  21. reject=dict(grad=4000e-13, mag=4e-12, eog=150e-6))
  22. """
  23. 对epochs数据进行求平均获取诱发响应
  24. """
  25. evoked = epochs.average()
  26. evoked.plot(time_unit='s')
  27. plt.show()
  1. Read a total of 4 projection items:
  2. PCA-v1 (1 x 102) idle
  3. PCA-v2 (1 x 102) idle
  4. PCA-v3 (1 x 102) idle
  5. Average EEG reference (1 x 60) idle
  6. Range : 6450 ... 48149 = 42.956 ... 320.665 secs
  7. Ready.
  8. Current compensation grade : 0
  9. 72 matching events found
  10. Applying baseline correction (mode: mean)
  11. Not setting metadata
  12. Created an SSP operator (subspace dimension = 3)
  13. 4 projection items activated
  14. Loading data for 72 events and 106 original time points ...
  15. Rejecting epoch based on EOG : ['EOG 061']
  16. Rejecting epoch based on EOG : ['EOG 061']
  17. Rejecting epoch based on EOG : ['EOG 061']
  18. Rejecting epoch based on EOG : ['EOG 061']
  19. Rejecting epoch based on EOG : ['EOG 061']
  20. Rejecting epoch based on MAG : ['MEG 1711']
  21. Rejecting epoch based on EOG : ['EOG 061']
  22. Rejecting epoch based on EOG : ['EOG 061']
  23. Rejecting epoch based on EOG : ['EOG 061']
  24. Rejecting epoch based on EOG : ['EOG 061']
  25. Rejecting epoch based on EOG : ['EOG 061']
  26. Rejecting epoch based on EOG : ['EOG 061']
  27. Rejecting epoch based on EOG : ['EOG 061']
  28. Rejecting epoch based on EOG : ['EOG 061']
  29. Rejecting epoch based on EOG : ['EOG 061']
  30. Rejecting epoch based on EOG : ['EOG 061']
  31. Rejecting epoch based on EOG : ['EOG 061']
  32. 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

  1. import mne
  2. import numpy as np
  3. import matplotlib.pyplot as plt

‍第一步:构建数据

构建一个大小为10x5x200的三维数组,数组中数据是随机数;

第一维数据表示:10 epochs

第二维数据表示:5 channels

第三维数据表示:2 seconds per epoch

  1. # 采样频率
  2. sfreq = 100
  3. data = np.random.randn(10, 5, sfreq * 2)
  4. # 创建一个info结构
  5. info = mne.create_info(
  6. ch_names=['MEG1', 'MEG2', 'EEG1', 'EEG2', 'EOG'],
  7. ch_types=['grad', 'grad', 'eeg', 'eeg', 'eog'],
  8. sfreq=sfreq
  9. )

第二步:构建events

在创建Epochs对象时,必须提供一个"events"数组,

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

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

设置事件的id

如果是dict,则以后可以使用这些键访问关联的事件。示例:dict(听觉=1,视觉=3)

如果是int,将创建一个id为string的dict。

如果是列表,则使用列表中指定ID的所有事件。

如果没有,则所有事件都将与一起使用,并使用与事件id整数对应的字符串整数名称创建dict。

  1. # 创建event id,受试者或者微笑或者皱眉
  2. event_id = dict(smiling=1, frowning=2)
  3. """
  4. tmin:event开始前的时间,如果未指定,则默认为0
  5. """
  6. # 设置事件开始前时间为-0.1s
  7. tmin = -0.1

第三步:创建epochs对象

  1. """
  2. 利用mne.EpochsArray创建epochs对象
  3. """
  4. custom_epochs = mne.EpochsArray(data, info, events, tmin, event_id)
  5. print(custom_epochs)
  6. # 绘制
  7. _ = custom_epochs['smiling'].average().plot(time_unit='s')

案例2

  1. import numpy as np
  2. import neo
  3. import mne
  4. import matplotlib.pyplot as plt
  5. """
  6. 设置event id,用来识别events.
  7. """
  8. event_id = 1
  9. # 第一列表示样本编号
  10. events = np.array([[200, 0, event_id],
  11. [1200, 0, event_id],
  12. [2000, 0, event_id]]) # List of three arbitrary events
  13. sfreq = 1000 # 采样频率
  14. times = np.arange(0, 10, 0.001) # Use 10000 samples (10s)
  15. sin = np.sin(times * 10) # 乘以 10 缩短周期
  16. cos = np.cos(times * 10)
  17. """
  18. 利用sin和cos创建一个2个通道的700 ms epochs的数据集
  19. 只要是(n_epochs, n_channels, n_times)形状的数据,都可以被用来创建
  20. """
  21. epochs_data = np.array([[sin[:700], cos[:700]],
  22. [sin[1000:1700], cos[1000:1700]],
  23. [sin[1800:2500], cos[1800:2500]]])
  24. ch_names = ['sin', 'cos']
  25. ch_types = ['mag', 'mag']
  26. info = mne.create_info(ch_names=ch_names, sfreq=sfreq, ch_types=ch_types)
  27. epochs = mne.EpochsArray(epochs_data, info=info, events=events,
  28. event_id={'arbitrary': 1})
  29. epochs.plot(scalings='auto' )
  30. plt.show()

编译作者:BrainLover编译

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

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

更多阅读

[MNE-Python-1]| MNE-Python详细安装与使用

[MNE-Python-2]| MNE中数据结构Raw及其用法简介

Nature子刊:利用闭环脑机接口缓解疼痛感

脑-脑接口:人类大脑利用意念控制老鼠走迷宫

投稿通道

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

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

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

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

稿件要求

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

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

投稿通道

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

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

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

QQ交流群:913607986

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/261809?site
推荐阅读
相关标签
  

闽ICP备14008679号