文献阅读
FieldTrip教程
书籍
ChatWithOpenAI
DeepLabCut
2️⃣自动伪影拒绝
type
status
date
slug
summary
tags
category
icon
password
FieldTrip 中的自动伪影拒绝是一种精密复杂的伪影剔除方法,如果不完全理解所涉及的所有步骤,将不可避免地弊大于利。只有当您完全了解您的数据和您将要处理的伪影时,您才能为自动伪影拒绝设置适当的参数。因此,我们建议首先使用 ft_databrowser 或 ft_rejectvisual 手动处理伪影。
介绍
在任何其他教程中进行进一步分析之前,最好有无伪影数据。在 FieldTrip 中,您可以选择进行视觉 / 手动或自动伪影检测和拒绝。
背景
要成功分析 EEG 或 MEG 信号,需要 “干净” 的数据。这意味着您应该尝试减少由于与您的实验条件无关的因素而导致的数据方差。难以控制的因素之一是数据中存在伪影。这些伪影可能是生理性的,也可能是采集电子设备的结果。最强的生理伪影源于眨眼、眼球运动和头部运动。吞咽和颈部收缩引起的肌肉伪影也可能是一个问题。与电子产品相关的伪影示例是 “SQUID 跳跃” 或尖峰。
当然,最好首先尝试避免这些伪影。例如,您可以在允许眨眼的试次之间给您的测试对象一些定义明确的时间间隔,但要求他们在感兴趣的时间间隔内停止眨眼。然而,您迟早会希望检查数据并确保检测、删除或更正伪影。
程序
函数ft_artifact_eog、ft_artifact_muscle和ft_artifact_jump只是ft_artifact_zvalue函数的包装器,设置了一些默认参数。如果您想详细了解它的工作原理,请查看该功能。
以下步骤用于检测 FieldTrip 的自动伪影拒绝中的伪影(见下图)
- 使用 ft_definetrial 定义感兴趣的片段
- 使用 ft_artifact_zvalue 检测伪影,这包括
- 从磁盘读取数据(带填充[with padding])
- 过滤数据
- Z 变换过滤后的数据并在通道上对其进行平均
- 阈值累积的 z 分数
此过程将产生一个伪影定义,一个两列数组,其中包含每个检测到的伪影的起始和偏移采样点数。然后,这个 “伪影定义”(
.artfctdef
子结构)可以在一个单独的步骤中用于拒绝您的试次定义中的(部分)试次(因此在进行后续分析之前使用 ft_preprocessing 读取数据),或拒绝内存中已有的(部分)数据。两种方法都使用 ft_rejectartifact。现在将详细解释自动伪影拒绝例程所采取的所有步骤。一、从磁盘读取数据(带填充)
生理数据通常非常大并且占用系统内存。出于这个原因,最有效的方法是只从磁盘读取您需要的数据,而不是先读取所有数据,然后再选择感兴趣的数据段。这就是为什么在 FieldTrip 中我们通常首先读取(标记 / 触发)事件以确定感兴趣的数据段(试次),然后在单独的步骤中将其读入内存。有关如何定义试验,请参阅入门-读取原始 EEG 或 MEG 数据和预处理 - 分割和读取基于试次的 EEG 和 MEG 数据教程。
(自动)伪影拒绝在这方面是一致的:我们使用我们的伪影拒绝例程从我们的试次定义 (trl) 中排除间隔 / 试验,这样在后面的步骤中我们就不必读入伪影数据。
因此,重要的是在读取数据时,伪影拒绝是一个两步过程:1) 读取数据以确定伪影,2) 读入无伪影的数据。此外,在第一步中,我们通常会读入更多数据(在试次间隔之前和之后),以便能够处理滤波器伪影(滤波器-填充)和刚好在我们试次之外但仍应被拒绝的伪影(试次 - 填充)。伪影拒绝后,此额外数据不用于进一步处理。滤波器填充和试次填充将在下面的单独部分中进一步解释。
这将我们带到了伪影拒绝中读取数据的最后一个重要问题:从磁盘读取与从内存读取。在后一种情况下,您将得到已经分割成试次的(原始)数据结构。在我们使用试次填充和滤波器填充的所有情况下,都需要更多数据,但是这些方法无法应用于从内存中读取的数据,因此你会变得更加敏感,例如对于滤波器的问题。当数据不是连续记录的情况下,这也会成为一个问题。
二、过滤数据
在我们读取单个试次的数据(加上额外的填充)后,将以您认为最能夸大您正在寻找的特定伪影的方式处理此数据。换句话说,如果您知道自己在寻找什么,就可以以最突出的方式处理数据。例如,肌肉 EMG 主要以 EEG/MEG 信号的较高频率表示。例如,一个在 110 到 140 之间的带通滤波器会利用这项知识,并在您的受试者进行肌肉抽搐时导致通道显示大功率振幅。以类似的方式,可以优化 EOG 和 SQUID 跳跃伪影的过滤器设置。本页末尾提供了示例。
请注意,这确实意味着您可能要进行多次伪影拒绝以处理几种不同类型的伪影。
三、Z 变换过滤后的数据并在通道上对其进行平均
这里使用的自动伪影检测方法基于伪影的三个特征:1)它们在时间上稀疏地出现,即不是所有时间,2)它们被比大脑数据更大的振幅所反映(可能或特别是在特定频带中), 和 3) 它们出现在多个通道 / 电极上。因此,过滤后的数据通过以下步骤进行转换
- 计算每个通道 / 电极随时间变化的信号幅度(希尔伯特包络)
- 每个通道 / 电极计算其平均值和标准偏差(针对所有样本)
- 每个通道 / 电极的每个时间点都经过 z 归一化(减去平均值并除以标准差)
- 针对每个时间点,计算每个电极的 z 值(标准差),然后在所有电极上对 z 值求平均。由于伪迹可能会在任何一个电极上出现,而且通常会同时出现在多个电极上(比如眨眼和肌肉伪迹),因此对通道/电极的 z 值进行平均可以让伪影的证据逐渐积累。这最终可以得到一个时间序列,表示所有通道/电极上的标准差与平均值的关系。
计算 z 值的公式为:
z 值是指某个时间点上每个电极的信号与所有时间点上该电极信号的平均值之间的标准差。
其中
其中:N = 时间样本总数
在代码中形成了这个公式,例如优化通道平均值和标准偏差的计算。
求和按以下方式执行:
其中: C = 通道数。
四、对累积的 z 分数设定阈值
现在每个时间点都表示为随时间和通道的平均值的偏差,我们可以使用伪影检测阈值:所有高于或低于该阈值 (
cfg.artfctdef.zvalue.cutoff
) 的时间点都将被视为属于伪影。根据伪影的方差与大脑信号的方差,必须设置更高或更低的阈值。这个阈值越低,伪影检测的行为就越保守,阈值越高则越自由(见图)。由于数据的这些特征可能因实验而异,甚至从一个记录到另一个记录也不同,因此必须注意调查适合您的阈值。通过使用选项
cfg.feedback='yes'
,您可以进入交互模式,您可以在其中浏览数据并根据您的数据和过滤器设置调整截止值(即用于阈值的 z 值)。填充[Padding]
伪影填充
当检测到一系列连续时间点时,它们被视为一个伪影周期的一部分,并输入伪影定义作为一个开始和结束样本编号。通常,伪影开始的时间比伪影检测能够捕获的时间早一点,结束的时间晚一点。然后可以使用伪影填充 (
cfg.artfctdef.xxx.artpadding
) 来延长两侧伪影的时间段。这也可用于确保伪影将 “进入” 必须被拒绝的试验。试次填充
您可能希望包括试次之前或之后的数据片段,例如,当您想要在试次开始前眨眼拒绝试次时。为此可以使用试次填充 (
cfg.artfctdef.xxx.trlpadding
)。Trial padding 用指定的长度在 trial 的两侧填充数据,从而也对那些填充的片段执行伪影检测和拒绝。滤波器填充
每种伪影类型最好用特定通带的滤波器检测(例如,眨眼的通带为 1-15 Hz,肌肉伪影的通带为 110-140 Hz)。然而,众所周知,滤波器会产生边缘效应,这种边缘效应也可以被伪影检测例程检测到,并被误认为是真实的伪影。
为避免这种情况,使用滤波器填充 (
cfg.artfctdef.xxx.fltpadding
)。在进行滤波之前,在信号两侧额外读取数据,以避免信号在边缘处受到截断的影响,并且这个额外读取的数据要加在已有的试次填充(如果有的话)的基础上。应用滤波后,滤波填充将再次移除。换句话说,滤波器填充仅用于滤波,而不用于伪影检测(见图)。组合滤波器和试次填充
滤波器和试次填充经常一起使用。Trialpadding 首先添加到试次中,然后添加 filterpadding(并在应用滤波后再次移除)。
负试次填充
Negative trialpadding 是自动伪影拒绝中的一个选项,因为有几个人要求实现它。这是一个有点奇怪的选项,只有在没有更适当的步骤可用时才应用。这可能是因为在先前的处理步骤中,试次已被定义为大于伪迹检测所需的大小,例如,当试次填充和滤波填充已经被包括在内时。如果不能填充数据(因为它已经在内存中),滤波器伪影可能仍然是一个问题。因此,您可能希望将伪影检测限制在试次的有限部分,即没有边缘。然后,您可以应用负 trialpadding(对
cfg.artfctdef.xxx.trlpadding
使用负值)。伪影拒绝
在您对伪影检测感到满意后,您可以拒绝包含任何伪影的完整试次,或仅拒绝带有伪影的部分。后一种选择会导致部分试次具有可变的试次长度,尤其是在预期任何基于试次或基于平均的统计数据时,必须考虑这一点。
要从试次定义 (trl) 中删除检测到的伪影,您可以将伪影定义作为任何字段(例如,
.eog, .jump,或 .zvalue
)添加到cfg.artfctdef
字段。例如:如果您像这样调用 ft_artifact_zvalue:
cfg = ft_artifact_zvalue(cfg)
,您可以直接将该输出提供给 ft_rejectartifact 。这方面的例子将在下面给出。入门示例
以下是您可能遇到的伪影的一些案例示例,以及一些可以开始的基本设置。您将需要为您自己的数据集调整这些。本例中使用的数据是 ArtifactMEG.ds 数据集,它是通过 10 秒的试次连续获取的(与其他教程数据相比)。
首先我们需要定义我们的试次
跳跃伪影检测
为了检测跳跃伪影[jump artifacts],从以下参数开始
指定
cfg.artfctdef.zvalue.interactive = 'yes'
将打开一个图,如下图所示,它为您提供有关检测程序的信息,并让您能够尝试不同的 z 值截止值。在此示例数据集中,许多数据点被检测为 “跳跃” 伪影,尽管它们在本质上看起来更像是 “肌肉”引起(也就是说这些数据可能并不是真正的跳跃伪影)。典型的跳跃伪影如下图:
在此示例中,您可以轻松地将伪影检测的阈值增加到值 150。如果您随后点击 “停止” 按钮,您将返回 MATLAB 命令行,并且 ft_artifact_zvalue 的输出变量包含
cfg.artfctdef.zvalue.artifact
中伪影的定义。检测肌肉伪影
与 ft_artifact_zvalue 用于检测跳跃伪影的方式相同,它可以用于检测肌肉伪影。
EOG 伪影的检测
与 ft_artifact_zvalue 用于检测跳跃伪影的方式相同,它可用于检测眨眼伪影 (EOG)。请注意,在眼睛伪影的情况下只扫描 EOG,这比扫描所有 MEG 通道花费的时间更少,而扫描所有 MEG 通道是跳跃和肌肉伪影所需的。
另请参阅有关不同类型填充的常见问题解答。
建议进一步阅读
有关一般如何处理 FieldTrip 中的工件的介绍,您应该查看 简介:伪影处理教程。作为自动伪影检测的替代方法,您可以手动检查试验和通道数据,请参阅视觉伪影拒绝教程。此外,您还可以使用 ICA 从数据中移除伪影,这在使用 ICA 清除伪影教程中进行了解释。
- Twikoo
Last update: 2023-04-30
FieldTrip教程更新学习中……
DeepLabCut教程已更新。