脑电图(Electroencephalogram,EEG)是通过精密的电子仪器,从头皮上将脑部的自发性生物电位加以放大记录而获得的图形,同时具有极高的时间分辨率。EEGLAB和ERPLAB常被用来处理脑电数据,因其操作方便且免费。

用EEGLAB和ERPLAB提取ERP成分的同学都知道,Extract epochs或Extract bin-based epochs的方法可以锁定感兴趣的事件诱发的时刻,对后续进行ICA分析、叠加平均有利。但它对事件码的依赖很高。比如关键的事件码丢失了,将无法识别潜在的有效的试次,会影响叠加平均的有效试次数,降低信噪比。不愿透露姓名的线轻收集了一个被试的任务态脑电数据,预处理时发现某类事件码丢失了1/6(300余个码)。丢码可能导致数据质量(信噪比)下降,让人难以忍受,尽管它不足以使整个数据无效。早前听说了融合行为数据处理事件码,但没有真正实践过,不知效果如何。为了“拯救”自己的第一个脑电数据,我开始摸索这种方法,结果收获蛮多的,下面跟大家分享一下这个过程。1.检查事件码是否丢失首先,利用EEGLAB将数据文件导入MATLAB,得到图1内容。在EEGLAB界面可以看到这段脑电数据的基本信息,由于我已经知道这些信息来自MATLAB中暂存的数据,所以我在右边的工作区的EEG中寻找它其他的详细信息。图1:将EEG数据导入MATLAB1.1.查看EEG数据内容从图1可以看出EEG是个1×1struct(结构体),别看只是1×1,它包含了大量的数据。细心的同学会发现这些字段大多是空值[](图2),它们大概是为EEGLAB后续分析EEG数据而存在的,我们暂时可以不用管它们的含义。

图2:EEG数据

图3:存放电压幅值、时间戳和事件码的字段在非空的字段里,我们可以看到times和data含有大量的数据。从名字和数据的长度来看,它们分别是EEG记录的时间长度和在各个电极点对应的电压幅值。1.2.查看与事件码相关的字段接下来可以看到event和urevent,它们是结构体。双击event可以发现它存放了3列信息(图4):事件码(type)、对应的潜伏期(latency,它表示该事件码发生时,距脑电系统开始记录脑电幅值的时间长度,单位是毫秒)和序号(urevent)。图4:EEG.event时间精确到毫秒级是脑电数据的核心特点之一,所以EEG.event是脑电数据里非常重要的数据。EEG.event的数据可直接复制到EXCEL,然后用数据透视表的方式计算每类事件的次数。下图(5)展示了记录到的事件次数和实验事先设定好的次数。图5:记录到的事件数和事先设定的事件数比较经过比较发现,322个事件码{1}丢失了,而{2,3}比设定的次数多,另外还出现了没有设定的码{5,7}。1.3.此实验的流程和事件码设置为了让大家了解本实验事件码的设置,用下图(6)展示本次实验的一个Trial流程。图片描述事件码出现的类型、时刻、次数和打入方式。在每个试次开始时,用Writeport的方法打{1,2,3}中的一个。

接着用OnsetSignalData的方法在控件Stim处打{11,12,21,22,31,32,33,34,35}等9个码中的一个。

在700~1000ms之后,用Writeport的方法打{1}。

随后用OnsetSignalData的方法在控件StandardStim处打{11,22,31,32,33,34,35}等7个码中的一个。

在700~1000ms后,结束一个试次。

反应码{4,6}由被试按键触发,用Writeport的方法打入,它可能出现在某个inline语句结束的时刻。图6:一个试次的E-prime流程从流程图来看,很可能事件码{1}是被反应码挤掉了。比如下图(图7)中第16个码开始,依设定的顺序,应该是{6}{1}{11}{1}{11}{1}...,而{11}前的第一个事件{1}丢失了,变成{6}{11}{1}{11}{1}...。检查其他位置的{4}或{6}或{7},都存在这样的情况。因此猜测是事件码{1}被反应码或者错码替代了。

图7检查自己的E-prime程序,发现在每个Trial开始前,我应该用writeport &378,0将打码端口清零?还好我们能用行为数据处理事件码,不至于损失惨重。

