超详细TMS-EEG数据处理教程(下)

article/2025/11/7 20:53:09

文章来源于微信公众号(茗创科技),欢迎有兴趣的朋友搜索关注。

上一期的文章TMS-EEG数据处理教程(上)中详细地介绍了TMS伪影类型和预处理步骤。这期主要讲了完成数据预处理后,再进行一些(后)处理步骤,如过滤、去趋势、去均值和降采样。但要注意的是,一些分析步骤可能需要对数据进行不同的处理。例如,当查看经颅磁刺激诱发电位(TEPs)时,你可能想要滤除数据中的高频噪声,但在执行时频分析时(滤除高频噪声)是不必要的;你可能也希望对数据进行去趋势操作,但这同样不建议用于分析TEPs。

幸运的是,这些函数(例如ft_timelockanalysisft_freqanalysis)允许对输入数据进行与ft_preprocessing相同的预处理步骤。这适用于对每步分析进行单独的处理,而不必创建额外的数据结构。

这里先只对数据进行降采样,接下来会应用到不同的(后)处理步骤。降采样需要使用ft_resampledata

cfg = [];cfg.resamplefs = 1000;cfg.detrend = 'no';cfg.demean = 'yes'; % Prior to downsampling a lowpass filter is applied, demeaning avoids artifacts at the edges of your trialdata_tms_clean = ft_resampledata(cfg, data_tms_clean);

接下来先需要将数据进行保存。

save('data_tms_clean','data_tms_clean','-v7.3');

分析

我们最初的问题是预收缩是否会影响经颅磁刺激诱发电位。为了解决这个问题,接下来将比较TEP的振幅,检查TMS的响应频率,并查看全局平均场功率。

锁时平均

当前数据集中有两个条件要比较:' relax ' & ' contract '。条件在数据集中通过EEG中的标记显示出来。读取数据时,基于这些标记的试次,可以在数据结构trialinfo字段中找到每个试次属于哪个条件的信息。在这里,“放松”条件用数字1表示,“收缩”条件用数字3表示。

>> data_tms_clean.trialinfo
ans =
     1     1     1     1     .     .     .     3     3     3     .     .     .

我们可以使用该字段中的信息分别对这两个条件执行锁时分析。trialinfo字段中的每一行都对应于数据集中的一个试次。

在计算锁时平均值时,应用基线校正(TMS发生前50ms到1ms),进行35Hz的低通滤波。​​​​​​​

cfg = [];cfg.preproc.demean = 'yes';cfg.preproc.baselinewindow = [-0.05 -0.001];cfg.preproc.lpfilter = 'yes';cfg.preproc.lpfreq = 35;
% Find all trials corresponding to the relax conditioncfg.trials = find(data_tms_clean.trialinfo==1);relax_avg = ft_timelockanalysis(cfg, data_tms_clean);
% Find all trials corresponding to the contract conditioncfg.trials = find(data_tms_clean.trialinfo==3);contract_avg = ft_timelockanalysis(cfg, data_tms_clean);

计算两个条件的平均值之间的差,使用函数ft_math,对一个或多个数据结构执行一定数量的数学操作。​​​​​​​

% calculate differencecfg = [];cfg.operation = 'subtract'; % Operation to applycfg.parameter = 'avg'; % The field in the data structure to which to apply the operationdifference_avg = ft_math(cfg, contract_avg, relax_avg);

使用ft_singleplotER绘制条件及其差异,该函数非常适合绘制和绘制比较条件。​​​​​​​

% Plot TEPs of both conditionscfg = [];cfg.layout = 'easycapM10'; % Specifying this allows you to produce topographical plots of your datacfg.channel = '17';cfg.xlim = [-0.1 0.6];ft_singleplotER(cfg, relax_avg, contract_avg, difference_avg);ylabel('Amplitude (uV)');xlabel('time (s)');title('Relax vs Contract');legend({'relax' 'contract' 'contract-relax'});

图片

ft_singleplotER一个很好的特点是,如果指定一个布局,你可以在绘图窗口中选择一个时间范围,然后单击它来生成该时间点的振幅会在地形图上显示出来。你也可以使用ft_topoplotER函数来完成此步操作。​​​​​​​

