MNE预处理脑电数据

1.mne安装和导入数据

import os
import numpy as np
import pandas as pd
import mne
import matplotlib.pyplot as plt
#可交互
%matplotlib qt 
#将数据读进来
raw = mne.io.read_raw_eeglab('data/eeg/f006.set')
#raw1 = mne.io.read_raw_edf('CHB-MIT\chb-mit-scalp-eeg-database-1.0.0\chb01\chb01_01.edf')

 

#查看raw类型
type(raw)
#type(raw1)

#画一下数据图从第20秒开始,持续20秒
raw.plot(start=20,duration=20)
plt.show()

 

 2.剔除坏导

#导入数据并剔除无用channels
raw = mne.io.read_raw_eeglab('data/eeg/f006.set')
#告诉它哪个是eeg,哪个是eog
raw.set_channel_types({'VEOG':'eog'})
raw.pick(picks='all',exclude=['HEOG','EKG','EMG','Trigger']) #选出所有的导,不包括这几个,没有记录的无用数据
raw.plot(start=20,duration=1)
plt.show()

 3.裁剪片段

#找到并裁剪出我们需要的片段,比如说标记了的事件相关信号
events=mne.events_from_annotations(raw)  #将raw里面的annotation读取出来
# print(events) #
# print(events[0][:,2]) #  0索引中所有行第三列的数值
# print(events[1]['14']) # 1索引中关键字为14的值
# print( np.where(events[0][:,2] == 3)[0])  #输出值为3对应的关键字
ind = np.where(events[0][:,2] == events[1]['14'])[0].min()  
# print(ind)
start_t = events[0][ind,0] - 3000
ind = np.where(events[0][:,2] == events[1]['18'])[0].max()
end_t = events[0][ind,0] + 6500
#print(events[0][ind,0])
print(start_t,end_t)  #从start裁到end时间

#因为crop裁剪操作不可逆,先进行copy一份进行裁剪处理。
raw_cropped = raw.copy()
#把数据从min裁剪到max
raw_cropped.crop(tmin = start_t/1000,tmax = end_t/1000)  
raw_cropped.plot(start=20,duration=1)
plt.show()


#因为数据集和视频老师的不一样,所以出现错误,自己改了长短

 

#定义坏导,在图像中点击fz
raw_cropped.info['bads']

 4.定位电极

#定位电极,用坏导周围的电极来平均坏导的值
raw_cropped.set_montage('standard_1020',on_missing='warn')  #定义eeg 10-20模板   周围的四个电极在模板里找不到,位置太下了,所以就警告

5.插值坏导

#插值坏导
raw_cropped.load_data()
raw_cropped.interpolate_bads(exclude=['F11','F12','FT11','FT12'])  #对raw对象进行插值坏导
raw_cropped.plot(start=20,duration=1,n_channels=33,block=True,title='坏导插值完成,如无误请关闭窗口')
plt.show()

 6.低通滤波

#低通滤波
raw_filter = raw_ref.copy()
raw_filter.filter(l_freq=1,h_freq=None)  #只做了低通滤波
#raw_filter.notch_filter(freq=50)  #一般做一个50hz凹陷滤波,事件干扰工频干扰
raw_filter.plot_psd(fmax=60)
plt.show(block=False)
raw_filter.plot(start=20,duratioon=1,block = True,title='低通滤波完成,准备ICA,无误请关闭窗口')

7.去伪迹,跑ICA

#去伪迹,选用ICA
#先定义ica方法
ica = mne.preprocessing.ICA(n_components=10,method='picard',max_iter=800) #10个一组,训练800次
ica.fit(raw_filter) #训练
raw_filter.load_data()
ica.plot_sources(raw_filter,show_scrollbars=True,block=True,title='请选择需要除去的成分')   #主成分分析跑出来,
plt.show()  #在图中选中需要去除的成分
# print(ica)
# raw_recons = raw_filter.copy()
# raw_recons = ica.apply(raw_recons)
# raw_filter.plot(start=20,duration=1,n_channels=33,title='ICA处理前,确认请关闭')
# raw_recons.plot(start=20,duration=1,n_channels=33,title='ICA处理前,确认请关闭')
# plt.show(block=True)
#跑完ICA,画前后对比图
print(ica)
raw_recons = raw_filter.copy()
raw_recons = ica.apply(raw_recons)
raw_filter.plot(start=20,duration=1,n_channels=33,title='ICA处理前,确认请关闭')
raw_recons.plot(start=20,duration=1,n_channels=33,title='ICA处理前,确认请关闭')
plt.show(block=True)  #关闭窗口程序可以接着往下走

