草庐IT

EEGLAB系列教程5:数据预处理2(ICA去伪迹)

大脑技术 2024-02-24 原文

EEGLAB系列教程5:数据预处理2(ICA去伪迹)

今天介绍EEG数据处理系列教程5,在前面的几期中,已经介绍了数据基本处理过程,可以参见以下链接:

EEGLAB系列教程1:安装和启动 EEGLAB

EEGLAB系列教程2:在 EEGLAB 中管理数据集

EEGLAB系列教程3:在 EEGLAB 中建立location

EEGLAB系列教程4:在 EEGLAB 中预处理数据1

在很久之前,我也利用analyzer软件进行了ICA去噪的教程分享,可以参考链接:

独立成分分析(ICA)

在运行ICA之前,通过前面的系列教程可以剔除了不好的通道和肉眼可见的不好数据段。然后在来运行ICA是更好的。

运行 ICA

对连续 EEGLAB 数据集进行ICA,选择Tools → Decompose data by ICA。将调用函数pop_runica。如使用默认选项运行 ICA,只需按OK即可。

如使用高导联(128导及以上),可以将选择的commandline option参数进行修改,选取其中的一部分数据进行PCA提取成分。

正常运行过程:

ICA 算法

EEGLAB 允许尝试不同的 ICA 算法。Infomax ICA 使用runica、 Jader 算法使用jamer.m和 SOBI 算法使用sobi.m这些都是EEGLAB 默认算法。通过下拉选择即可选择算法。

另外需要使用 FastICA 算法,必须安装FastICA 工具箱并将其添加到MATLAB 路径中。

查看 ICA 成分

runica.m给出的成分顺序是按每个成分计算的 EEG 方差的降序排列。

IC成分激活(时间进程)

依时间进程查看IC成分,选择Plot → component activiations(scroll)。滚动浏览 ICA 激活,可以很容易地发现占特征伪影的成分。例如,在下面的展示中,成分 3 可能是眨眼成分。

绘制2-D成分头皮图

绘制 2-D 头皮成分图,选择Plot → Component maps → In 2-D。然后由函数pop_topoplot生成交互式窗口(如下) 。只需按确定即可绘制所有成分。

出现以下图片,显示所选成分头皮显示图。

优化 ICA 分解的质量

ICA是利用机器学习的算法,对EEG数据进行成分分解。它是将所有训练数据都考虑在内,当训练数据中留下太多类型的噪声—复杂的运动伪影、电极坏道等,这些坏数据特征将对ICA分解会产生影响。因此,向 ICA 提供尽可能多的干净 EEG 数据才是最佳的。(剔除较大的明显的伪迹数据)

在 ICA 之前与自动伪迹剔除相关的问题

ICA 之前的自动伪迹剔除可能会删除部分数据(如:较大的眨眼等),当然这也可以通过 ICA方法进行校正。但是,降低自动伪迹剔除的阈值可能会保留太多 ICA 无法删除的伪迹。在这种情况下,推荐以下操作步骤:

  1. 从已最少清除伪迹(或仅删除坏通道)的数据集开始
  2. 在这个数据集上运行 ICA
  3. 识别不良 ICA 成分并从数据中删除
  4. 使用更严格的阈值或剔除伪迹方法再次清理ICA后的数据集,以删除数据的剩余伪迹部分

将 ICA 应用于分段数据而不是连续数据

一般来说,建议对连续数据使用 ICA,而不是已提取的分段数据。首先,分段数据已经减少了样本数量,当存在更多数据时,ICA 成分的质量会更高些。其次,删除分段数据的基线会对ICA 产生重大影响,因为它会在每个通道中引入随机偏移,这是 ICA 无法建模或补偿的。虽然可以提取分段时不删除基线,但是在运行 ICA 之后,基线可能会被删除。

将 ICA 应用于分段数据也是可能的。ICA 期望数据是平稳的,即相同的统计模型正在生成所有数据样本。如果您在 分段之后有足够的数据,那么分段数据可能更可取,因为它会更加稳定。但是,在对不同事件进行分段以生成不同数据集时,我们建议对所有条件使用相同的 ICA 分解。实际上,这可能意味着在运行 ICA 之前创建一个包含所有分段类型的数据集。假设所有数据在统计上相似,更多的数据通常会提供更好的 ICA 分解。更长的时期更可取,因为它们为 ICA 产生更多数据(假设平稳性成立。)

自动检测伪迹ICA成分

