资料来源:脑电分析系列 | MNE-Python汇总

目录

1.安装与使用

2.数据结构Raw

3.Epoch

4.Evoked

5.案例

(1)导入工具库

(2)加载数据

(3)测试数据

(4)提取脑电图特征

(5)预测

6.读取.set和.locs文件

7.读取.edf文件

8.参考电极及应用

9.信号空间投影SSP

10.连续注释

11.Epoch及其可视化

12.信号滤波


1.安装与使用

在windows系统下,基于Anaconda安装MNE-python。具体步骤见资料,此处不予展示。

2.数据结构Raw

Raw对象用于存储连续型数据,核心数据为n_channels和times,raw.info中还包括ch_names,chs等。

通常raw的数据访问方式如下:

data, times = raw[picks, time_slice]

其中picks是根据条件挑选出来的索引,time_slice是时间切片(可以控制EEG数据时间段大小)。若需访问raw中所有数据,代码如下:

data,times=raw[:]

data,times=raw[:,:]

代码示例如下:

# 根据type选择良好的信号
# 设置获取信号时间范围
picks = mne.pick_types(raw.info, meg=True, exclude='bads')
t_idx = raw.time_as_index([10., 20.])
data, times = raw[picks, t_idx[0]:t_idx[1]]
plt.plot(times,data.T)
plt.title("Sample channels")# 设置采样频率:sfreq
# raw返回所选信道以及时间段内的数据和时间点,
sfreq=raw.info['sfreq']
data,times=raw[:5,int(sfreq*1):int(sfreq*3)]
plt.plot(times,data.T)
plt.title("Sample channels")# 绘制各通道功率谱密度
raw.plot_psd()
plt.show()# 绘制SSP矢量图
raw.plot_projs_topomap()
plt.show()# 绘制通道频谱图
raw.plot_psd_topo()
plt.show()# 绘制电极位置
raw.plot_sensors()
plt.show()

3.Epoch

Epoch:从连续的脑电图信号中提取一些特定时间窗口的信号

举例:假设我们有一个长度为60s的信号x,采样频率为1 Hz。
脑电信号的矩阵表示为1x60矩阵,如果将信号划分成一些2s的信号,则将有30个peoch(信号中每2s就是一个epoch)

4.Evoked

Evoked potential(EP)诱发电位或诱发反应是指在出现诸如闪光或纯音之类的刺激后,从人类或其他动物的神经系统,特别是大脑的特定部分记录的特定模式的电位。不同形式和类型的刺激会产生不同类型的电位。

5.案例

(1)导入工具库

import numpy as np
import matplotlib.pyplot as pltimport mne
from mne.datasets.sleep_physionet.age import fetch_data    # 获取EEG数据
from mne.time_frequency import psd_welch                   from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import FunctionTransformer

(2)加载数据

PSG.edf包含多导睡眠图。来自EEG头盔的原始数据,Hypnogram.edf包含专家记录的注释。将这两个对象合并到mne.io.Raw对象中,就可以根据注释的描述提取事件以获得时间片段(epochs)。

"""
可以通过
mne.datasets.sleep_physionet.age.fetch_data(subjects,recording,path)
来获取PhysioNet多导睡眠图数据集文件。
subjects:表示想要使用哪些受试者对象,可供选择的受试者对象范围为0-19。
recording:表示夜间记录的编号(索引),有效值为:[1]、[2]或[1、2]。path:PhysioNet数据的存放地址,如果没有给定,则加载默认存放数据的地址;
如果默认存放数据集的地址不存在数据,则从网络中下载相关数据。
"""
# 选择两个受试者实验对象ALICE, BOB(该名字并非实验中的真实名,这里是为了方便才临时取的名字)
ALICE, BOB = 0, 1
# 加载ALICE, BOB的实验数据文件
[alice_files, bob_files] = fetch_data(subjects=[ALICE, BOB], recording=[1])# 通道名称映射
mapping = {'EOG horizontal': 'eog','Resp oro-nasal': 'misc','EMG submental': 'misc','Temp rectal': 'misc','Event marker': 'misc'}#读取ALICE的edf文件,和其对应的注释文件
raw_train = mne.io.read_raw_edf(alice_files[0])
annot_train = mne.read_annotations(alice_files[1])raw_train.set_annotations(annot_train, emit_warning=False)
raw_train.set_channel_types(mapping)# 绘制空0s开始,时间窗口长度为40s的连续通道数据波形图
raw_train.plot(duration=40, scalings='auto')
plt.show()

这里仅使用5个阶段:唤醒(W),阶段1,阶段2,阶段3/4和REM睡眠(R)。 为此,这里使用mne.events_from_annotations()中的event_id参数来选择我们感兴趣的事件,并将事件标识符与每个事件相关联。

