简介:Microstate EEGlab工具箱是一款面向EEG脑电数据分析的MATLAB插件,基于EEGLAB平台实现大脑微状态的全流程分析,适合认知神经科学、临床精神疾病等方向的研究者使用。压缩包共68个文件,以67个m脚本为主体,涵盖微状态分段、拟合、统计、平滑、拓扑图绘制等功能模块,另附1份markdown说明文档,包体仅229KB,轻量易部署。已有2286人学习下载,是入门与进阶微状态分析的实用参考。内容包含Microstate0.2、0.3、1.0及MST1.0多个版本代码,提供pop_micro_segment、pop_micro_fit、pop_micro_stats等系列函数,可直接集成至EEGLAB菜单操作,支持自动识别A/B/C/D典型微状态、生成时间状态图、比较持续时间与出现频率、分析状态转换模式,并具有数据导出能力,帮助研究者快速完成从数据预处理到统计解释的完整链条。 处理静息态EEG数据的时候,我一度特别头疼。习惯了事件相关电位那套“刺激锁时、叠加平均、看波形和地形图”的流程,面对一段没有任务、没有事件标记的自发脑电,总觉得无从下手。后来接触了微状态(Microstate)分析,才算是给静息态数据找到了一个“结构化”的抓手——把连续脑电看成一串离散的、可统计的准稳定状态,再用EEGLab生态里的Microstate工具箱把整条流程跑通。这篇就整理一下我从安装到出结果的全过程,以及那些文档里不会写的坑。
1. 静息态EEG散成一团,微状态如何把它变成可统计的序列
1.1 微状态到底是什么
微状态这个概念最早由Lehmann在1987年前后提出,核心发现很反直觉:多通道EEG的头皮电位地形图并不是每时每刻都在随机变化,而是在某个时间段内保持一种相对稳定的空间分布,持续大约60到120毫秒,然后迅速切换到另一种分布。这些“短暂稳定、快速切换”的地形图模式,就是微状态。
你可以把微状态理解成一部电影的“分镜脚本”。连续EEG像一段视频,每一帧的地形图都不一样,但如果把帧抽出来看,会发现很多帧其实在讲同一个“场景”——同一个地形图反复出现。微状态分析就是把这些反复出现的地形图模板找出来,然后逐帧给每一时刻贴上“现在属于哪个场景”的标签。这样就把一段无标记得让人无从下手的静息态数据,变成了一个可以统计状态时长、状态出现次数、状态切换顺序的离散序列。
这个思路能成立,生理基础在于头皮电位分布主要由皮层大范围同步放电的模式决定,而不同脑网络之间的切换不是杂乱无章的,有相对稳定的时序结构。所以微状态不只是“聚类聚类出几个图”那么简单,它背后对应的是大规模脑网络的活动序列。
1.2 四种经典微状态不只是玄学,背后有脑网络在支撑
大量静息态研究反复聚类得到的模板地图高度相似,于是形成了约定俗成的四种经典微状态:
| 微状态 | 地形图特征 | 推测相关脑网络 |
|---|---|---|
| A | 左后枕区负、右后枕区正,呈不对称分布 | 视觉/言语加工网络 |
| B | 双侧枕区对称分布 | 视觉网络 |
| C | 额中央区负、后部正 | 突显网络、自我参照加工 |
| D | 额区正、后部负 | 背侧注意网络 |
值得注意的是,这四种状态通常是在闭眼静息、1到30Hz滤波之类条件下得到的经典结果。你的数据如果换了一种任务、换了一个频段,或者被试群体特殊,完全可能聚类出四五个不同的地形图。不要为了贴近经典文献而硬凑四个状态,这一点后面会详细展开。
2. Microstate EEGlab工具箱安装与数据准备,底层打不牢后面全白跑
2.1 工具箱安装与数据规范
Microstate EEGlab工具箱可以走EEGLab的插件管理器安装:打开EEGLab,菜单栏选 File > Manage EEGLAB plugins > 搜索“Microstate”,选中后安装,重启EEGLab即可。在EEGLab的Extensions菜单下就会出现Microstate相关选项。也可以用GitHub下载源码,解压后放到任意目录,在MATLAB里用addpath(genpath('Microstate文件夹路径'))加入路径。
装好只是第一步,更关键的是数据本身得满足几个硬性条件:
- 通道数不能太少。经验上至少32导,建议64导或更高。16导以下做微状态聚类,地形图分辨率太低,空间模式分不开,聚类结果很不稳。
- 必须有统一的电极坐标文件。跨被试的组分析,所有被试的通道布局必须一致,且都加载了标准坐标(比如BEM或MN I的模板坐标),否则后续聚类的空间信息没法对齐。
- 采样率建议不低于250Hz。微状态最小时长几十毫秒,采样率太低会把持续时间参数严重高估或低估。
- 数据时长要足够。单个被试静息态数据最好不少于2分钟,太短了聚类出来的模板地图不可靠。
2.2 一份可以直接抄的EEGLab预处理代码
Microstate对预处理质量非常敏感,这比做频域分析要苛刻得多。原因在于聚类是在GFP峰值处提取地形图,而GFP会被眼电、肌电、坏导这种大幅值伪迹牵着走。如果预处理没做好,聚类出来的就不是脑信号状态,而是眨眼和肌电图谱。
下面这段是测量前静息态数据的基本流程,假设原始数据已经导入EEGLab:
% 加载原始set文件 EEG = pop_loadset('sub01_raw.set'); % 1. 带通滤波,微状态分析常用1-30Hz EEG = pop_eegfiltnew(EEG, 1, 30); % 2. 剔除明显坏导 EEG = pop_select(EEG, 'nochannel', {'PO7'}); % 3. 删除极端幅值段 EEG = pop_eegthresh(EEG, 1, 1:EEG.nbchan, -100, 100, 0, 2, 0); % 4. 清空参考并重参考为平均参考 EEG = pop_reref(EEG, []); % 5. 分段,比如切成2秒一段,便于后续剔除坏段 EEG = pop_epoch(EEG, {}, [-2 0], 'epochinfo', 'yes'); % 6. 运行ICA去除眼电心电伪迹 EEG = pop_runica(EEG, 'icatype', 'runica', 'extended', 1); % 7. 人工识别ICA成分并剔除,假设眼电成分是1和2 EEG = pop_subcomp(EEG, [1 2], 0); % 8. 再跑一次坏段剔除 EEG = pop_jointprob(EEG, 1, 1:EEG.nbchan, 5, 5, 0, 0);这一段不是标准答案,但整体逻辑是通用的:先滤波限制频带,再处理坏导和极端幅值,重参考后做ICA去伪迹,最后再清一遍坏段。注意步骤3和步骤8的顺序不能反,先粗清理是为了让ICA跑得更干净,否则眨眼的大幅值成分可能会干扰ICA分解。
2.3 预处理里最容易埋雷的三个地方
第一个雷是参考电极问题。做频域分析时参考选哪里影响相对小,但微状态分析看的本来就是头皮电位的地形空间分布,参考一变,所有电极的电位值整体平移,地形图形状都会变。所以聚类之前必须统一重参考为平均参考,而且要保证全组被试一致。
第二个雷是ICA成分剔除。很多人跑完ICA后凭感觉剔除第一二个成分,这在前额导联数据上通常没问题,因为眨眼成分往往排前面,但在某些被试上,肌电成分、心电成分也可能混进前几个成分里。我习惯的做法是同时看成分地形图和时程曲线,眨眼成分一般是额区前部对称、时程上有明显的瞬态大波动,确认了再剔除。
第三个雷是坏导插值。发现坏导之后不要直接把这个通道删掉了事,因为不同被试删掉的通道可能不一样,后面组分析的通道就不一致了。正确做法是用pop_interp在删掉坏导的位置上做球形插值,把通道找回来。插值之后通道数不变,而且地形图也不会出现一个明显的空洞。
3. 从GFP峰值到微状态地图:核心分析流程背后的原理
3.1 GFP峰值点为什么是聚类的首选样本
数据准备好之后,第一步是算全局场强(Global Field Power,GFP)。GFP的公式可以理解成所有电极信号在某个时刻的空间标准差:
GFP(t) = sqrt( (1/K) * Σ(V_i(t) - V_mean(t))² )
其中K是电极数,V_i(t)是第i个电极在t时刻的电位,V_mean(t)是所有电极在t时刻的平均电位。GFP越大,说明这个时刻各个电极之间的电位差异越大,地形图的对比度越强,信噪比越高。反过来,GFP接近0的时候,地形图基本是一片平坦的噪声,没有分类价值。
所以聚类不是拿所有时间点的地形图去聚,而是只拿GFP局部峰值时刻的地形图去聚。这相当于筛选出信号最强的“关键帧”。这一步既能减少计算量,又能避免大量低信噪比时间点把聚类结果稀释掉。
在Microstate工具箱里,这个步骤对应的是计算GFP并提取局部最大值点。相邻两个峰值之间的最小间隔一般设置成10到20毫秒,避免同一段稳定状态被重复取到多个峰值。
3.2 聚类怎么聚,GEV怎么用
提取完所有被试在GFP峰值处的地形图之后,你会得到一个大矩阵:行数是所有被试的峰值点个数之和,列数是通道数。接下来在这个矩阵上跑聚类,最常用的是k-means,把地形图分成K类,每一类的中心就是一个候选微状态模板地图。
聚类时一个必须做的操作是地形图归一化。每个时间点的地形图要除以该时刻的GFP值,变成单位长度的空间向量。否则GFP高的时候地形图模长大,聚类会被高幅值时刻主导,GFP低但形状清晰的时刻反而被忽略。归一化之后,聚类关注的纯粹是“地形长什么样”,而不是“信号有多强”。
聚类结束后怎么判断分几类合适?最常用的指标是全局解释方差(Global Explained Variance,GEV),它衡量的是这K个模板地图能解释原始地形图总方差的百分比。GEV越高说明模板对数据的解释力越强,但K越大GEV肯定越高,所以要在模型复杂度和解释力之间取平衡。一般K取2到8之间,看GEV的增量曲线,在增量明显放缓的那个拐点附近选K。文献里四状态的GEV通常能到70%到80%左右。
3.3 模板地图拟合回全时间点
聚类得到的K个模板地图只是“剧情角色表”,接下来要把每一时刻的脑电都归到某一个模板上,这一步叫拟合。
拟合的做法是计算每个时间点的地形图与K个模板地图的空间相关系数,哪个模板的相关系数最高,这个时间点就被标记为对应的微状态。在实际操作中,工具箱会输出一个逐帧的“微状态标记序列”,之后就能基于这个序列计算各种参数。
这里有个细节值得注意:拟合完成后,原始峰值点的地形图已经不再参与计算了,后续统计用的全是这套逐帧标记序列。所以拟合质量直接决定最终结果的可信度。拟合质量可以看两个指标:一是平均GEV,二是每个模板地图被分配到的帧数是否均衡。如果某个模板几乎没被分配到帧,或者GEV特别低,说明聚类时K值选大了,或者这个模板是伪迹地图。
4. K值、聚类点、平滑窗口:参数设置决定了结果能不能解释
4.1 K值怎么定,拍脑袋选4不一定对
很多初学者一上来就固定选4个状态,理由是文献里都这么做。但K值应该根据你数据本身的聚类质量来决定,而不是直接照搬。
判断K值比较稳妥的办法是跑一遍2到8类的聚类,每个K值记录对应的GEV、交叉验证一致性等指标。Microstate工具箱里能看到不同K值下GEV的曲线,我一般会倾向选GEV增量出现“平台期”之前那个K值。举个例子,如果K从3到4时GEV涨了8%,从4到5只涨了2%,那K=4就够用了;如果K从4到5还能涨6%,那继续选5才是合理的。
还有一类特殊情况:研究目的是组间差异比较时,K值必须在所有被试上保持一致,因为组间比较的是同一套模板地图下的参数差异。所以实际操作中是先做全体的组水平聚类,确定一个全局K值,再把这个K值套到每个被试上重新拟合。
4.2 地形图要不要归一化,聚类点怎么选
地形图归一化这件事在上面提过,再强调一次:必须在聚类之前做,而不是在预处理阶段做。有些工具会把归一化和聚类封装在一起,让你觉察不到,但如果你是自己写脚本,千万别漏了这一步。
另外还有一个选择:聚类时到底是只用GFP峰值点,还是用全部时间点?工具默认一般取GFP峰值点,这也是文献主流做法,因为峰值点信噪比最高,聚类结果更稳定。但如果你发现某个被试的GFP峰值点太少(比如数据质量差,很多峰值都是伪迹残留),可以适当放松峰值间隔,或者考虑这个被试是否应该纳入分析。
4.3 平滑窗口和最小持续时间
聚类和拟合完成之后,原始标记序列往往会有很多“毛刺”:同一个微状态刚出现一帧(几毫秒)就被另一个状态替换,然后又跳回来。这种高频切换大概率不是真实的神经过程,而是噪声造成的误分类。
处理办法是加平滑。Microstate工具箱里有平滑参数,一般设置为3帧或5帧的中值滤波窗,把孤立的小段合并到邻近状态。平滑之后还需要设置最小持续时间,比如50毫秒或60毫秒,短于这个时长的状态片段直接并入相邻状态。这样一来,最后得到的微状态序列就干净得多,持续时间和转换概率等参数也更合理。
需要强调的是,平滑和最小持续时间各有一个度。设置太狠会把真实的短时状态也抹掉,设置太松又会有大量噪声碎片干扰统计。我一般先用3帧平滑加50毫秒最小持续时长为基线,然后对比不同参数下的结果趋势,如果趋势方向一致就说明结果稳健。
5. 结果参数与统计比较:解读微状态,不要只看平均值
5.1 四个核心参数各代表什么
得到干净的微状态标记序列之后,可以计算以下四组参数:
- 持续时间(Duration):某个微状态单次出现的平均持续时间,单位毫秒。反映这种空间模式的保持能力。精神分裂研究中常见微状态C持续时间异常,因为这和突显网络、自我参照加工相关。
- 发生率(Occurrence):某个微状态在单位时间内出现的次数,通常用“次/秒”。反映这种模式被“唤起”的频率,对注意力网络的状态变化比较敏感。
- 覆盖率(Coverage):某个微状态持续时间总和占总时间的百分比。相当于这个状态在整段脑电中“出镜率”有多高,和对应脑网络的活动占比相关。
- 转换概率(Transition Probability):从一个微状态转换到另一个微状态的概率矩阵。反映脑网络之间的时序组织模式,可以用它看是否存在某个特定方向的异常切换。比如微状态C到D的转换概率在某些精神疾病中会发生改变。
这四个参数在同一个微状态上可能呈现出不同的组间差异模式,不要只看覆盖率就下结论。
5.2 组间比较用置换检验更稳
如果只是拿两组人的平均持续时间做常规t检验,容易忽略一个问题:微状态参数不是严格正态分布的,尤其是转换概率和发生率,存在明显的正偏态。样本量不大的时候,t检验的结果不太可靠。
更稳妥的方案是置换检验(permutation test)。流程不复杂:先计算两组之间的观察统计量(均值差或t值),然后把两组的被试标签随机打乱几千次,每次重新计算统计量,得到一个零分布。最后看观察统计量落在零分布的哪个位置,得到置换p值。这个做法不需要正态性假设,对异常值也稳健。
Microstate工具箱里通常内置了基于置换检验的组间统计模块,使用时只需要指定两组被试的微状态参数矩阵和组标签,运行就能得到每个参数每个微状态的p值。注意要多重比较校正。比如4个微状态乘以4个参数就有16次比较,不校正很容易出现假阳性。常用手段是FDR校正,虽然会把一些结果校正掉,但留下来的更可信。
5.3 报告结果时这些信息必须写全
微状态分析结果要可复现,论文里至少得写清楚:滤波器参数(高通多少、低通多少)、重参考方式、ICA成分剔除数量、聚类点选取方式(GFP峰值还是全点)、聚类算法(k-means还是AAHC)、K值确定方法、平滑窗口大小、最小持续时长、拟合方式(空间相关还是最小距离)、统计检验方法和校正方式。
这些东西看似繁琐,但实际上很多已发表文章恰恰是在这些细节上含糊,导致别人想复现都没法复现。我做项目时会把每一步参数都记在一个单独的实验参数表里,哪怕中间改过参数,也会保留每个版本的分析结果做敏感性分析。在审稿人眼里,这种透明度和稳健性检验,通常会让文章的可信度上一个台阶。
6. 一个容易忽略的细节:模板地图的方向与极性
最后说一个我踩过好几次的坑:微状态模板地图的极性问题。在微状态分析里,地形图的“方向”由电极间电位差决定,而整体乘以-1(即所有电极正负翻转)后的地形图,在空间相关性上和原图是完全一致的。所以在实际分析中,如果一个被试的微状态C模板和另一个被试的微状态C模板看起来只是正负极完全反了,通常应该把它们当作同一个状态来处理。
但这个约定大多数工具不会自动告诉你。跨被试聚类的输入数据如果某些被试的波形极性整体反了,聚类出来的模板和拟合结果都会受影响。处理方法是:在把数据送入聚类之前,检查数据有效性,确保不存在由参考或硬件接线导致的整体极性反转。必要时,可以用全脑平均电位作为参考后再确认一遍地形图方向的一致性。
我个人的习惯是,在聚类前把每个被试的GFP峰值地形图随机抽样画出来扫一眼,看是否存在明显的、成片的极性反转现象,有就排查导线和数据记录环节。这个步骤花不了几分钟,但能省去后面结果怎么解释都对不上的麻烦。
本文还有配套的精品资源,点击获取