目前,Luca Pion-Tonachini的ICLabel插件是 EEGLAB 默认安装的 EEGLAB 插件,它提供了对每个独立成分(大脑、眼动、肌肉、线路噪声等)类型的估计。ICLabel 的目标是开发一种足够可靠和准确的脑电图 IC 分类器,可用于大规模研究。当前的分类器实现是在数千个手动标记的 IC 和数十万个未标记的 IC 上进行训练的。更多信息可以在ICLabel 参考文章中找到。

运行 ICA 后,选择菜单项Tools → Classify components using ICLabel → Label components。只需选择默认值,然后按 OK。

将弹出以下窗口并要求绘制成分。只需按确定。

单击一个成分将弹出一个窗口,包含其成分属性以及属于每种类型的估计概率。IC 成分将与它们最可能属于的类别以及属于该类别的可能性一起绘制。

然后可以选择菜单项Tools → Classify components using ICLabel → Flag components as artifacts。默认设置是标记那些有超过 90% 的概率属于肌肉或眼动伪迹(眨眼和眼球运动)类别的成分。使用此功能标记成分时,手动拒绝成分的界面中的按钮将显示为红色(Tools→Reject componengts by map),可以编辑哪些成分将其标记为伪迹。

剔除 ICA 成分

删除成分,使用菜单栏Tools → Remove components from data。

结果窗口(下图)中默认包含的前面标记的伪迹成分编号。

可以点击"Yes"或"Manual reject"按钮来手动编辑成分列表,如下所示。

输入需要剔除的成分编号,然后点击Ok。会弹出对话框窗口,询问是否要比较剔除成分前后的数据,如下图。

单击Plot single trials按钮。显示(下图)在(黑色)和之后(红色)分量剔除之前的数据。我们可以清楚地看到 ICA 去除眨眼伪迹的效果如何。

如果是在分段数据时期中删除 ICA 成分,可以单击Plot ERPs按钮,获得类似的下图,绘制通道 ERP 之前(蓝色)和之后(红色)剔除后的数据结果。

一旦对结果感到满意,点击接受按钮。将弹出另一个窗口,询问是否要重命名新数据集。输入新名字,保存数据集,然后再次按Ok

最后附上网络上总结的经典成分识别:

眨眼成分

成分判断: 眨眼成分

判断依据:

  1. 在头皮地形图的前端分布;
  2. ERP图像中有小方块;
  3. 随机分布;
  4. 功率谱图中,低频能量高;
  5. 成分排序较为靠前,像这个示例中,为IC3

颜色的深浅有意义,但是红还是蓝无所谓,大红大蓝都可以的。

眼动成分

成分判断: 眼动成分

判断依据:

  1. 在头皮地形图的前端两侧分布,红蓝相对;
  2. 在ERP图像中,长条状,红蓝相间;
  3. 随机分布;
  4. 在功率谱图中低频能量高
  5. 分量排序靠前,但一般在眨眼后面,在该示例中为IC5.

头动成分

成分判断: 头动成分

判断依据:

  1. 在头皮地形图中分布在周围;
  2. 在ERP图像中呈现长条状;
  3. 随机分布;
  4. 在单个trial里有非常明显(非常长)的飘移。

成分判断:心电成分

成分判断:心电成分

判断依据:

1.在ERP图像中呈雨点般散落状。

成分判断:工频干扰

判断依据:

  1. 头皮地形图显示分布在地线周围;
  2. 在ERP图像中单个trail上的分布非常规律;
  3. 在功率谱图中,50Hz左右能量最高(有剧烈的峰值)。

ICA判断网站,若是对ICA成分不熟悉,可以看看这个网站的介绍

网址:https://labeling.ucsd.edu/tutorial/labels

参考网址:

https://github.com/sccn/ICLabel

https://labeling.ucsd.edu/tutorial/format

Groppe, D. M., Makeig, S., & Kutas, M. (2009). Identifying reliable independent components via split-half comparisons. NeuroImage, 45(4), 1199–1211. https://doi.org/10.1016/j.neuroimage.2008.12.038

Luca Pion-Tonachini, Ken Kreutz-Delgado, Scott Makeig,ICLabel: An automated electroencephalographic independent component classifier, dataset, and website,NeuroImage,Volume 198,2019,Pages 181-197,ISSN 1053-8119,https://doi.org/10.1016/j.neuroimage.2019.05.026.

谢谢大家观看,如有帮助,来个喜欢或者关注吧!
本文作者:陈锐

本文仅供学习参考,有任何疑问及侵权,可添加微信交流:braintechnology

更多学习内容,仅在知识星球发布:

有关EEGLAB系列教程5:数据预处理2(ICA去伪迹)的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  4. ruby-on-rails - 使用一系列等级计算字母等级 - 2

    这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,

  5. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  6. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  7. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  8. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  9. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  10. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

随机推荐