annotation_desc_2_event_id = {'Sleep stage W': 1,'Sleep stage 1': 2,'Sleep stage 2': 3,'Sleep stage 3': 4,'Sleep stage 4': 4,'Sleep stage R': 5}events_train, _ = mne.events_from_annotations(raw_train, event_id=annotation_desc_2_event_id, chunk_duration=30.)# 创建一个新的event_id以统一 阶段3和4
event_id = {'Sleep stage W': 1,'Sleep stage 1': 2,'Sleep stage 2': 3,'Sleep stage 3/4': 4,'Sleep stage R': 5}# 绘制事件数据
mne.viz.plot_events(events_train, event_id=event_id,sfreq=raw_train.info['sfreq'])# 保留颜色代码以便进一步绘制
stage_colors = plt.rcParams['axes.prop_cycle'].by_key()['color']

根据注释中的事件从数据创建epochs(时间片段)

tmax = 30. - 1. / raw_train.info['sfreq']  # tmax in included
"""
所创建的是时间从tmin=0开始,到tmax为止的epochs
"""
epochs_train = mne.Epochs(raw=raw_train, events=events_train,event_id=event_id, tmin=0., tmax=tmax, baseline=None)print(epochs_train)

(3)测试数据

raw_test = mne.io.read_raw_edf(bob_files[0])
annot_test = mne.read_annotations(bob_files[1])
raw_test.set_annotations(annot_test, emit_warning=False)
raw_test.set_channel_types(mapping)
events_test, _ = mne.events_from_annotations(raw_test, event_id=annotation_desc_2_event_id, chunk_duration=30.)
epochs_test = mne.Epochs(raw=raw_test, events=events_test, event_id=event_id,tmin=0., tmax=tmax, baseline=None)print(epochs_test)

使用特征工程,PSD

fig, (ax1, ax2) = plt.subplots(ncols=2)# iterate over the subjects
stages = sorted(event_id.keys())
for ax, title, epochs in zip([ax1, ax2],['Alice', 'Bob'],[epochs_train, epochs_test]):for stage, color in zip(stages, stage_colors):epochs[stage].plot_psd(area_mode=None, color=color, ax=ax,fmin=0.1, fmax=20., show=False,average=True, spatial_colors=False)ax.set(title=title, xlabel='Frequency (Hz)')
ax2.set(ylabel='uV^2/hz (dB)')
ax2.legend(ax2.lines[2::3], stages)
plt.tight_layout()
plt.show()

(4)提取脑电图特征

def eeg_power_band(epochs):"""脑电相对功率带特征提取该函数接受一个""mne.Epochs"对象,并基于与scikit-learn兼容的特定频带中的相对功率创建EEG特征。Parameters----------epochs : EpochsThe data.Returns-------X : numpy array of shape [n_samples, 5]Transformed data."""# 特定频带FREQ_BANDS = {"delta": [0.5, 4.5],"theta": [4.5, 8.5],"alpha": [8.5, 11.5],"sigma": [11.5, 15.5],"beta": [15.5, 30]}psds, freqs = psd_welch(epochs, picks='eeg', fmin=0.5, fmax=30.)# 归一化 PSDspsds /= np.sum(psds, axis=-1, keepdims=True)X = []for fmin, fmax in FREQ_BANDS.values():psds_band = psds[:, :, (freqs >= fmin) & (freqs < fmax)].mean(axis=-1)X.append(psds_band.reshape(len(psds), -1))return np.concatenate(X, axis=1)

(5)预测

使用scikit-learn进行多分类

pipe = make_pipeline(FunctionTransformer(eeg_power_band, validate=False),RandomForestClassifier(n_estimators=100, random_state=42))
# 训练
y_train = epochs_train.events[:, 2]
pipe.fit(epochs_train, y_train)# 预测
y_pred = pipe.predict(epochs_test)# 评估准确率
y_test = epochs_test.events[:, 2]
acc = accuracy_score(y_test, y_pred)print("Accuracy score: {}".format(acc))
print(classification_report(y_test, y_pred, target_names=event_id.keys()))

6.读取.set和.locs文件

见资料

7.读取.edf文件

mne.io.read_raw_edf(input_fname,  # 文件存放地址                eog=None,     #通道名称或应指定为EOG通道的索引列表。值应对应于文件中的电极。 misc=None,    #通道名称或应指定为MISC通道的索引列表。值应对应于文件中的电极。      stim_channel='auto',                    exclude=(),        #要排除的频道名称。
     preload=False)     #预加载

代码例程:

# 导入工具库
from mne.io import concatenate_raws, read_raw_edf
import matplotlib.pyplot as plt
import mne# 加载EDF文件
raw=read_raw_edf("Affaf Ikram 20121020 1839.L1.edf",preload=False)# 获取原始数据中的事件
events_from_annot, event_dict = mne.events_from_annotations(raw)
print(event_dict)
print(events_from_annot)# 获取对应事件
custom_mapping = {'stm+':5, 'stm-': 6}
(events_from_annot,event_dict) = mne.events_from_annotations(raw, event_id=custom_mapping)
print(event_dict)
print(events_from_annot)# 绘制事件图
fig = mne.viz.plot_events(events_from_annot, sfreq=raw.info['sfreq'],first_samp=raw.first_samp, event_id=event_dict)
fig.subplots_adjust(right=0.7)
epochs = mne.Epochs(raw, events=events_from_annot, event_id=event_dict)epochs.plot_image()# 获取采样频率
data,times=raw[:3,int(sfreq*1):int(sfreq*3)]
plt.plot(times,data.T)
plt.title("Sample channels")

