matlab 数据透视表,MATLAB | 用行为数据处理EEG数据事件码
脑电图(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数据事件码相关推荐
- 【Excel 2013 数据透视表 学习】一、创建数据透视表
1 数据透视表 是Excel中数据处理分析工具. 用途: 1. 快速分类汇总.比较大量数据. 2. 快速变化统计分析维度查看统计结果. 数据透视表不仅综合了数据排序.筛选.组合及分类汇总等数据分析方法 ...
- Excel2007数据透视表学习(四)改变数据透视表布局
通过在[数据透视表字段列表]对话框内将[列标签].[行标签]和[报表筛选]区域的字段转换即可创建不同分析角度的数据透视表. 如果还是习惯Excel2003版本字段拖拽方式创建数据透视表,可以在数据透视 ...
- python实现数据透视表_17,玩转pivot_table数据透视表
数据透视表是将数据进行分类汇总,统计分析的强大工具.通过设置新的行标签index和列标签columns,指定需要被统计分析的数值values,指定采用的统计聚合函数aggfunc等,利用数据透视表可以 ...
- Excel数据透视表无法显示新添加的数据列(亲自实践)
今天被人叫去,说是数据透视表无法显示新追加的数据列,心想不能呀,过去一看果然无法正常显示新追加的数据列. 拿到自己座位上整了整,发现问题所在: 追加新数据列之前,就已经创建了一个数据透视表,而该数据透 ...
- Excel数据透视表经典教程十二《数据透视图》
前言: 1.创建数据透视图 2.设置透视图 3.筛选图表数据项 4.格式图表 5.图表模板 一.创建数据透视图 数据透视图与普通图表的创建基本一样,只是数据透视图的创建是基于数据透视表的. 创建数据透 ...
- Excel数据透视表经典教程二《创建数据透视表》
一.创建数据透视表 由上图:Ctrl+A选中图表,然后点击插入-点击数据透视表 选择在新/现有工作表中创建数据透视表 1.对不同品牌下的不同车型进行计数 2.查看不同品牌的收入是多少 3.将不同的地区 ...
- 计算机一级excel建立数据透视表,计算机二级Office:Excel数据透视表和透视图
本节课我们考试学习[数据透视表],话不多说,让我们开始今天的教程吧. 1.我们之前讲解过[分类汇总],有一个特别的注意事项就是[排序],然后才可以进行之后的操作. 2.接下来我们开始正式的讲解[数据透 ...
- excel数据透视表中插入一列新数据
鼠标选中数据透视表中任意一个单元格,点击 分析 - 字段.项目,再选中"计算字段 " 在弹出的窗口中,名称可定义为自己需要的 在窗口 的公式输入栏中插入计算公式 ,插入方式为:在字 ...
- excel 数据透视表的使用 每个id每天数据不同的汇总
问题场景 打个比方,本文采用2举例 1.每人每天工资不同,也可能不上班,求工作天数和总工资. 2.不同的人在富士康根据任务号用id对工时打卡,每个任务号工时不定.每个月做一次汇总工时,结算工资. 即, ...
最新文章
- ORACLE 体系结构知识总结
- Win/Linux常用命令
- python开发实践教程_Python开发实践教程
- 阿里如何面试MySQL优化CPU消耗
- 确保河道环境_开展河道整治 改善生态环境
- 目标检测之RRPN的学习笔记~
- Bailian4123 马走日【DFS】
- 来自Google的围棋AlphaGo
- 详解网易AI布局,三大AI产品矩阵浮出水面
- 值得收藏的12款小众冷门但功能强大的在线神器
- PXE无人值守安装系统
- 模拟微信接口时,提示“请在微信客户端打开链接”(转)
- 微信小程序 如何获取时间
- 鸿蒙掉不掉凤羽符,装备各部件灌注符的获取方式(和肝燕面基成功,给萌新的福利)...
- 关系型数据库到文档型数据库的跨越
- Android 开源框架精选
- NoMeiryoUI v3.1.0 开源便捷的Windows系统字体设置工具
- 基于标准反向传播算法的改进BP神经网络算法(Matlab代码实现)
- 4rx4 服务器内存2rx4_854596-B21 855507-091 32GB 2Rx4 PC4-2400T HPE服务器内存
- 爬虫股票交易接口系统怎么运用多空指标获取数据?
热门文章
- XSS学习笔记(未完)
- python可以用来写什么工具_python写工具
- 销售人员的优势和动力
- python的歌曲评论数据分析_用Python爬取陈奕迅歌曲10万条评论的新发现
- S60v5 编程环境的搭建(2)
- S60v5 GBA模拟器gpSP4Symbian v0.5安装使用图文教程
- CCF 行车路线 100分
- DataCastle用户贷款风险预测(完整数据)
- 打印机无法确认设备和计算机之间的连接,打印机和电脑连接不上怎么办_电脑怎么连接不上打印机设备-win7之家...
- QQ空间首页模仿制作——HTML布局练习