ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

EEGLAB脑电预处理全流程指南:从数据导入到批处理

EEGLAB脑电预处理全流程指南:从数据导入到批处理 研一刚进组那阵子导师把一台脑电记录设备的U盘递给我说了一句先学会预处理再谈结果分析。那时候我对EEGLAB的认识仅限于听说它在MATLAB里免费、开源、功能全但真正打开软件之后面对一排菜单和白花花的波形整个人是懵的。这一篇就是写给同样刚入门、被EEGLAB预处理流程逼疯过的同学我会按自己实际跑数据的顺序把从安装、导入数据到重参考、滤波、ICA去除伪迹、分段基线校正再到批处理脚本的完整路径拆开讲包括每个环节为什么这么做、哪些地方容易踩坑、以及我花了一个多月才悟出来的判断标准。1. 开局装备EEGLAB安装、启动与数据导入的日常劝退1.1 装好MATLAB工具箱只是第一道坎先用我的亲身经历说明白EEGLAB并不是一个独立软件它是跑在MATLAB里的开源工具箱。所以你首先要有一份能正常运行的MATLAB然后在官网下载对应版本的EEGLAB压缩包。下载解压后要做的事情是打开MATLAB把EEGLAB目录添加到搜索路径中addpath(genpath(D:\eeglab\eeglab2024.x)) eeglab这里有两个容易被新手忽略的细节。第一解压路径里尽量不要出现中文更不要出现带空格的文件夹名。很多同学图省事把EEGLAB放在新建文件夹里最后脚本运行到某个函数时莫名报错排查半天其实路径编码就够喝一壶了。第二执行addpath之前先确认自己的MATLAB版本与EEGLAB版本兼容。我试过在旧版MATLABR2018a之前的版本里跑新版EEGLAB某些GUI窗口弹出时直接报Undefined function反而容易被误判成数据问题。如果你要做完整的预处理强烈建议同时安装几个常用插件clean_rawdata用于ASR自动清理坏段和坏导、ICLabel用于自动识别ICA成分类型、以及AMICA或者FastICAICA算法扩展。这些插件的安装方式通常是在EEGLAB的File Manage EEGLAB extensions菜单里在线安装也可以手动下载后放在eeglab的plugins文件夹下。1.2 数据格式与事件信息进来之前先搞清楚你手里的是什么东西安装完成后第一步并不是急着跑ICA而是想清楚你手上的数据是什么格式、从哪种放大器导出的。不同厂家对应的导入路径完全不同BrainAmp系列导出的BrainVision格式.vhdr/.eeg/.vmrk在EEGLAB里选File Import data From Brain Vision/Corel .dat files荷兰Biosemi系列常用的.bdf/.edf选File Import data Using EEGLAB functions and plugins From EDF/EDF/BDF filesNeuroscan的.cnt选File Import data From Neuroscan .CNT file如果是别人已经整理好的.set文件直接File Load existing dataset我第一次拿到的是BrainVision格式点完导入后看到EEGLAB主界面出现1: filename数据集的基础信息被读进来了。这时候先别高兴你要做两件事打开Edit Event values看事件编码确认刺激标记是否完整再检查采样率、通道数是否与实验设计一致。事件信息是后续分段的命根子如果一个实验设计了三种条件但这里只看到两个事件类型那很可能是导入时没有正确加载标记录或者数据同步出了问题。很多老手默认数据进来了就没事结果到epoch提取时才发现事件码全是乱的回头处理浪费好几天。1.3 通道坐标不加载坐标后面ICA和地形图都是空中楼阁这一步在大多数入门教程里被一笔带过但它是整个预处理链路里最容易被低估的一步。EEGLAB在进行ICA空间成分分解、绘制地形图、通道插值、以及后来做源定位时都必须依赖通道坐标。如果没有坐标很多功能要么无法运行要么画出来的地形图七扭八歪没有任何参考价值。在EEGLAB中点击Edit Channel locations会弹出pop_chanedit界面。如果设备是标准的10-10或10-20系统可以点击Look up locs选择标准模板如果是特定设备的64导或128导帽最好从厂家提供的布局文件.elc、.csv、.loc格式导入。我当时用的是64导BrainAmp直接选择标准模板后电极位置基本匹配但有个别电极位置被标记成No position需要手动在Search for a channel里面补上坐标。这里有一个我后来才悟到的经验做完通道定位之后一定要用Plot Channel locations画一次二维地形图用肉眼判断左右半球的电极排列有没有左右颠倒或前后错位。曾经有人在分析时发现左右半球不对称很诡异最后排查半天其实就是Channel location文件里有两个电极名顺序写反了。2. 重参考为什么换参考以及不同参考方案对数据做了什么2.1 参考电极不是地线重参考的本质脑电记录中每个通道记录的其实是该通道电位相对于某个参考电极的电位差。参考电极可以理解为整个记录系统的公共零点。很多同学下意识把参考电极当成地线这个类比并不准确地线是安全电势的概念而参考电极是测量时的零电位基准。既然参考只是零点理论上选哪个位置、选几个电极的组合都可以。但问题在于不同参考方案会直接影响每个通道的幅度和地形图。比如原本用左侧乳突做参考那么左侧颞区电极测出来的电位差天然会被压低右侧头皮电极的幅值则相对被抬高这种空间偏差会在组分析里混入系统性误差。重参考的目的就是把这个偏掉的零点挪到一个对全脑各区域更公平的位置上。在EEGLAB里操作重参考非常容易步骤是Tools Re-reference to average...或pop_reref函数。但容易的是点按钮难的是理解你要哪种参考。2.2 平均参考、CPz参考、乳突参考怎么选目前主流期刊里常见的参考方案有三类平均参考将全部头皮电极的信号取平均值作为零点。这个方法在高密度记录中应用较广因为通道数量越多全脑平均就越趋近于一个相对中性的零点。但要注意如果只有三五个通道平均参考会引入很大的偏差所以它适合高档密集型导联帽。双侧乳突平均参考采集时很多系统会用单个乳突做参考后期取左右两侧乳突的平均值以减小单侧参考带来的不对称性。ERP研究中在双侧乳突均有记录时比较常见。CPz/Cz单个电极参考很多脑电帽在线采集默认使用CPz或Cz作为参考。优点是阻抗容易控制、信号稳定缺点是参考点本身存在活动近参考点的电极幅度会被明显压低。看到这里你应该明白没有任何一种参考方案是绝对真理关键是要与实验设计、后续统计方法和文献常用口径保持一致。我的做法是在写实验方案时直接跟导师确定好参考方式不要等数据全处理完再翻文献改参考。2.3 在线CPz参考想转平均参考时那个要命的复选框这是很多小白第一次折戟的地方。如果原始采集时用CPz做在线参考但是该设备在记录时没有把CPz单独记录为一条通道那么你直接利用Tools Re-reference转换为平均参考结果会发现CPz附近的通道波形出现奇怪的塌陷这是因为CPz原本是零点它的真实活动在记录时被抹掉了重参考时它无法参与平均。正确的做法是在重参考对话框里找到关于是否将当前参考通道加回数据的选项。以pop_reref为例参数keepref如果设置为on表示如果参考通道有作为通道被记录那么会在重参考前先把其活动恢复回来再参与平均。如果设备根本没有记录参考通道那无论如何也无法无中生有恢复CPz的活动这时候你能做的只有尽量采用双侧乳突平均参考或者考虑在设备中增加参考通道的记录。所以采集数据之前务必在记录软件的设置里把在线参考通道同步保存为一个额外通道。这句话值得写在实验日志的第一页。3. 滤波不是随便填几个数字高通、低通、陷波和它们引起的坑3.1 高通频率到底选0.1还是1Hz背后是慢波残留与ICA稳定性的拉扯滤波是整个预处理中参数选择最混乱的环节。最常见的争论就是高通频率。高通滤波的作用是去除信号里的极低频漂移比如出汗、电极极化、缓慢移动造成的基线偏移。如果高通截止频率设得太低如0.01Hz对慢波的保留最好但低频漂移不能有效去除如果设得太高如1Hz基线非常稳ICA也很容易收敛但P300、ERN、CNV这类低频慢成分会被严重削弱。我个人的习惯是分两步走。如果研究目标是ERP且实验设计里有慢成分尽量先用0.1Hz高通。如果数据里面漂移太大、ICA都不稳定再考虑临时用1Hz高通ICA完成后移除伪迹成分再把滤波下限调整回0.1Hz。但这里必须说清楚被早期高通滤掉的真实低频成分并不会因为后续重滤波而恢复所以这是不得已的折中不是常规操作。EEGLAB里常用的是pop_eegfiltnew函数EEG pop_eegfiltnew(EEG, 0.1, 30); % 0.1Hz高通30Hz低通滤波之后务必看一下波形如果出现明显的震荡尾巴可能是截止频率附近过渡带太陡峭需要检查是否启用了过高的阶数。EEGLAB新版默认会用FIR滤波相对平稳但如果你手动指定了一个极窄的过渡带仍然可能引入振铃。3.2 低通上限怎么定ERP、时频和情绪研究的差异低通截止频率的选择取决于你关心的频段。经典ERP研究通常用30Hz甚至40Hz做低通因为大多数ERP成分的能量在低频段如果你关心的是高频gamma活动或者肌电与脑电的区分低通可能设在100Hz甚至150Hz。但低通设置得越高越容易保留肌电和其他高频噪声对后续ICA去伪的负担也越大。一个容易忽略的原则是滤波参数必须在整个实验的所有被试间保持一致。你不能因为某个被试数据基线漂移严重就把高通改成1Hz另一个被试又用0.1Hz这样组分析出来的差异到底是条件效应还是滤波参数造成的根本没法定论。正确的做法是整个项目确定一套固定的滤波参数和顺序所有被试完全一致地执行。3.3 市电干扰不是只有50Hz陷波一条路中国电网交流电频率是50Hz部分国家是60Hz市电干扰会在脑电数据上形成非常明显的窄带谱峰。很多新手第一反应是直接加一个50Hz陷波滤波器。这里要提醒你陷波滤波器在去除50Hz成分的同时可能会在时间透镜上造成局部的振铃让波形产生人为的煎饼边缘效应。更稳妥的思路是先看频谱确认50Hz干扰到底有多强、分布在哪几个通道。如果只在少数通道明显优先考虑把这些通道剔除或插值而不是全数据陷波。如果全通道都有明显50Hz峰可以试试clean_rawdata插件提供的cleanline方法在EEGLAB的插件里也能调用它通过估计线噪声的幅度和相位来减掉噪声比简单IIR陷波温和不少。我自己的数据里市电干扰不算严重最后选择了在ICA阶段把单独辨识出的50Hz成分去掉效果也不错。4. 坏导联、坏段与ICA预处理中最耗时的三座大山4.1 怎么判断一根导联是坏的从肉眼到指标数据分析里没有绝对坏的标准我对坏导联的理解可以概括成三类一是数据完全平坦也叫flat line通常是电极接触不良或放大器饱和整根导联几乎没有变化二是大幅度漂移或噪声噪声大到把真实脑电信号完全淹没三是阻抗异常导致的单个通道明显高出其他通道几个量级的尖刺。对于这些坏导联处理方式不是直接删除而是记录下来并在ICA之前剔除等到ICA完成之后再插值回原来位置。在实际操作中我一般是先看一遍连续数据的滚动图在最下方通道排列里哪根通道的波形明显异常先记下来。如果数据量太大可以用pop_eegthresh做一个初步的按幅度拒绝调用eegplot手动视觉检查。需要注意的是不要因为某个通道偶尔出现一个大的噪点就觉得它是坏导联判断坏导联时更看重的是整段时间内的持续表现。4.2 ICA之前先看清楚模式为什么我建议先剔除坏段再跑ICAICA是一种盲源分离算法它的目标是找出相互独立的源成分。当数据里存在幅度极大的伪迹段时ICA会花很大的模型自由度去拟合这些伪迹甚至会影响到对正常脑电成分的分解效果。因此我建议在运行ICA之前先把肉眼可见的强伪迹段尽量排除掉。你可以用Tools Reject continuous data by eye手动选择并删除某些时间段也可以用clean_rawdata里基于ASR的自动清理做初步处理。但是这里要给一个非常重要的提醒如果研究的是严格定量的ERP波幅或潜伏期ASR这类自动修复并不一定安全。ASR会把超过统计边界的大幅噪声段重构掉这有可能同时改变部分真实的神经响应。对于入门操作来说最稳妥的方案是用ASR仅清理极端的坏段而不用它修改正常段。任何自动步骤都要时刻保留原始数据备份不然出了问题时没有回头路。4.3 认识眼电成分的长相地形图、时间过程和频谱线索跑完ICA之后主界面上会出现几十个成分。新手最容易困惑的就是我到底该删哪几个成分其实眼电成分在数据里是有明显长相的。眨眼成分的地形图通常集中在前额区域呈一个从眼球向前额扩散的梯度时间过程上有一个个突然的大幅度脉冲频谱能量主要集中在低频。左右扫视眼跳成分的典型特征是地形图在左右前额区呈现对称的电位差分布时间过程和频谱上也能看到对应的高幅低频活动。EEGLAB的ICLabel插件可以自动输出每个成分属于Brain、Muscle、Eye、Heart、Line Noise等类别的概率值。一般情况下我会先看ICLabel给出高概率的眼电成分再在地形图和时间过程上确认一遍。谨慎的同学可以再结合pop_selectcomps弹出的多维度视图检查。不要无脑照搬ICLabel的判断因为不同数据质量的成分概率边界可能变化很大。4.4 移除成分之后再做通道插值这个顺序不能乱为什么要强调顺序如果你在ICA之前就把坏导联插值了那么坏导联原本数据中可能存在的伪迹会被扩散到周围的好通道上ICA分解的时候就容易形成不干净的成分。正确的流程是先剔除坏导联在通道列表中移除并记录然后跑ICA、移除伪迹成分最后再用Tools Interpolate electrodes把之前剔除的坏导联插值回来。插值方法一般选spherical球面样条插值它通过邻近通道的空间光滑性来估计缺失电极位置的信号。这样做的好处是最小化了坏导对ICA和成分识别的影响同时也为后续的统计和地形图保留了完整通道数。但如果坏导联数量特别多比如超过总导联数的15%~20%插值的结果已经不可靠了这时候更明智的方法是直接报告多少个通道被排除而不是硬插值。5. 分段、基线校正与最终检查让数据变成可统计的样子5.1 提取epoch事件类型和时间窗口怎么定连续数据清理到这里就可以让它变成试次trial的形式了。在EEGLAB中点击Tools Extract epochs选择你关心的事件类型设定时间窗口。时间窗口要根据实验任务来比如研究视觉ERP刺激前200毫秒作为基线刺激后800毫秒作为反应窗口是比较常见的做法如果研究决策或反馈相关成分可能需要延伸到1000毫秒以上。提取epoch时注意一个细节事件标记里的条件名和实验设计是否一致。有的设备导出来的事件编码是数字如1和2有的直接是字符串如StimulusPositive。如果你在提取时选错了事件类型后面统计分析的麻烦会直线上升。我的习惯是提取epoch之前先打开Edit Event values再看一遍标记分布确认无误再操作。5.2 基线校正到底校的是什么基线校正做的事情非常简单用一段基线窗口内的平均幅度作为该试次的零基准把基线窗口内的平均值从整个epoch中减掉。通常选择的基线窗口就是刺激前的那段窗口比如-200~0ms。很多同学会问数据不是已经做过高通滤波了吗为什么还要做基线校正这是因为即使高通滤波去掉了大部分低频漂移单个试次在刺激前仍然可能残留一个非零的直流偏移这个偏移如果不减掉会影响对刺激诱发成分的幅度测量。基线校正能保证每个试次都在以刺激前平均水平为零点的状态下进行比较。在EEGLAB里可以用Tools Baseline correction设置基线窗口也可以用ERPLAB来做。如果用脚本通常是EEG pop_rmbase(EEG, [-200 0]);基线窗口的选择并不是越宽越好太宽容易把刺激前存在的其他偏移也加进来太窄则噪声较大。最稳妥的做法是先看不同试次的刺激前波形是否平缓再来决定窗口宽度。5.3 出结果前的最后体检分段和基线校正之后还要再做一次试次级别的伪迹排除。常用方法是用pop_eegthresh设置幅度阈值例如超过±100µV就剔除该试次但这只是一个粗略筛子某些肌电叠加但平均幅度不超阈值的试次可能漏网。所以更细致的检查仍然建议回到滚动波形或者用ERPLAB的Artifact rejection in epochs功能看试次列表。我自己在预处理接近尾声时还会再做三件事第一检查每个条件下剩余试次数是否达到统计分析的最低要求第二把所有被试的剔除试次数和剔除原因记录成表第三保存最终数据集时用一个清晰命名的文件名比如subj01_clean_erp.set。这些习惯看起来琐碎真正写论文方法部分和回复审稿人意见时会帮你省下巨大的精力。6. 从GUI到脚本一个人处理40个被试的批处理思路6.1 为什么必须存档、必须记录每一步用GUI点按钮虽然直观但如果一个实验有40个被试每个被试都手动点几十个步骤不仅效率低还很容易出人为差异。更糟糕的是如果你忘了记录某个被试在某个时间点具体用了什么参数后续写方法节时只能靠记忆补这在可重复性要求越来越严格的今天几乎是致命的。我的做法是把整个预处理流程固化成脚本使用统一的参数每个被试只改文件名。这样所有被试的处理路径完全一致而且每一步都留下了痕迹。如果你担心脚本出错可以在处理第一个被试时逐行执行、观察中间结果确认没问题后再批量跑。6.2 一个可供改写的EEGLAB预处理流水线脚本下面给出一段我实际用过的流水线雏形你可以根据自己的数据格式和实验设计做修改但是核心思路可以沿用clear; clc; eeglab; % 加载原始数据集BrainVision示例 EEG pop_loadbv(data_path, subj01.vhdr); % 1) 定位通道 EEG pop_chanedit(EEG, lookup, standard-10-5-cap385.elp); % 2) 剔除明显坏导先保存在变量 badchans 中假设第3和第20个通道判断为坏导 badchans [3, 20]; EEG pop_select(EEG, nochannel, {F3 T7}); % 示意按名称剔除更安全 % 3) 重参考到平均参考 EEG pop_reref(EEG, []); % 4) 滤波 EEG pop_eegfiltnew(EEG, 0.1, 30); % 5) 自动手动清理坏段示意使用clean_rawdata仅清理极端坏段 EEG clean_rawdata(EEG, FlatlineCriterion, off, ... ChannelCriterion, off, ... LineNoiseCriterion, off, ... Highpass, off, ... BurstCriterion, 20); % 6) 运行ICA EEG pop_runica(EEG, icatype, runica, extended, 1); % 7) ICLabel标记成分 EEG pop_iclabel(EEG, default); % 8) 手动或按ICLabel概率标记需要剔除的成分这里用rej_manual示意 rej_components [1, 2, 5]; EEG pop_select(EEG, rmcomps, rej_components); % 保存成分剔除记录 % 9) 插值坏导 EEG pop_interp(EEG, bad_channel_file, spherical); % 10) 提取epoch并做基线校正 EEG pop_epoch(EEG, {S1, S2}, [-0.2 0.8]); EEG pop_rmbase(EEG, [-200 0]); % 11) 保存最终文件 EEG pop_saveset(EEG, filename, subj01_clean_erp.set, filepath, output_path);实际使用时请把注释里的示意替换成你数据里的真实通道名、事件名和坏导检测方式。脚本化最大的好处是参数集中在一起、好排查。6.3 常见错误和逐条排错经验把这一段放在最后是因为绝大多数问题只有在你亲手处理过数据后才会遇到。我列几个最典型的cannot find function或undefined报错优先检查插件是否安装、路径是否包含不要第一反应怀疑数据。很多插件对MATLAB版本有要求查插件文档比猜效率高得多。事件标记全部空白多半是导入时数据结构不兼容或参考通道记录被误当成事件通道。回头确认导入参数里的通道类型设置。ICA在部分被试上运行极慢如果数据量太大可以先对数据做降采样但注意降采样前需要把低通滤波设置在目标采样率的1/3以下否则会发生混叠。重参考后波形出现明显高压帽检查是不是没勾选把原参考通道恢复回来原因见前面2.3节。批量处理时第10个被试失败不要轻易继续跑要先检查失败原因可能是某个被试的通道数或事件类型与其他人不同。最后分享一个我个人的强迫症习惯每处理完一个被试我在Excel里记三行信息——坏导联哪些、ICA删了哪几个成分、ICLabel判定的最大概率成分类别。一开始觉得记录麻烦后来写论文方法部分时基本就是把这些记录翻译成一段英文描述连翻聊天记录的功夫都省了。这种记录习惯可能比任何预处理菜单技巧都更能让你少走弯路。
返回列表