文章来源于微信微信官方账号(明创科技),欢迎有兴趣的朋友搜索关注。
本教程示例了如何处理初级运动皮层,当被试收缩或放松对手时(M1)进行经颅磁刺激(TMS)的脑电图(EEG)。去除TMS假影最好的办法就是先预处理。TMS伪影去除步骤完成后,可以继续进行EEG分析。本教程需要解决的研究问题是手的预收缩是否会影响脑电图。
EEG信号分析需要干净的数据。但这并不简单,因为它同时应用TMS和EEG的难点是TMS线圈电磁场会产生较大的伪影。所以在联合TMS-EEG在实验中,不可避免地会出现一些数据TMS伪影。适当的设备(高采样率(如> 5 kHz) EEG放大器、为TMS应用设计EEG在事后离线分析中减少伪影,有助于进一步分析数据。
电机热点确定线圈的位置。使用磁共振(MRI)导航定位保持刺激位置不变。为了突出伪影,本教程调整了线圈的方向和倾斜度,以诱导强伪影。
事件markers:在每次TMS脉冲开始时放置一个事件来表示条件。S 放松条件表示放松S 表示收缩条件。
TMS-EEG由于采样率高,记录时间长,通常会获得数据GB(大)。此时,您需要注意您的操作系统是否合适。建议在64位Windows操作系统运行本教程,运行64位版本MATLAB,且至少有8GB RAM(运行内存)。如果您需要高性能工作站,请联系我们的工程师 |
在开始数据分析之前,从两个方面考虑实验:1)TMS协议和2)大脑状态的实验操作(即被试任务或缺失任务)。
本教程考虑了基于测试次数的分析,因此不能直接应用于连续数据。此外,本教程使用单脉冲颅磁刺激协议中记录的EEG数据。本教程虽然是单脉冲研究编写的,但大多也适用于多脉冲数据。
下图显示了应用颅磁刺激时的通道17EEG(见以上channel排列图中channel 17的位置)。
接下来,让我们向您展示一些可能存在的数据TMS假影。虽然根据脑电图和TMS并不是所有类型的伪影都能在你的数据中观察到设备的特性和实验设计,但理解这些类型的伪影也很重要(做好准备~)。
(1)脉冲伪影:脉冲期数据可视为丢失。
(2)铃声/阶跃响应伪影:这取决于放大器的范围。一旦电势落在放大器范围内,就可以观察到一个持续时间约7的突出滤波器振铃ms,这是由于TMS高梯度脉冲引起的阶跃响应。红色信号反映了脉冲和铃声/阶跃响应的组合。
(3)颅肌伪影:颅肌(头皮)肌肉抽搐可能由经颅磁刺激脉冲引起。这些抽搐不能与运动皮层刺激引起的反应混淆,纯粹是头皮肌肉刺激引起的。通常持续10次ms左右。
(4)伪影再充电:根据TMS机器可以在数据中观察到机器电容器充电时产生的峰值。一些刺激器允许为电容器设置准确的充电时间。使用此数据集MagPro X100(Magventure)刺激开始后,将充电延迟设置为500ms,下图中会看到伪影。
(5)衰减伪影:某些渠道存在类似指数衰减的伪影。这个伪影很难预测。这是因为TMS磁电感应、电极电解质界面极化、电极运动与头部/颈部/面部肌肉抽搐的相互作用在电极引线中引起电流。在最坏的情况下,这个伪影可以持续1s,但更常见的是持续50-150ms。
处理TMS-EEG数据的步骤如下:
(1)使用
(2)用
(3)使用
(4)使用
(5)使用
(6)使用
(7)使用
(8)用
(9)使用
首先使用ft_databrowser浏览试次,ft_databrowser从磁盘或内存中直接浏览数据更方便。使用ft_preprocessing读取磁盘中感兴趣的片段(即试次)。为此,首先需要创建一个试次矩阵,它指定磁盘上数据的哪些部分将表示为试次。这个矩阵有三列(或更多)和多少次试验。使用ft_definetrial创建试次矩阵。
输出的cfg变量包含cfg.trl中的trial-structure。在本教程的背后,我们还需要这样做trial-structure复制到另一个MATLAB变量中。
从ft_definetrial获得的cfg结构包含足够的信息供应ft_preprocessing从磁盘读取我们的数据trials中间。因为读取数据需要很长时间(5-10分钟),可以先找到处理过的数据。
请使用以下方法:
如果是从磁盘上的数据文件中读取,请使用以下代码保存处理过的数据结构,以备后续使用。
现在,使用ft_databrowser直观地检查数据。在刺激前校正基线。
与实际脑电图信号相比,颅磁刺激脉冲的振幅巨大。因此,在垂直和水平按钮旁边使用垂直 和-(用蓝色方框标记部分)可以在两个轴上调整缩放。试着用试次旁边的箭头<>浏览按钮。
请注意,如果调整水平缩放,试用按钮将更改为段按钮,表示正在浏览试用段。channel按钮(用红色方框标记部分)绘制的channel。如果想知道哪个通道代表图中的哪条线,单击“identify”按钮并单击图中的一条线。相应的channel将显示在线的上方。浏览这些试次,会发现有很多噪音。可以通过单击和拖动试次中的任何区域并单击选择来标记想要拒绝的数据段。也可以稍后拒绝特定段,删除整个试次,或用nans替换它。现在,跳过此步,尝试用独立成分分析(ICA)去除生理伪影。
为了检查TMS伪影,创建数据锁时平均值,使得在锁时平均值中更容易发现伪影。
为了腾出系统内存,可用以下语句清除data_tms_raw结构。
想要绘制的平均数据在data_tms_avg结构中显示。看下图:
时间用time字段表示,振幅存储在avg中。当检查这个avg时,可以看到它的大小是61x10000。所以,在这种情况下,你应该已经猜到,行表示通道,列表示每个通道中的时间点。dimord显示了数据字段中的维度代表什么。这里的dimord是chan_time。
现在在单独的窗口中绘制所有channel的数据。可以使用以下脚本关闭先前所有的图形窗口。
需要花点时间看看所有channel,看是否能够确定存在的伪影。
这里将仔细观察靠近刺激点的channel 17。
如果稍微调整一下绘图范围,我们可以很容易地将铃声/阶跃响应(~0-0.0045)与颅肌(~0.0045 - 0.015)伪影区分开来。不过,你也可以手动使用缩放按钮或以下代码:
在这个channel中,我们可以发现铃声/阶跃反应、颅肌、指数衰减和再充电伪影。下面的代码能够突出显示这个channel中的伪影。
脚本ft_rejectartifact可以调整试次结构,以排除包含伪影的段。首先必须知道要排除哪些段,可以使用ft_artifact_tms脚本。这个可以用来检测数据中的TMS脉冲。
现在有了铃声/阶跃响应伪影和再充电伪影的配置结构。ft_artifact_tms函数创建一个Nx2的矩阵(表示N个伪影)。由于创建了两个结构,那么将两个结构中的伪影合并到一个结构中,这样就可以直接一步就实现拒绝。
ft_rejectartifact可以以几种方式对包含伪影的试次进行操作:首先,可以选择拒绝整个试次,但在这里不合适,因为每个试次都包含TMS伪影。其次,可以选择用nans替换伪影数据。第三,使用在本教程中采用的方法,通过将试次分割成更小的部分来删除伪影,并保留其他部分。然后,用前面定义和保存的试次矩阵(trl)重建试次。
接下来,加载剔除伪影的数据段。
如果在上一步中已经下载了data_tms_segments(可以直接加载),则跳过下面的代码。否则,也可以使用以下代码读取。
可以看到去除铃声/阶跃响应和再充电伪影的试次段,试次数增目加了。
使用ft_databrowser,既可以浏览分段数据,也可以浏览原始数据。
可以很清晰地看到伪影段已经被标记出来了。
TMS刺激诱发EEG的独立成分分析后剔除肌肉伪影。这里将使用手动拒绝伪影的方法。将数据分解为独立成分,并拒绝伪影成分,同时注意不要剔除非伪影数据。根据数据大小,运行ICA可能需要很长的时间,同时运行ICA也需要相当大的内存(这里大概需要4GB的额外系统内存)。建议在这里下载另存:comp_tms.mat。然后可以用下面的代码进行加载。
如果在跑ICA时出现内存不足问题,其实可以先对数据进行降采样率。注意,在进行降采样时,数据将大约是目标采样率的一半进行低通FIR滤波(例如,如果采样率降到1000Hz,数据将以500Hz进行低通滤波)。使用下面的代码进行降采样率。 对降采样率的数据运行ICA之后,重新加载原始数据,并对原始数据应用空间分解矩阵,以避免试次的边缘伪影。 |
运行完ICA之后,会得到一个类似于data_tms_segments结构的数据。
现在要看一下成分的时间进程,以确定哪些成分需要拒绝。还可以查看成分的地形图,同时查看伪影的空间分布。所有的TMS-EEG伪影在TMS脉冲开始时都是锁时的,可以通过查看成分的锁时均值来简化视觉检查。
现在,可以以浏览channel数据的方式浏览平均数据。与channel数据一样,你可以使用ft_databrowser浏览,也可以使用MATLAB内置的绘图函数浏览。不过要注意的是,如果使用ft_databrowser浏览平均数据(即从ft_timelockanalysis输出的数据),那么只能通过通道浏览,因为没有试次。
由于ICA原则上是一个空间滤波器,可以检查每个成分是如何在空间上加载原始channel数据的。为此,这里将使用ft_topoplotIC。
运行完ICA后,使用ft_databrowser或MATLAB的绘图函数,以及ft_topoplotIC,应该能够找到一个或两个衰减伪影或颅肌伪影成分。我们来看看成分41和56可以明显地看出衰减伪影。这些成分的地形图与刺激位置重叠。我们还可以看到,几乎所有其他成分都包含或多或少的颅肌伪影。因此,可以得出这样的结论,在该数据中,通过ICA无法完全去除颅肌伪影。
将想要删除的伪影成分列出来:
衰减&颅肌:41,56
眼跳:7
眨眼:33
线噪声:31
再充电/肌肉:1,25,52,37,49,50
然后从数据中删除这些成分。使用ft_rejectcomponent,可以删除成分并将数据转换回为channel表示。
现在可以对成分进行删除。
相应成分现在已经被删除,数据回到了以原来的channel表示。
现在我们可以查看一下数据的当前状态。
我们可以看到channel 17上还是存在肌肉伪影。为了防止这个伪影干扰我们进一步的数据处理,还需要对这些肌肉伪影进行剪切和插值。通过删除某些段而造成的空白先由nans填补。然后,对所有包含nans的段进行插值,包含肌肉伪影的时间段也将被nans替代,一同进行插值。
我们需要重建一个原来的试次结构。也就是说,这里需要重建一个在本教程最开始时创建的trl矩阵。
重新创建好原来的试次结构并将所有数据块放回原来的位置。铃声和再充电伪影造成的数据空白段已经用NaN,即非数字值来替代。
从这两种数据结构的trial字段可以看到,同样有300个试次。在这个数据结构中,每个试次数据(通道x时间)位于试次字段的单元格中。现在要对每个试次含有肌肉伪影的段用nans进行替代。通过对数据的观察就会发现,大约在刺激开始后用nans替代15ms就足够了。
接下来就可以开始插值了。函数ft_interpolatenan通过试次、通道以及使用MATLAB内置的interp1函数插值包含nans的段。
现在将原始数据与处理后的数据进行比较,首先先加载原始数据的锁时average。
使用以下代码,比较原始数据的平均TEP与处理后数据的平均TEP。
到这一步,我们已经完成了对TMS伪影的预处理啦~~
接下来的滤波、去均值、去趋势和降采样等分析步骤,我们紧接着会出一期“