%% Plotting topographiesfigure;cfg = [];cfg.layout = 'easycapM10';cfg.xlim = 0:0.05:0.55; % Here we've specified a vector between 0 and 0.55 seconds in steps of 0.05 seconds. A topoplot will be created for each time point specified here.cfg.zlim = [-2 2]; % Here you can specify the limit of the values corresponding to the colors. If you do not specify this the limits will be estimated automatically for each plot making it difficult to compare subsequent plots.ft_topoplotER(cfg, difference_avg);

图片

全局平均场功率

全局平均场功率(GMFP)是Lehmann和Skandries(1979)首次提出的一种测量方法,例如,Esser等人(2006)使用该方法来表征全局EEG活动。GMFP可以用以下公式计算(来自Esser et al. (2006))。 

图片

其中t为时间,V为channel i处的电压,K为channel数。在Esser等人(2006)中,GMFP是根据所有被试的平均水平计算的。因为这里只有一个被试的数据,所以只计算这个被试的GMFP。但如果有多个被试,那么可以在进行总平均时用相同的方法进行计算。基本上,GMFP是channel上的标准差。

FieldTrip有一个内置的函数来计算GMFP;ft_globalmeanfield,这个函数需要输入锁时数据。这里将使用与Esser等人(2006)类似的预处理。

% Create time-locked averagecfg = [];cfg.preproc.demean = 'yes';cfg.preproc.baselinewindow = [-0.1 -.001];cfg.preproc.bpfilter = 'yes';cfg.preproc.bpfreq = [5 100];
cfg.trials = find(data_tms_clean.trialinfo==1); % 'relax' trialsrelax_avg = ft_timelockanalysis(cfg, data_tms_clean);
cfg.trials = find(data_tms_clean.trialinfo==3); % 'contract' trialscontract_avg = ft_timelockanalysis(cfg, data_tms_clean);
% GMFP calculationcfg = [];cfg.method = 'amplitude';relax_gmfp = ft_globalmeanfield(cfg, relax_avg);contract_gmfp = ft_globalmeanfield(cfg, contract_avg);

现在可以画出两个条件的GMFP。

%Plot GMFPfigure;plot(relax_gmfp.time, relax_gmfp.avg,'b');hold on;plot(contract_gmfp.time, contract_gmfp.avg,'r');xlabel('time (s)');ylabel('GMFP (uv^2)');legend({'Relax' 'Contract'});xlim([-0.1 0.6]);ylim([0 3]);

图片

时频分析

把信号分解成频率,然后看这些频率的功率平均值。首先使用ft_freqanalysis将信号分解成不同的频率。在做光谱分析时,重要的是在分解成不同频率之前去趋势和去均值,以避免功率谱看起来很奇怪。因此,可以使用preproc选项对数据进行去趋势和去均值。

% Calculate Induced TFRs fpor both conditionscfg = [];cfg.polyremoval     = 1; % Removes mean and linear trendcfg.output          = 'pow'; % Output the powerspectrumcfg.method          = 'mtmconvol';cfg.taper           = 'hanning';cfg.foi             = 1:50; % Our frequencies of interest. Now: 1 to 50, in steps of 1.cfg.t_ftimwin       = 0.3.*ones(1,numel(cfg.foi));cfg.toi             = -0.5:0.05:1.5;
% Calculate TFR for relax trialscfg.trials         = find(data_tms_clean.trialinfo==1);relax_freq         = ft_freqanalysis(cfg, data_tms_clean);
% Calculate TFR for contract trialscfg.trials         = find(data_tms_clean.trialinfo==3);contract_freq      = ft_freqanalysis(cfg, data_tms_clean);

计算条件之间的差异。通常在绘制TFRs时,指定一个基线窗口。由于这里需计算条件之间的差异,并且对基线校正后的两个条件之间的差异感兴趣,所以这里需要先从条件中删除基线。

% Remove baselinecfg = [];cfg.baselinetype = 'relchange'; % Calculate the change relative to the baseline ((data-baseline) / baseline). You can also use 'absolute', 'relative', or 'db'.cfg.baseline = [-0.5 -0.3];relax_freq_bc = ft_freqbaseline(cfg, relax_freq);contract_freq_bc = ft_freqbaseline(cfg, contract_freq);
% Calculate the difference between both conditionscfg = [];cfg.operation = 'subtract';cfg.parameter = 'powspctrm';difference_freq = ft_math(cfg, contract_freq_bc, relax_freq_bc);

