ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

EEGLAB数据导入完全指南:从原始设备格式到可分析数据集

EEGLAB数据导入完全指南:从原始设备格式到可分析数据集 1. 数据导入的整体思路与格式选择1.1 为什么导入环节值得单独拿出来讲很多刚接触EEGLAB的朋友第一次打开这个工具箱的时候第一反应基本都是界面好简洁啊一个主界面带几个菜单栏好像不复杂。然后数据一导各种问题就来了通道位置对不上、事件标签丢失、采样率不对、数据维度混乱、参考电极不存在。这些问题绝大多数都出在“导入”这一步。我见过太多人拿到的原始数据是好好的结果导入之后做出来的预处理结果惨不忍睹回去一查原来是导入时参数选错后续所有分析全部白做。所以你千万不要觉得“导入数据”就是把文件拖进去点一下而已。EEGLAB的导入环节本质上是在做两件事第一告诉EEGLAB你的数据长什么样格式、通道数、采样率、参考方式第二把原始设备文件转成EEGLAB内部统一的数据结构也就是.set文件加.fdt文件。这两个任务任何一个没做对后面全盘皆输。我在这里先把结论放在前面导入数据阶段你花的时间越多、检查得越细后面预处理和分析就越省心。这个投入产出比是非常划算的绝对值得认真对待。1.2 EEGLAB支持哪些数据格式怎么选EEGLAB本身是基于MATLAB的所以它的原生数据格式是.set结构体信息加.fdt二进制数据。但实际实验中我们拿到的原始数据往往是采集设备厂商的格式比如Neuroscan的.cnt和.eeg老牌ERP研究常用的设备CNT格式在EEGLAB里可以直接导入。Brain Products的.vhdr/.eeg/.vmrk国内很多实验室用的BrainAmp系列导出的是这种三件套。Biosemi的.bdf/.edfBiosemi设备的常见格式其中.bdf是Biosemi的扩展EDF格式。EGI的.mffEGI公司的设备尤其是HydroCel Geodesic Sensor Net用得多。ANT Neuro的.cntANT设备导出格式同样支持。通用EDF/EDF很多第三方设备或者公开数据集比如Sleep-EDF会提供EDF格式。MATLAB的.mat如果你用其他工具已经做了一些转换数据变成矩阵形式也可以导入。文本文件或Excel少数情况下有人把数据导出成文本再导进EEGLAB这种情况一般用于特殊场景。我的建议是能用EEGLAB原生支持的设备格式就直接用原生格式不要中间转成EDF再导入。因为中间转换容易丢失事件标记、通道标签这类附属信息特别是事件信息一旦丢了后续分段就没法做了。另外如果你的数据格式不在上面的列表里你还可以通过EEGLAB的插件机制扩展比如Biosig插件就是专门用来读取各种生理信号格式的装上之后能支持的格式会多很多。EEGLAB主界面菜单里的File→Import data→Using EEGLAB functions and plugins这一项就是调用了包括Biosig在内的一系列导入函数。2. 标准导入流程与关键参数设置2.1 GUI方式导入一步步点出来的数据EEGLAB majority的使用场景还是图形界面操作对于不熟悉命令行或者MATLAB编程的初学者来说GUI是最容易上手的。我来把最常见的导入路径拆开讲清楚。打开EEGLAB主界面之后按照这个路径操作File → Import data → Using EEGLAB functions and plugins → From Neuroscan .CNT file这里我以Neuroscan的CNT文件为例因为这是很多ERP实验室的标准格式。选了文件之后会弹出一个参数设置窗口这里有几个关键参数需要注意Data range数据范围如果你只想导入某一段时间段的数据可以在这里设置起始点和结束点。默认是导入全部数据我建议第一次导入先全量导入等确认数据没问题再做截取。Sampling rate采样率这个一般会自动识别但如果你发现导入后采样率不对检查一下这里。Reference参考电极这里要特别注意。设备记录时的参考方式比如左侧乳突、FCz、CZ要在这里选对。如果你选错了参考后续做重参考的时候会一团糟。File ID一些多文件采集的信息一般默认就行。设置完成后点OKEEGLAB会自动读入数据主界面上会出现数据集信息显示通道数、帧数、采样率、时间段等基本信息。同样如果你用的是Brain Products的设备路径是File → Import data → Using EEGLAB functions and plugins → From Brain Vis. Rec. .vhdr file会要求你选择.vhdr文件注意不是.eeg文件是那个头文件。它会自动匹配同目录下的.eeg和.vmrk文件所以三个文件必须在同一个文件夹里否则导入会报错。对于EDF/BDF格式路径是File → Import data → Using EEGLAB functions and plugins → From EDF/EDF/BDF files参数相对简单主要是确认通道标签是否正确识别。提示无论你用什么设备格式导入后第一件事永远是检查通道数对不对、采样率对不对、总时长和你的实验记录对得上吗。这三个基础信息如果错了别犹豫赶紧重新导入不要想着后面再补救。2.2 命令行方式导入批量处理的入口如果你要处理的数据量很大比如你有20个被试、每人4个block的EEG数据用GUI一个一个点会点到手抽筋。这时候命令行导入就是你最好的朋友。EEGLAB的导入函数基本上都有对应的pop函数格式统一用起来非常顺手。最常用的几个% 导入.set文件 EEG pop_loadset(filename, subject01.set, filepath, D:\data\sub01\); % 导入Neuroscan CNT文件 EEG pop_loadcnt(subject01.cnt, dataformat, auto, keystage, 1); % 导入Brain Products文件 EEG pop_loadbv(D:\data\sub01\, subject01.vhdr, [1 2 3]); % 最后一个参数是导入哪几个block % 导入EDF文件 EEG pop_biosig(subject01.edf); % 导入MATLAB矩阵假设你的数据是 channels × timepoints 的二维矩阵 EEG pop_importdata(dataformat, array, data, data_matrix, srate, 500, chanlocs, chanlocs);这里面我重点提一下pop_importdata这个函数。它其实是万金油任何格式的原始数据只要你把它整理成通道数 × 时间点的矩阵再用这个函数导入就能生成EEGLAB能够识别的数据集。很多用Python或者其他工具做预处理的朋友最后衔接EEGLAB做ICA分析的时候就是用这个函数把数据导入的。还有一点要提醒如果你在命令行里用pop_loadset导入之前保存的.set数据注意一定要同时指定filename和filepath两个参数不要只写一个。如果是当前工作目录下的文件可以简化写法但养成写全路径的习惯可以避免很多不必要的报错。2.3 导入后必须做的三个检查数据导入只是万里长征第一步。我个人的习惯是每次导入完数据不管是用GUI还是命令行必须做三个检查。这三步我已经做了上百次从来没有例外。第一个检查数据集基本信息。看主界面上显示的通道数和采样率。比如你的设备是64导导入后显示64 channels这个没问题。如果显示128 channels那你可能导入的是设备内部参考通道或者数据本身就不对赶紧排查。采样率同理设备是1000Hz记录导入后显示500Hz说明参数设置有问题。第二个检查通道名称和位置。这个在EEGLAB主界面的Edit→Channel locations里查看。如果通道标签都对比如Fz、Cz、Pz、O1、O2这些标准10-20系统的名字那你运气好设备导出的数据自带这些信息。但很多情况下通道标签是乱七八糟的比如1、2、3、4这样的编号这时候需要你手动去设置通道位置文件。第三个检查事件信息。这是最容易被忽略的。点一下主界面上的Event列表按钮就是那个写着“EVENT”的按钮看看里面有没有你的实验事件。如果你的实验设计了三种刺激条件每种条件对应的event type应该是不同的标签比如stim1、stim2、stim3而且数量应该跟你实验记录一致。如果事件是空的或者数量对不上后续做分段epoch的时候就什么都提取不出来。3. 实操记录从原始设备数据到可用的数据集3.1 文件组织从采集完到开始处理之间缺的一课我在实验室带新人的时候发现一个很有意思的现象很多人从设备上拷贝完数据就直接往EEGLAB里导也不管文件放在哪、命名规不规范。等到后面要处理几十个文件的时候才发现文件命名千奇百怪有的叫“data1.cnt”有的叫“张三实验数据.cnt”有的甚至叫“新建文件夹(2).cnt”这种混乱的命名会在后续的批量处理中把你逼疯。我强烈建议在采集完数据之后第一件事就是建立规范的文件夹结构。我自己的习惯是这样的D:\EEG_Project\ ├── 01_rawdata\ % 原始数据永远不动 │ ├── sub01\ │ │ ├── sub01_block1.cnt │ │ └── sub01_block2.cnt │ └── sub02\ ├── 02_preprocessed\ % 预处理后的数据 ├── 03_analysis\ % 分析结果 └── 04_scripts\ % 处理脚本文件命名规则我推荐用“被试编号_条件_日期”的格式比如sub01_face_20240520.cnt这样的命名一看就知道是哪个被试、什么条件、哪天采集的不用打开文件看内容才能回忆起来。3.2 通道定位与坏通道识别导入后第一个容易出问题的环节当你把数据成功导入EEGLAB之后紧接着就要面对通道位置信息和坏通道这两个问题。先说通道位置。如果你的设备自带通道位置文件导入时就能自动识别那自然是最好。但如果没有你需要手动设置。EEGLAB的Edit→Channel locations功能里可以选择标准10-20系统的通道位置文件也可以加载自己设备对应的位置文件。通道位置文件通常是.elp、.xyz、.locs、.sfp这样的格式。EEGLAB自带了一些常用的比如standard-10-5-Cap385.elp对应385个电极点位的标准10-5系统和standard_1020.elc对应标准10-20系统。如果你的设备导出的通道标签里带有标准名称比如Fz、Cz、Pz这种那么直接用标准模板即可。如果通道标签是数字编号你就需要找到设备厂商提供的通道位置文件。这里有个容易踩的坑通道顺序和标签必须一一对应。我曾经遇到过一个情况64导的设备导入后通道列表从1到64我以为这跟标准10-20顺序一致就直接套用了标准模板。结果后来发现这个设备的通道顺序是从枕叶O1、O2开始排的跟标准顺序正好反了。这意味着我后续所有分析中通道位置信息全部错位。所以我现在的习惯是每次做完通道定位都要画一个头皮地形图在通道位置设置界面点“Plot”按钮检查一下确保Fz在额叶、Oz在枕叶整体位置跟脑区解剖位置吻合。再说坏通道。坏通道的判断一般有几个标准一是某个通道的数据明显是平的没有波形二是某个通道的波形剧烈振荡或者噪声明显大于其他通道三是某个通道的数据和其他通道完全负相关或者相关性极低伪迹。在预处理阶段我们通常会用pop_rejchan函数或者手动在GUI里做坏通道剔除。如果你用的是64导或128导的高密度数据发现个别通道坏了不需要紧张这是正常情况。但如果你发现超过10%的通道都是坏的那你要考虑是不是设备本身有硬件问题别急着做数据处理先检查设备。3.3 重参考设置导入数据时最容易迷糊的地方在数据导入阶段有一个经常被忽略但实际上非常关键的设置就是参考电极reference。很多设备在采集数据的时候默认的参考点是某个位置比如左侧乳突、FCz、CZ等这导致你导入到EEGLAB里的每个通道的数据值实际上都是“该通道电位减去参考点电位”的结果。EEGLAB处理这个问题的方式是导入数据时你需要明确告诉它参考信息。pop_loadcnt函数里有ref参数有些格式也能自动识别参考信息。但很多时候我们拿到的数据参考信息不会自动加载进来需要你手动指定。如果你在导入时忘记设置参考或者数据本身不带参考信息也不用慌。你可以数据导入后在EEGLAB界面里做一次重参考操作Edit → Reference → Rerence...这里面最常用的选项有几个Average reference平均参考把所有通道数据的平均值作为新参考。这是目前很多论文推荐的做法尤其是高密度脑电数据。Linked mastoids双侧乳突平均参考把左右两侧乳突电极点的平均值作为参考。经典1060系统时代这是标配。Single electrode reference单电极参考指定某个电极作为参考比如Cz、FCz等。REST reference这是后来发展出来的参考方式基于源模型估计的零参考。EEGLAB的REST插件可以实现。我的建议是在导入阶段先把参考信息记录清楚但不要急着做重参考的最终决定。因为参考方式的选择和你后续要做的分析类型有关比如做ERP分析可能倾向于用平均参考或乳突参考做静息态功能连接分析可能倾向于用REST参考。导数据的时候把参考方式记录在笔记里比如注明“原始参考左侧乳突”等真正开始做预处理的时候再统一决定用什么参考方式。这里还有个非常常见的误区有些人一导完数据就立马做average reference然后在每个被试上重复这个操作。但其实你不用每个文件都手动去点可以用脚本来批量处理比如% 批量重参考到平均参考 EEG pop_reref(EEG, []);这个代码的[]代表全通道平均参考非常常用。4. 常见问题与排查技巧实录4.1 导入数据时的典型报错与解决对照我在带学生和处理自己的数据过程中遇到过各种各样导入报错的情况有些问题花了我很长时间才找到原因。这里我把最典型的几个整理成对照表希望能帮大家少走弯路。现象可能原因解决方案弹窗提示“Cannot open file”之类文件路径不对或者文件被占用比如采集软件还开着确认文件路径关闭所有占用该文件的软件重新导入导入后通道数不对参数设置错误或者设备文件包含参考通道/额外通道检查导入参数确认Data range和channel范围设置事件信息丢失事件类型不兼容或者事件文件与数据文件不在同一文件夹确认事件标记如.vmrk文件和数据在同一个文件夹查看事件列表采样率显示错误导入函数自动识别失败手动指定采样率或者检查文件是否被损坏数据只有一半时间或者中间有断点数据分段记录或者采集时有暂停确认采集参数多段数据需要先合并再导入内存不足报错数据量太大比如高采样率多通道长时间记录使用64位MATLAB分时段导入或者先降低采样率downsample关于最后一项“内存不足”的问题我多说两句。EEGLAB处理高密度长时程数据时确实很吃内存尤其是128导、1000Hz采样率、连续记录2小时以上这样的数据一个文件就可能好几GB。如果你的电脑内存只有8GB大概率会卡死。我自己的办法是在导入后立刻做两步操作一是降采样到250Hz或者500HzEEGLAB里是Edit→Data→Change sampling rate二是用带通滤波把无关频段滤掉Filter→Basic FIR filter这样数据量会大幅减少。但要注意降采样和滤波尽量在分段和ICA之前做这样可以节省资源又不影响后续分析。4.2 重参考操作中的典型误区前面提到重参考是导入阶段就需要注意的问题这里我展开讲讲实际操作中容易犯的错。误区一导入后忘了设置参考信息就开始预处理。这样做最直接的后果就是后续的ICA和伪迹剔除全部建立在错误的参考基础上结果不可靠。如果你的数据采集时的参考是左侧乳突但你导入后没有标注参考信息EEGLAB会默认认为数据已经是全脑平均参考或者参考信息未知后续做pop_reref时会发生错误。误区二平均参考等于什么都不做。很多教程都说“用平均参考”但没说明白的是pop_reref(EEG, [])这个操作实际上是把所有通道的平均值作为新参考并把原本的记录参考从数据中移除。如果你在执行完这个操作后又继续分析原始未重参考的数据那就是在错误的数据上做分析。误区三做完平均参考就万事大吉。平均参考有一个前提通道必须均匀覆盖全脑如果通道稀疏比如只有32导或更少平均参考的结果可能不理想。这时可以结合具体情况考虑其他参考方式。4.3 我在导入环节积累的三个小技巧最后分享几个我在实际工作中反复用到的技巧都是那种“官方文档里没有细说但实操中真的救命”的经验。技巧一用脚本记录导入参数。我在处理每个项目的数据时都会先写一个导入脚本把采样率、参考方式、通道数等参数都写在注释里然后保存到04_scripts文件夹。这样即使过了几个月再回来看这批数据也能清楚知道当初是怎么导入的。不要迷信自己的记忆力写下来才是真靠谱。技巧二导入后立刻保存一份.set文件。不要在主界面里把数据导完就直接继续做预处理先保存一次File→Save current dataset。这个习惯的好处是如果后续预处理的某个步骤搞砸了比如ICA跑崩了或者滤波参数调错了你可以随时回到原始导入状态重新开始不用从头再导入一遍原始设备文件。技巧三批量导入时善用.m脚本。前面我提到了命令行导入这里再给一个批量导入的简单框架% 批量导入多个被试的数据 subjects {sub01, sub02, sub03, sub04, sub05}; filepath D:\EEG_Project\01_rawdata\; for i 1:length(subjects) filename [subjects{i} _face_20240520.cnt]; % 导入CNT文件 EEG pop_loadcnt([filepath filename], dataformat, auto); % 设置通道位置如果需要 EEG pop_chanedit(EEG, lookup, standard-10-5-Cap385.elp); % 保存为.set格式 EEG pop_saveset(EEG, filename, [subjects{i} .set], filepath, D:\EEG_Project\02_preprocessed\); end这个脚本只是一个最小可用的框架实际使用中可以加很多扩展比如导入时同时记录参考信息、导入后画图检查波形等。有了这个脚本处理20个被试的数据就不再是噩梦了。还有个很重要的事如果你在导入数据时报错而且报错信息里出现了“Biosig”或者“loadkey”这样的关键词那多半是文件读取函数的问题。这时先别急着卸载重装EEGLAB试试在MATLAB命令行里运行which pop_loadcnt或者其他对应的导入函数确认函数路径是否正确。很多时候是因为EEGLAB工具箱没有正确添加到MATLAB路径里或者你同时装了多个版本的EEGLAB导致函数冲突。另外一个新手常踩的坑是MATLAB版本太老和最新版EEGLAB不兼容。EEGLAB的开发一直跟着MATLAB走的用的是比较新的MATLAB版本里的特性。如果你用R2014a之前的版本跑最新版EEGLAB结果真的不好说。我个人的建议是找一个稳定的组合比如EEGLAB v2023.0配MATLAB R2021a或更新版本这个组合我用下来一直很稳定。我个人在实际操作中的体会是导入数据这个环节虽然看起来非常基础但恰恰是整个EEGLAB处理流程中最能体现“基本功”的地方。你把导入的每一步都搞清楚了参数设置背后的逻辑都理解了后面所有预处理步骤就都顺了。反过来如果导入的时候草草了事到后面发现问题再回头排查那才是真的折磨人。最后再分享一个我最近才养成的小习惯每次导入完数据我会随手在主界面上截图保存一下数据集信息栏通道数、帧数、采样率、时长连同实验记录一起存到项目文件夹里。这个看起来毫不起眼的习惯在我后期写论文、回溯数据处理流程的时候给我省了不少事。数据处理的每一步都做到有据可查这大概也算是一个老处理者的自我修养。
返回列表