专栏首页脑机接口脑信号分析系列(1)-听觉P300实验

脑信号分析系列(1)-听觉P300实验

听觉P300实验与视觉P300相似,但使用听觉刺激来产生oddball

刺激时间为200ms,时间间隔400ms,随机抖动±100ms, 任务是计算玩奇数球刺激的次数,记录单个参与者进行的6次2分钟的实验。

非目标刺激的音调约为523Hz(C5),目标刺激的音调约为1174 Hz(D6)

下面利用muse库来进行数据分析

第一步:导入相应的包

import os
import sys
from collections import OrderedDict

import pandas as pd
import numpy as np
import seaborn as sns
from matplotlib import pyplot as plt
%matplotlib inline

from eeg_utils.utils import utils as utils

import warnings
warnings.filterwarnings("ignore", category=Warning)

第二步:加载数据

subject = 1
session = 1
raw = utils.load_data('auditory/P300', sfreq=256., 
                      subject_nb=subject, session_nb=session)

查看功率谱(Power Spectrum)

raw.plot_psd(tmax=np.inf);

第三步:过滤

过滤掉1到30Hz之间的数据

raw.filter(1, 30, method='iir')

Epoching

我们在刺激之后将数据从-100ms缩短到800ms,无需进行基线校正(信号经过带通滤波),并且在信号超过75uV时,我们拒绝每个epochs,主要是拒绝眨眼。

from mne import Epochs, find_events

events = find_events(raw)
event_id = {'Non-Target': 1, 'Target': 2}

epochs = Epochs(raw, events=events, event_id=event_id, 
                tmin=-0.1, tmax=0.8, baseline=None,
                reject={'eeg': 75e-6}, preload=True, 
                verbose=False, picks=[0,1,2,3]

Epoch average

我们绘制两种情况下的平均ERP

conditions = OrderedDict()
conditions['Non-target'] = [1]
conditions['Target'] = [2]

fig, ax = utils.plot_conditions(epochs, conditions=conditions, 
                                ci=97.5, n_boot=1000, title='',
                                diff_waveform=(1, 2))

在两种情况下都可以看到清晰的P300

解码

通过上述的平均epochs,可以很清楚识别ERP。 但如何了解有关P300的SNR的任何信息,可以通过分类管道(classification pipline)了解P300响应的强度。

下面我们将使用4个不同的管道。

Vect+RL: 实验矢量化+Logistic回归。可以将其视为MEG/EEG中的标准解码管道。

Vect+RegLDA:实验矢量化+正则化LDA.P300 BCI中经常利用这一点,但维数过多,则可能无法使用。

ERPCov+MDM: ERP协方差+MDM.黎曼几何分类器,一种简单有效的方法(用于较少的通道数)

ERPCov+TS: ERP协方差+切线空间映射。这是一种基于黎曼几何的管道之一。

以AUC作为度量,以交叉验证的方式进行评估(AUC可能是针对二进制和非平衡分类问题的最佳度量标准)

from sklearn.pipeline import make_pipeline

from mne.decoding import Vectorizer

from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA

from sklearn.model_selection import cross_val_score, StratifiedShuffleSplit

from pyriemann.estimation import ERPCovariances, XdawnCovariances
from pyriemann.tangentspace import TangentSpace
from pyriemann.classification import MDM


clfs = OrderedDict()

clfs['Vect + LR'] = make_pipeline(Vectorizer(), StandardScaler(), LogisticRegression())
clfs['Vect + RegLDA'] = make_pipeline(Vectorizer(), LDA(shrinkage='auto', solver='eigen'))
clfs['ERPCov + TS'] = make_pipeline(ERPCovariances(estimator='oas'), TangentSpace(), LogisticRegression())
clfs['ERPCov + MDM'] = make_pipeline(ERPCovariances(estimator='oas'), MDM())
clfs['XdawnCov + TS'] = make_pipeline(XdawnCovariances(estimator='oas'), TangentSpace(), LogisticRegression())
clfs['XdawnCov + MDM'] = make_pipeline(XdawnCovariances(estimator='oas'), MDM())

# format data
epochs.pick_types(eeg=True)
X = epochs.get_data() * 1e6
times = epochs.times
y = epochs.events[:, -1]

# 定义交叉验证
cv = StratifiedShuffleSplit(n_splits=20, test_size=0.25, 
                            random_state=42)

# 对每个管道(pipeline)运行交叉验证
auc = []
methods = []
for m in clfs:
    try:
        res = cross_val_score(clfs[m], X, y==2, scoring='roc_auc', 
                              cv=cv, n_jobs=-1)
        auc.extend(res)
        methods.extend([m]*len(res))
    except:
        pass
    
results = pd.DataFrame(data=auc, columns=['AUC'])
results['Method'] = methods
fig = plt.figure(figsize=[8,4])
sns.barplot(data=results, x='AUC', y='Method')
plt.xlim(0.4, 0.75)
sns.despine()

本文分享自微信公众号 - 脑机接口社区(Brain_Computer),作者:Brain-Computer

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • CCA典型关联分析原理与Python案例

    Rose小哥今天分享一下CCA的相关原理以及Python应用,CCA在EEG等脑电数据的特征提取中使用很多,很有必要熟悉其原理。

    脑机接口社区
  • 脑机接口让脊髓损伤患者重新获得手部触觉

    对于正常人来说触觉是最理所当然的能力,但那些脊髓损伤或脊髓疾病导致的瘫痪者要想恢复肢体功能,却必须经过重建触觉这一步。

    脑机接口社区
  • 为什么要学会用python处理脑电数据?

    可以说随着人工智能技术的发展,Python语言也迎来了新的生机。由于Python易上手,语法简洁,工具库多等特点,Python已成为人工智能领域最流行的语言。

    脑机接口社区
  • Django-admin配置和显示图标

    添加完之后重启项目; 如未显示,请检查文件路径是否正确。 如果还没有显示,请在setting.py中加入以下代码:

    kirin
  • react-router-config的使用

    上篇文章我们介绍了在react中如何使用路由,但是随着项目的增大,路由会越来越多,这就需要我们进行集中管理,我们可以自己写脚本,也可以使用react-route...

    挥刀北上
  • Python 进阶(四):数据库操作之 MySQL

    MySQL 是目前使用最广泛的数据库之一,它有着良好的性能,能够跨平台,支持分布式,能够承受高并发。如果还没有安装 MySQL,下载地址:https://dev...

    Python小二
  • react仿微信即时IM聊天|react+redux仿微信界面

    基于react+react-dom+react-router-dom+redux+react-redux+ant等技术开发的手机端仿微信界面聊天,实现了聊天记录...

    andy2018
  • 【React】:路由(Routing)

    Vue 路由库:Vue Router https://router.vuejs.org/zh/ iview-admin 对路由的管理: https://li...

    WEBJ2EE
  • Basemap系列教程:自定义colormap

    matplotlib colormap非常强大,比其他软件要更好用 [注1],但是相当难理解。大多数时候,可以使用颜色列表创建 colormap:

    bugsuse
  • 深入解剖SDTM-Define.XML

    本文小编将为大家分享并讲解SDTM标准define.xml的内部构造及参数介绍。以便大家制作SDTM的define.xml或参照define.xml制作适合自己...

    Setup

扫码关注云+社区

领取腾讯云代金券