现在已经计算了两种条件的TFR及其差异,我们可以用不同的方法绘制结果。使用ft_multiplotTFR脚本以头部2D形式绘制所有TFR。

cfg = [];cfg.xlim = [-0.1 1.0];cfg.zlim = [-1.5 1.5];cfg.layout = 'easycapM10';figure;
ft_multiplotTFR(cfg, difference_freq);

图片

此图是完全交互式的,单击并拖动以选择一个或多个channel,单击以查看所选channel的均值。还可以使用ft_singleplotTFR在单个视图中绘制单个(或多个)channel。

cfg = [];cfg.channel = '17'; % Specify the channel to plotcfg.xlim = [-0.1 1.0]; % Specify the time range to plotcfg.zlim = [-3 3];cfg.layout = 'easycapM10';
figure;subplot(1,3,1); % Use MATLAB's subplot function to divide plots into one figureft_singleplotTFR(cfg, relax_freq_bc);ylabel('Frequency (Hz)');xlabel('time (s)');title('Relax');
subplot(1,3,2);ft_singleplotTFR(cfg, contract_freq_bc);title('Contract');ylabel('Frequency (Hz)');xlabel('time (s)');
subplot(1,3,3);cfg.zlim = [-1.5 1.5];ft_singleplotTFR(cfg, difference_freq);title('Contract - Relax');ylabel('Frequency (Hz)');xlabel('time (s)');

图片


http://chatgpt.dhexx.cn/article/HwgkVMUn.shtml

相关文章

使用freesurfer和3Dslicer进行脑区分割和电极定点(详细版)