2.提取行为数据在本例EEG数据中,{11,12,21,22,31,32,33,34,35}等9个码没有发生丢码。它们是依赖控件(Stim或StandardStim)的Onset产生的码,在潜伏期上与控件的onset时间是同步的。因此,我们可以用控件的Onset时间代表事件码发生的行为潜伏期,与事件码的EEG潜伏期匹配。2.1.如果事件码的EEG潜伏期与行为潜伏期匹配上,会有什么结果?行为数据中,以OnsetTime结尾的变量表示控件Onset时的潜伏期(距离实验程序进入第一个控件时的时长),精确到毫秒。图8EEG时间数据和行为时间数据既然都精确到毫秒,按理讲,EEG事件码的潜伏期与控件Onset的潜伏期的差值应该为某个稳定的值。这个值应该存在下图中描述的规律。

图9因此我们可以找到匹配的事件码并查看它们的EEG潜伏期和行为潜伏期的差值是否为某个稳定的值。由于实验前欠缺考虑,程序里没有设置记录Stim和StandardStim控件的Onset时间,但记录了Wait1.OnsetTime。从流程图(图6)可以看出,Wait1.OnsetTime与Stim.OnsetTime的时间是很接近的,理论上只相差一帧11ms左右(此设备刷新率为85Hz)。因此可以用Wait1.OnsetTime代替Stim.OnsetTime,与事件码的潜伏期做减法,查看结果是否为某个稳定的值。本实验中,行为数据在E-prime程序运行之后产生的E-DataAid file。

图10.实验结束后产生的数据文件

我们需要将E-DataAid文件转化为EXCEL数据并提取其中的:FixMark、EmoMark、EmoMark2、Wait1.OnsetTime、反应时间等数据。

这里,我们用Wait1.OnsetTime表示EmoMark的行为潜伏期,而EmoMark2由于没有记录到其行为潜伏期,所以无法予以匹配EEG潜伏期(详见下文结果)。

由于我的EEG数据是从正式实验开始记录的,所以行为数据需要剔除练习的行数据(顺便把休息阶段的行数据剔除)。得到几列数据为:

图11:EmoMark和EmoMark2对应图6中Stim和StandardStim开始时的事件码;可用Wait1.OnsetTime代替Stim.OnsetTime,表示EmoMark的行为潜伏期。

3.匹配EEG事件码潜伏期和行为数据潜伏期

在后续分析中,我们对{11,12,21,22,31,32,33,34,35}等9个码发生后的ERP成分感兴趣。它们是以OnsetSignalData的方式打入的,在行为数据中有潜伏期数据。所以我们以这些码为对象,尝试EEG潜伏期和行为潜伏期的匹配。3.1.提取EEG数据中感兴趣的事件码

首先,在EEGLAB界面导入此被试的EEG数据。

图12然后,利用MATLAB脚本代码提取EEG数据中的事件码数据。%提取EEG事件码数据ureventData = EEG.urevent;eventData = EEG.event;

设置感兴趣的事件码。%设置感兴趣的事件码。Mark=[11 12 21 22 31 32 33 34 35];找出上述事件码在EEG事件码数据中的位置。Loc1=logical(zeros(1,length(ureventData)));%建立逻辑型空向量Loc =logical(zeros(1,length(ureventData)));%建立逻辑型空向量for i=1:length(Mark)%判断事件码在数据中的位置Loc1=[ureventData(:).type]==Mark(i);%判断存在事件码的位置Loc=Loc|Loc1;                       %或然关系,表示该位置存在一个事件码end将感兴趣的事件码从EEG事件码数据中提取出来,并命名为MarkData。%将感兴趣的事件码从EEG事件码数据中提取出来。EEGMark = find(Loc);for i=1:length(EEGMark)MarkData(i).type=[ureventData(EEGMark(i)).type];MarkData(i).latency=[ureventData(EEGMark(i)).latency];end从EEG.event中提取了感兴趣的事件码数据,其中有2160行数据,有2160个感兴趣的事件码:

图133.2.将2.中的行为数据导入MATLAB用xlsread函数读取指定位置的EXCEL文件[BehaviorData,~,Raw]=xlsread('D:\2018.04-2021.07Postgraduate\11-biye\XQEMMN\data\Sub1\Sub1Behavior.xlsx');

得到BehaviorData和Raw两组数据,后者是含标题的数据。

图14

3.3.将事件码的EEG潜伏期和行为潜伏期按顺序排列利用MATLAB脚本代码将行为数据搬到MarkData中,它实现数据搬家的功能,如图15展示。TypeDif=0;%建立字段用于储存事件码的差异for i=1:length(MarkData)k=floor((i+1)/2); %行为数据的第k行数据放到Mark数据的第i行j=2-mod(i,2);MarkData(i).BehType=BehaviorData(k,j); %行为数据的第1列数据放到Type列单数行,第2列数据放到Type列双数行。MarkData(i).BehLatency=(1+(-1)^(j+1))/2*BehaviorData(k,4); %行为数据的第4列数据放到Latency列单数行,第5列数据放到Latency列双数行。MarkData(i).LatencyDif=(1+(-1)^(j+1))/2*(MarkData(i).BehLatency-MarkData(i).latency);%计算时间戳的差异MarkData(i).TypeDif= MarkData(i).type-MarkData(i).BehType;  %判断事件码是否有差异TypeDif = TypeDif + abs(MarkData(i).TypeDif); %计算事件码的差异end