8.高通滤波凹陷滤波

#高通滤波与凹陷滤波
raw_recons.filter(l_freq=None,h_freq=30)
raw_recons.notch_filter(freq=50)

9.提取epochs

#提取epochs   把感兴趣的epochs提取出来
#先将标记的注提取出来,放到events里面
events = mne.events_from_annotations(raw_recons)
events  #可以看一下,events有5种注释    tupe类型 [1]有三列,时间,不用看,对应的值。
event_dic = ['pos':events[1]['20'],'neg':events[1]['22']]  #感兴趣的是正值和负值,对应的是20和22标签的值
reject_criteria = dict(eeg=100e-6) #拒绝振幅大于100uV的eeg,振幅过大。可选可不选


#raw数据是一整段,epoch就是提取的一小段一小段数据,与你感兴趣的事件相关的那一段eeg
#                    数据读进来   取array,  感兴趣的事件,  加载数据      提取事件前200毫秒到事件后1秒     振幅过大不要
epochs = mne.Epochs(raw_recons,events[0],event_id=event_dic,preload=True,tmax=1,tmin=-0.2,reject=reject_criteria)
epochs.plot(events=events[0],block=True,title='请目视挑选出来坏EPOCHES')
plt.show()  #点击坏的片段

10.平均epochs

#对每个片段平均  对pos和neg分别做平均
#先复制
pos_epochs = epochs['pos']
neg_epochs = epoch['neg']

pos_evoked = pos_epochs.average()
neg_evoked = neg_epochs.average()
neg_evoked.plot()   #最后画出 负200毫秒到1秒之间32个导的平均值,异常的为坏导
#将32个导进行平均
# 两种epoch之间的对比,取全部32个导的平均                                                                       上正下负,
mne.viz.plot_compare_evoked(dict(positive=pos_evoked,negative=neg_evooked),combine='mean',picks=np.arange(32),invert_y=True,legend=True,ci=True)

  • 3
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尽力回答你的问题。首先,MNE是一个Python库,专门用于对脑电(EEG)和磁共振成像(MRI)数据进行预处理和分析。下面是一些关于如何使用MNE库对脑电数据集进行预处理的基本步骤: 1. 导入需要的库和数据集 首先,你需要导入MNE库以及其他必要的库(如numpy和matplotlib),并且加载你要处理数据集。可以使用MNE库中的`mne.io.read_raw_xxx`函数来加载不同格式的脑电数据集,如EDF、BDF或FIF格式。例如,如果你的数据集是EDF格式,你可以使用以下代码: ``` import mne raw = mne.io.read_raw_edf('your_data.edf') ``` 2. 预处理数据集 在对数据进行分析之前,通常需要对数据进行预处理。这包括去除噪声、滤波、标准化和修剪。在MNE库中,你可以使用各种函数来执行这些预处理步骤。例如,你可以使用以下代码来滤波数据: ``` raw.filter(1, 40) # 从1到40Hz进行带通滤波 ``` 3. 检查数据 在对数据进行分析之前,你需要检查数据是否已经正确地预处理。你可以使用MNE库中的`plot`函数来绘制原始数据、滤波后的数据和事件标记。例如,你可以使用以下代码来绘制原始数据: ``` raw.plot() ``` 4. 提取事件 在脑电数据中,事件通常是指在实验中发生的特定事件,如刺激呈现或响应。你可以使用MNE库中的`find_events`函数来自动检测这些事件。例如,你可以使用以下代码来提取事件: ``` events = mne.find_events(raw) ``` 5. 剪辑数据 在对数据进行分析之前,你可能需要将数据剪辑到感兴趣的时间段内。你可以使用MNE库中的`crop`函数来剪辑数据。例如,你可以使用以下代码来剪辑数据: ``` raw.crop(tmin=0, tmax=10) # 从0秒到10秒剪辑数据 ``` 这只是对如何使用MNE库对脑电数据集进行预处理的简要介绍。如果你需要更详细的说明,请查看MNE库的文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值