一、前期准备 Linux系统安装Freesurfer、MATLAB插件spm12、fieldtrip,Windows下载mricron、Slicer3D(需要插件SlicerFreeSurfer)软件 文件准备 ct 和mri t1 文件,格式为dicom,需要转换为 nii 格式(可在s…

EEGLAB及其插件下载安装

EEGLAB是脑电图(EEG)信号处理的一个基于Matlab工具箱,有GUI界面可快速实现对EEG信号的时域、频域、时频域处理,其安装包及插件下载方法如下: 零、版本对照 对于旧版的matlab,需要使用对应版本的EEGLAB&am…

FieldTrip toolbox教程系列(0)-安装、配置与测试

FieldTrip是MEG, EEG, iEEG和NIRS分析的MATLAB软件工具箱。它提供预处理和先进的分析方法,如时频分析,使用偶极子的源重建,分布源和波束形成器和非参数统计测试。 下载 首先下载相应的软件工具,网址如下(需要填写相关信息)&#x…

Brainstorm + Fieldtrip IEEG定位及分区教程

本文是我进入实验室后,针对原本的配准工具fieldtrip在MNI空间映射上不准确的问题,改用的新工具Brainstorm的教程,但因为该工具基本没有可编程部分,因此依然保留了使用Fieldtrip进行前期acpc定位和批处理导出电极触点所在分区的功能…

FieldTrip toolbox教程系列(1)-预处理-读取连续的EEG和MEG数据

FieldTrip是MEG, EEG, iEEG和NIRS分析的MATLAB软件工具箱。它提供预处理和先进的分析方法,如时频分析,使用偶极子的源重建,分布源和波束形成器和非参数统计测试。 介绍 ft_preprocessing的一种常见用法是完全读取内存中的连续数据。如果数据集…

MNE溯源fieldtrip官网教程

MNE溯源fieldtrip官网教程 Introduction 在本教程中,您可以找到有关如何使用最小范数估计进行源重构的信息,以重构单个主题的事件相关字段(MEG)。我们将使用预处理教程中描述的数据集(基于触发的试验选择、事件相关平均和平面梯度),我们还将…

FieldTrip toolbox教程系列(2)-伪影处理简介

简介:处理伪影 关于FieldTrip之前介绍过: 《FieldTrip toolbox教程系列(0)-安装、配置与测试》 《FieldTrip toolbox教程系列(1)-预处理-读取连续的EEG和MEG数据》 本教程介绍了如何在FieldTrip中处理伪影的一般方法 由于FieldTrip支持许多不同采集系统的数据,因此数…

fieldtrip学习——1.坐标系介绍(ctf坐标系和acpc坐标系简介)

-------------------------------------滴,菜鸟要从这里开始学习飞行啦!-------------------------------------------- 今天刚好在跑程序就把我之前学习fieldtrip老碰到并且栽了好几次跟头的东西跟大家简单介绍一下啦。 我目前主要需要做的是头模型和…

【源码】FieldTrip:MEG和EEG分析的MATLAB工具箱

FieldTrip是用于MEG和EEG分析的MATLAB软件工具箱,由荷兰奈梅根Donders大脑、认知和行为研究所的一组研究人员与合作机构密切合作开发。 FieldTrip提供MEG、EEG和侵入性电生理数据的高级分析方法,如时频分析、使用偶极子的源重建、分布式源和波束形成器以…

一个可以把Google Docs变成GDrive的工具

如何把Google Docs转换成一个在线存储工具,如传闻中的GDrive? 我们刚刚开发了个Google Docs的客户端软件:GoogleDrive, 网站:http://www.gdocsdrive.com. 欢迎大家试用,多提意见。 对于云存储类的应用,目前有很多著名的厂商的解决…

谷歌colab运行自己的项目的一些细节

1.连接谷歌colab from google.colab import drive drive.mount(/content/gdrive) 2.安装相关的包,版本要对应好,注意卸载掉之前的tf,可能存在版本不对应问题 !pip install keras2.1.0 !pip uninstall -y tensorflow !pip install tenso…

linux挂在谷歌硬盘,【Colab系列】挂载谷歌硬盘详解

讲解对象:【Colab系列】 作者:融水公子 rsgz 文章出处:360doc个人图书馆[其他平台均为盗版] 提醒:建议大家电脑浏览我的网页,因为手机浏览网页 代码会自动缩成一行,很不方便 1 首先,要知道谷歌硬…

linux上使用drive从google drive 下载文件和文件夹

linux上使用drive从google drive 下载文件和文件夹 由于之前要下载Darpa的大型数据集,这个数据集仅仅在google drive上可以获取。但是如果手动下载的话,要么一个个文件自己点击要么就是整个打包。 这样子有几个问题: 速度很慢中间不能关闭…

YOLOv5-4.0-google_utils.py 源代码导读

YOLOv5介绍 YOLOv5为兼顾速度与性能的目标检测算法。笔者将在近期更新一系列YOLOv5的代码导读博客。YOLOv5为2021.1.5日发布的4.0版本。 YOLOv5开源项目github网址 本博客导读的代码为utils文件夹下的google_utils.py文件,更新日期为2021.1.14. google_utils.py …

只有一个源视频的Deepfakes简介

Deepfakes 简介 Deepfakes 是人工智能生成的任何人或名人的合成视频,它冒充真实的人,并让他们采取行动或说出他们从未做过的任何事情。 Deepfake 的创建过程在技术上很复杂,通常需要大量数据,然后将这些数据输入神经网络以训练和生…

Gmail文件工具:gDrive

用Gmail的空间来进行文件存储已经不是什么新鲜事了,Linux下有GmailFS,Windows下也有Gmail Driver。但是它们跟gDrive比起来,就实在是相形见拙了。gDrive是一个基于libgmailer的PHP脚本,当前版本为0.6。它可以利用Gmail的空间提供强…

【YOLOV5-5.x 源码解读】google_utils.py

目录 前言0、导入需要的包1、gsutil_getsize2、safe_download、attempt_download2.1、safe_download2.2、attempt_download 3、get_token、gdrive_download(没使用)3.1、get_token3.2、gdrive_download 4、作者注释的函数总结 前言 源码: YO…

千呼万唤始出来 Google GDrive将于4月初正式推出

早在5年前,WSJ就有传言称Google将推出云存储服务,而Google也在2010年宣称这项服务将允许用户进行文件和资料的在线存储,但一直没有正式推出该项服务。这次,看来Google是来真的了。 如果消息属实,Google GDrive将可能在…

Google云存储服务GDrive再度浮出水面

Google 要推出GDrive的传闻已经有一段时间了,而现在一个Google 搜索结果页面再度证实了这一传闻。在Google 搜索中如果你输入Writely,搜索的结果中你可以看到一个名为Platypus(GDrive)的测试页面。Writely.com是Google 于2006年收…

GDrive首次现身!

还记得GDrive么?自从它第一次出现在Google的泄露文档上,它就成为了世界关注的焦点。根据传言,GDrive将会是Google要推出的网络存储服务,类似于网络硬盘,但它的容量是无限的。在这个消息泄露后,Google马上把…