得到新的MarkData:

图153.4.检查代码运行的结果是否符合预期在MarkData中(图15左),LatencyDif计算了EEG事件码的潜伏期和行为潜伏期的差值,发现是一个相对稳定的值,即42150毫秒,表明脑电数据是在实验程序开始42150毫秒(42.15秒)后开始记录的;在实验的最后阶段,差值变为42154毫秒左右,表明误差还是很稳定的。

图16

另一方面,我们在上述代码中用TypeDif记录了事件码的差值,结果TypeDif得到全为0,表明EEG事件码和行为数据是匹配的。

3.5.用行为数据复原事件码的EEG潜伏期的条件根据上述的结果,我们发现用行为数据复原事件码的EEG潜伏期的条件有:事件码由OnsetSignalData的方式打,且行为数据记录了该控件的OnsetTime;

知道至少一个事件码的EEG潜伏期和对应的行为潜伏期,用以计算潜伏期差值;4.结合行为数据处理EEG事件码图17.事件码出现的位置和数量4.1.保留或去除以下条件的事件码保留感兴趣的事件{11,12,21,22,31,32};

保留事件码{1}后面的{11,12,21,22,31,32};

去除按键所在的事件;4.2.用MATLAB脚本代码判断符合上述条件事件码SaveNum=0;%建立字段,用于计算保留的事件码数for i=1:length(MarkData)k=floor((i+1)/2); %行为数据的第k行数据放到Mark数据的第i行j=2-mod(i,2);%↓判断FixMark是否为1,去除2,3事件码MarkData(i).FixChnMark = floor(1/MarkData(i).FixMark);%floor(1/2)=0,floor(1/3)=0;%↓判断是否作了按键反应,去除按键所在的事件;if BehaviorData(k,6)~=0 & j==2MarkData(i).ReactMark = 0;elseMarkData(i).ReactMark = 1;end%↓保留同时满足上述两个条件的事件MarkData(i).Save = MarkData(i).ReactMark & MarkData(i).FixChnMark;%↓计算保留的事件数SaveNum = SaveNum+MarkData(i).Save;end

得到SaveNum=1517。

图18

4.3.抽样检查运行结果是否符合预期

图19.行为数据

图20

通过简单的抽样检查发现运行结果是符合预期的。

4.4.取出符合条件的事件码j=1;for i=1:length(EEGMark)if MarkData(i).Save==1Chnevent(j).type=MarkData(i).type;Chnevent(j).latency=MarkData(i).latency;Chnevent(j).urevent=j;Chnurevent(j).type=MarkData(i).type;Chnurevent(j).latency=MarkData(i).latency;j=j+1;endend

命名为Chnevent和Chnurevnt,对应EEG里的EEG.event和EEG.urevent。4.5.将处理好的事件码数据替换EEG数据中的事件码数据%替换事件码数据EEG.event=Chnevent;EEG.urevent=Chnurevent;

图21至此,我们结合行为数据,剔除了EEG事件码中不符合条件的事件。后期采用Extract bin-based epochs的方法可以只定位感兴趣的事件码{11,21,12,22,31,32},而不需要依赖{1}和反应码。比如Binlist可以写成如下格式(左):

图22

5.后续如果你不想用结合行为数据处理的EEG事件码,却又已经替换了,可以用以下代码还原旧的EEG事件码数据。在代码开始时,我们将旧的EEG事件码储存在ureventData和eventData中:%复原事件码数据EEG.urevent = ureventData;EEG.event = eventData;处理完事件码之后,继续在EEGLAB完成其他操作,EEG数据会自动更新事件码数据。