8.参考电极及应用

见资料

9.信号空间投影SSP

见资料

10.连续注释

见资料

11.Epoch及其可视化

见资料

12.信号滤波

# 陷波
import numpy as np
import mne
from mne.datasets import sampledata_path = sample.data_path()
raw_fname = data_path + '/MEG/sample/sample_audvis_raw.fif'
proj_fname = data_path + '/MEG/sample/sample_audvis_eog_proj.fif'"""
提取0秒到20秒之间的数据
"""
tmin, tmax = 0, 20"""
读取原始数据
通过在加载前剪切原始数据来节省内存
"""
raw = mne.io.read_raw_fif(raw_fname)
raw.crop(tmin, tmax).load_data()
raw.info['bads'] = ['MEG 2443', 'EEG 053']  # bads + 2 more"""
设置 频率在2Hz到300Hz之间
"""
fmin, fmax = 2, 300
"""
FFT大小为n_fft,在理想情况下为2的幂
"""
n_fft = 2048# 选择一通道的子集
selection = mne.read_selection('Left-temporal')
picks = mne.pick_types(raw.info, meg='mag', eeg=False, eog=False,stim=False, exclude='bads', selection=selection)
raw.plot_psd(area_mode='range', tmax=10.0, picks=picks, average=False)# 陷波
raw.notch_filter(np.arange(60, 241, 60), picks=picks, fir_design='firwin')
raw.plot_psd(area_mode='range', tmax=10.0, picks=picks, average=False)# 50hz以下的低通滤波
raw.filter(None, 50., fir_design='firwin')
raw.plot_psd(area_mode='range', tmax=10.0, picks=picks, average=False)# 高通滤波
raw.filter(1., None, fir_design='firwin')
raw.plot_psd(area_mode='range', tmax=10.0, picks=picks, average=False)# 1 Hz-50 Hz范围内的带通滤波
raw.filter(1, 50., fir_design='firwin')
raw.plot_psd(area_mode='range', tmax=10.0, picks=picks, average=False)

脑电分析工具MNE教程相关推荐

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

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

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

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

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

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

  4. 脑电分析mne库函数compute_psd()记录

    在进行脑电分析的学习时对compute_psd这个函数有所疑惑,故作此文记录 import numpy as np import mnesample_data_folder = mne.dataset ...

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

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

  6. 脑电数据分析工具汇总

    EEGLAB教程目录 安装篇:eeglab在MATLAB中安装教程 第一篇:eeglab教程系列(1)-加载.显示数据 第二篇:eeglab教程系列(2)-绘制脑电头皮图 第三篇:eeglab教程系列 ...

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

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

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

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

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

    Epoch概念简介 相信很多人第一次接触epoch时,都会有疑惑,这个词在EEG中到底指的是什么. 下面将详细说明一下. 从连续的脑电图信号中提取一些特定时间窗口的信号,这些时间窗口可以称作为epoc ...

最新文章

  1. 人工智能产业化之路何去何从?清华博士、一流科技CEO在线分享,快来报名 | 量子位·视点...
  2. 如何“主动出击”提升网站的收录速度?
  3. MFC文件打开格式,MFC默认打开文档后缀(支持打开多图像格式)
  4. jenkins无法安装插件问题
  5. MSP430F149的ADC12应用
  6. 急救模式下安装rpm包
  7. python 文本向量化_TFIDF向量化文档时出现问题?
  8. Java基础-Java语言简介
  9. 企业产品互联网推广的有效方法
  10. Debian vmtools安装后 不能复制粘贴文件
  11. 用python画笛卡尔心形线_05.总是套路得人心,如何用数学+Python示爱!
  12. netopeer-manager手册翻译
  13. jupyter添加标题、文字注释;
  14. FPGA数字信号处理(二)并行FIR滤波器Verilog设计
  15. [SCOI 2016]幸运数字
  16. 视频教程-C语言项目开发系列视频课程-C/C++
  17. 利用声音传感器控制led灯功能_树莓派.利用声音传感器制作声控灯
  18. 基于opencv的视频融合
  19. Python-读取文件夹里Excel文件里的数据
  20. COOX基础培训之AM

热门文章

  1. 计算机课英语谐音,各科老师“谐音梗”大集合,英语课现“脏话”,数学化身段子手...
  2. 【土旦】vue 解决ios H5底部输入框 获取焦点时弹出虚拟键盘挡住输入框 以及监听键盘收起事件...
  3. 我如何启动任何.NET Core Web API项目
  4. 乱码问题-Quoted-printable编码
  5. Quoted-printable
  6. 第九篇:稳定性之面向失败设计【可用性架构设计、可用性容灾】
  7. [区块链安全-Ethernaut]附加GoodSamaritan解题思路
  8. 理想主义者与现实主义者的差别
  9. 分享史上Java最牛逼,最简短的代码
  10. 什么是ACL访问控制列表?它们的匹配机制是什么?