matlab 数据透视表,MATLAB | 用行为数据处理EEG数据事件码相关推荐

  1. 【Excel 2013 数据透视表 学习】一、创建数据透视表

    1 数据透视表 是Excel中数据处理分析工具. 用途: 1. 快速分类汇总.比较大量数据. 2. 快速变化统计分析维度查看统计结果. 数据透视表不仅综合了数据排序.筛选.组合及分类汇总等数据分析方法 ...

  2. Excel2007数据透视表学习(四)改变数据透视表布局

    通过在[数据透视表字段列表]对话框内将[列标签].[行标签]和[报表筛选]区域的字段转换即可创建不同分析角度的数据透视表. 如果还是习惯Excel2003版本字段拖拽方式创建数据透视表,可以在数据透视 ...

  3. python实现数据透视表_17,玩转pivot_table数据透视表

    数据透视表是将数据进行分类汇总,统计分析的强大工具.通过设置新的行标签index和列标签columns,指定需要被统计分析的数值values,指定采用的统计聚合函数aggfunc等,利用数据透视表可以 ...

  4. Excel数据透视表无法显示新添加的数据列(亲自实践)

    今天被人叫去,说是数据透视表无法显示新追加的数据列,心想不能呀,过去一看果然无法正常显示新追加的数据列. 拿到自己座位上整了整,发现问题所在: 追加新数据列之前,就已经创建了一个数据透视表,而该数据透 ...

  5. Excel数据透视表经典教程十二《数据透视图》

    前言: 1.创建数据透视图 2.设置透视图 3.筛选图表数据项 4.格式图表 5.图表模板 一.创建数据透视图 数据透视图与普通图表的创建基本一样,只是数据透视图的创建是基于数据透视表的. 创建数据透 ...

  6. Excel数据透视表经典教程二《创建数据透视表》

    一.创建数据透视表 由上图:Ctrl+A选中图表,然后点击插入-点击数据透视表 选择在新/现有工作表中创建数据透视表 1.对不同品牌下的不同车型进行计数 2.查看不同品牌的收入是多少 3.将不同的地区 ...

  7. 计算机一级excel建立数据透视表,计算机二级Office:Excel数据透视表和透视图

    本节课我们考试学习[数据透视表],话不多说,让我们开始今天的教程吧. 1.我们之前讲解过[分类汇总],有一个特别的注意事项就是[排序],然后才可以进行之后的操作. 2.接下来我们开始正式的讲解[数据透 ...

  8. excel数据透视表中插入一列新数据

    鼠标选中数据透视表中任意一个单元格,点击 分析 - 字段.项目,再选中"计算字段 " 在弹出的窗口中,名称可定义为自己需要的 在窗口 的公式输入栏中插入计算公式 ,插入方式为:在字 ...

  9. excel 数据透视表的使用 每个id每天数据不同的汇总

    问题场景 打个比方,本文采用2举例 1.每人每天工资不同,也可能不上班,求工作天数和总工资. 2.不同的人在富士康根据任务号用id对工时打卡,每个任务号工时不定.每个月做一次汇总工时,结算工资. 即, ...

最新文章

  1. ORACLE 体系结构知识总结
  2. Win/Linux常用命令
  3. python开发实践教程_Python开发实践教程
  4. 阿里如何面试MySQL优化CPU消耗
  5. 确保河道环境_开展河道整治 改善生态环境
  6. 目标检测之RRPN的学习笔记~
  7. Bailian4123 马走日【DFS】
  8. 来自Google的围棋AlphaGo
  9. 详解网易AI布局,三大AI产品矩阵浮出水面
  10. 值得收藏的12款小众冷门但功能强大的在线神器
  11. PXE无人值守安装系统
  12. 模拟微信接口时,提示“请在微信客户端打开链接”(转)
  13. 微信小程序 如何获取时间
  14. 鸿蒙掉不掉凤羽符,装备各部件灌注符的获取方式(和肝燕面基成功,给萌新的福利)...
  15. 关系型数据库到文档型数据库的跨越
  16. Android 开源框架精选
  17. NoMeiryoUI v3.1.0 开源便捷的Windows系统字体设置工具
  18. 基于标准反向传播算法的改进BP神经网络算法(Matlab代码实现)
  19. 4rx4 服务器内存2rx4_854596-B21 855507-091 32GB 2Rx4 PC4-2400T HPE服务器内存
  20. 爬虫股票交易接口系统怎么运用多空指标获取数据?

热门文章

  1. XSS学习笔记(未完)
  2. python可以用来写什么工具_python写工具
  3. 销售人员的优势和动力
  4. python的歌曲评论数据分析_用Python爬取陈奕迅歌曲10万条评论的新发现
  5. S60v5 编程环境的搭建(2)
  6. S60v5 GBA模拟器gpSP4Symbian v0.5安装使用图文教程
  7. CCF 行车路线 100分
  8. DataCastle用户贷款风险预测(完整数据)
  9. 打印机无法确认设备和计算机之间的连接,打印机和电脑连接不上怎么办_电脑怎么连接不上打印机设备-win7之家...
  10. QQ空间首页模仿制作——HTML布局练习