☰
脑电微状态分析实战:Microstate EEGlab工具箱从预处理到统计全流程经验
2026/10/14 23:01:28 网站建设 项目流程

简介:Microstate EEGlab工具箱是一套面向脑电数据分析的MATLAB工具箱,基于EEGLAB平台,专注于大脑微状态的自动识别、分割与统计评估。它适合认知神经科学、临床精神疾病研究等领域的科研人员,可处理静息态或任务态EEG信号,将约40–80毫秒的电位拓扑模式归纳为A、B、C、D等微状态类型。资源包共68个文件,包含67个可直接运行的.m函数和1个.md说明文档,压缩后仅229KB;预览可见Microstate0.2、0.3、1.0及MST1.0等多个版本,覆盖微状态分割、fitting、smoothing、统计、绘图及EEGLAB插件注册等完整流程。已有2286人浏览学习。用户可获得一套结构清晰的工具箱源码,快速实现微状态序列提取、时间-状态图绘制、常用统计指标比较以及不同条件/群体间的微状态转换模式分析,同时通过多版本文件追溯算法演进,便于二次开发或复现研究结果。 做脑电的都知道,预处理只是起点,真正让人头疼的是怎么从高维、高噪声的数据里把“有用的大脑状态”挖出来。Microstate EEGlab工具箱(Microstate-EEGlab-工具箱)就是干这个的——它在我熟悉的EEGlab环境下,把微状态分析的完整流程打包成一套相对顺手的工作流。我在多个静息态和任务态数据集里跑过这个工具箱,从数据预处理到聚类再到统计,踩了不少坑,也摸出了一些门道,这篇就把我的实操经验和心得完整分享一下,希望对正在做微状态分析的同学有帮助。

1. 这个工具箱到底解决什么问题

1.1 微状态说的是什么

脑电信号虽然看起来是一堆乱糟糟的波形,但如果把它按时间切成很小的片段,你会发现头皮电位分布其实只在少数几种稳定的“地形图”之间来回切换。这些稳定的地形图就是微状态(Microstate),可以理解为大脑在处理信息时的“基本词汇”。不同的微状态对应不同的功能网络,比如视觉网络、默认网络、注意力网络,它们的切换规律能反映认知活动和精神状态的变化。

传统分析微状态的方法是把每个时间点的地形图看成高维向量,逐帧做聚类,再把聚类结果映射回时间轴。这个流程本身不复杂,难的是步骤多、参数多,而且很多细节处理不好结果就全变了。Microstate EEGlab工具箱的价值在于把这些步骤(提取地形图、聚类、拟合回原数据、计算微状态指标)整合起来,在EEGlab的操作框架里就能完成,避免了在多个软件之间来回切换的麻烦。

1.2 从EEGlab工作流到Microstate分析的衔接

做脑电研究的人大多数都用过EEGlab,它做预处理(滤波、去伪迹、ICA)确实方便。但EEGlab本身没有内置微状态分析功能,以前我得把预处理好的数据导出来,再写一堆脚本或者用其他软件(比如Cartool)去分析,中间还要处理格式转换、通道顺序对齐这些问题,非常费劲。

Microstate EEGlab工具箱相当于在EEGlab的菜单栏里加了一组微状态分析入口,数据不用导出,预处理完直接在EEGlab环境里就能做微状态分析。对于已经习惯EEGlab操作流程的人来说,这个衔接非常自然,学习成本很低。如果你的数据预处理和微状态分析能在同一个软件里搞定,中间少了很多格式转换和数据搬运的步骤,出错概率也会小很多。

2. 数据准备与预处理的关键细节

2.1 环境配置和安装要点

这个工具箱本质上是一组Matlab脚本和函数,需要运行在Matlab环境中,并且依赖EEGlab的底层数据结构。安装方式就是下载源码后把文件夹加入Matlab路径。我建议把工具箱文件夹放在EEGlab的plugins目录下,这样EEGlab启动时会自动加载,菜单栏会多出微状态分析相关选项,操作上很省事。

Matlab版本方面,我试过R2019b到R2023a,都能正常跑通。稍微需要注意的一点是,新版Matlab对部分旧函数的兼容性做了调整,如果你用的是比较旧的工具箱版本,在R2023a以上可能有函数弃用警告。如果你遇到类似问题,最简单的方法就是去Github拉最新的源码,或者找作者维护的插件版本,通常能直接解决。另一个容易忽略的点是,Matlab的并行计算工具箱如果有的话尽量开启,后面聚类那一步有并行版本的话提速非常明显,尤其在数据量大的时候。

2.2 预处理步骤中直接影响微状态质量的三个环节

微状态分析对输入数据的质量高度敏感,很多结果不可复现的根源就是预处理没做到位。我总结了三个影响最大的环节。

第一是滤波。微状态分析通常关注的是大脑皮层的突触后电位活动,我一般设置带通滤波为0.5-40Hz或1-30Hz。低频滤波太松(比如低于0.5Hz)会残留慢漂移,导致地形图在相邻时间点上高度相似,聚类出的微状态数量容易被低估;高频滤波太紧(比如低于20Hz)又会把一些高频的Gamma活动丢掉,可能漏掉一些短时程的微状态切换。市电干扰(50Hz或60Hz)用带阻滤波器或者EEGlab的CleanLine处理一下就够,不必额外做太多频率限制。

第二是坏导和伪迹处理。这也是我踩坑比较深的地方。坏导如果不插值,聚类时会把伪迹作为一个“微状态”硬生生地聚出来,那种结果一眼假——地形图只在坏导位置有极高幅值,其他导联都没什么活动。正确的做法是先把坏导标出来,用EEGlab的插值功能(pop_interp)插值后再做ICA。插值对微状态分析的影响不大,因为地形图本来就做了一定空间平滑,但至少不会被单通道的大噪声带偏。

第三是ICA去伪迹。眼动、眨眼、心跳这些伪迹在微状态分析中非常致命,因为它们产生的电位分布模式能量很大,会在聚类时占据很大的权重,盖过真正有意义的神经活动。我一般先用EEGlab跑AMICA或runica,然后通过ICLabel自动打分,再手动结合地形图和频谱图确认哪些分量是伪迹需要剔除。这里有个小技巧:去除IC后建议重新参考一次(average reference),因为ICA前后信号的参考电位可能改变,而微状态分析对参考选择很敏感,统一为标准平均参考才能保证不同被试之间的地形图有可比性。

3. 核心分析流程实操:从地形图到微状态指标

3.1 步骤一:提取地形图。GFP峰值是关键

微状态分析的第一步是确定哪些时间点上的地形图能代表该时段的主要状态。这里就要用到全局场强(Global Field Power, GFP),它的计算方式是对每个时间点的所有通道幅值求方差再开平方,物理意义上反映的是这个时刻全脑电活动的总强度。GFP曲线上的峰值点,信噪比最高,地形图最稳定,是后续聚类的最佳候选对象。

工具箱里的操作一般是在菜单里选择提取GFP峰值,然后设置阈值参数(比如峰值间隔、局部窗口大小)。我通常设置peak detection的最小间隔为10-20ms,也就是相邻两个峰值至少相隔这么远,避免把同一个波峰的多个毛刺都选成峰值。如果你用的是静息态数据,我会额外注意分段边界的影响,在分段时预留一些边缘时间让峰值检测在两个分段之间保持一致性。提取出的峰值点数量取决于数据长度,一般几分钟的静息态数据能提取出几百到上千个峰值点,正好够下一步聚类使用。

3.2 步骤二:聚类确定微状态数目。K值不是越大越好

聚类是决定微状态地图质量最核心的一步。工具箱一般支持两种主流算法:K-means和AAHC(Atomize and Agglomerate Hierarchical Clustering)。我自己的经验是,K-means速度快、可重复性好,适合数据量大的初筛;AAHC的结果在拓扑结构上更稳定,尤其适合小样本或单被试分析,但计算量明显更大。如果你要发文章,建议用AAHC作为正式结果,因为它不依赖于随机初始化,结果更稳健,审稿人问起来也好解释。

接下来最关键的一步是确定微状态数目K。很多新手一上来就默认K=4,严格来说这是不对的。K值的选择有客观方法,工具箱一般会提供全局解释方差(Global Explained Variance, GEV)曲线和交叉验证准则。我的建议是:先跑K=2到K=10(或K=15),然后看GEV曲线在哪个K值附近出现拐点,也就是增幅明显放缓的位置。靠经验来说,静息态数据通常取K=4-7,任务态则要看任务复杂度,简单视觉任务可能只需要4个,复杂认知任务可能需要6-8个。但最终选多少,最好结合你的研究假设和已有文献来决定,用交叉验证的谷值和拐点联合判断。选K值时要记得:K越大GEV肯定越高,盲目追求高GEV会让微状态变得碎片化,失去“稳定基本状态”的意义,得不偿失。

3.3 步骤三:用原子态地图拟合回原始数据

聚类完成得到K个模板地图后,下一步是把这些模板与原始数据逐时间点匹配,也就是“拟合”。拟合的过程本质上是计算每个时间点的地形图与K个模板地图的空间相关性,哪个模板相关系数最高,就把这个时间点归到对应的微状态。

工具箱里拟合通常有两种策略:一是先识别GFP峰值点上的微状态标签,再把标签扩展到其他时间点;二是对每个时间点都做全量拟合,不管它是否位于GFP峰值。我倾向于使用后一种——全量拟合(也就是在EEGlab工具中选择拟合到所有时间点),因为它能获得每个时间点的连续微状态序列,后续计算持续时间、转换概率才更准确。如果只用峰值点拟合,会丢失大量非峰值时间点的状态信息,得到的指标会系统性偏差,尤其在持续时间较短的任务态数据上影响很大。

拟合时工具箱会输出两个重要结果:一个是全局解释方差(GEV),表示模板地图对原始数据的解释程度;另一个是每个时间点的空间相关性数组。我通常先检查一下GEV值,如果整体大于70%-80%,说明K个模板能较好地代表原始数据。如果你发现GEV特别低(比如低于60%),说明数据里可能还有大量伪迹没去除,或者K值太少,这时候先别急着往下算指标,回到预处理或聚类步骤排查一下。

3.4 步骤四:计算微状态指标。持续时间、出现率、转换概率和覆盖时间

拟合完成后,就能计算各种微状态指标了。常用的主要有四类:平均持续时间(某个微状态从开始到结束的平均时长)、出现率(单位时间内某个微状态出现的次数)、覆盖时间(某个微状态占总时间的百分比)、转换概率(从一个微状态转换到另一个微状态的概率矩阵)。这些指标分别从不同角度刻画了微状态动态特征,实际使用时需要根据需要选择。

我在实际处理中有一个重要的经验:微状态指标的计算受“最短持续时间”参数设置影响很大。工具箱里一般会设置一个最小持续时间阈值(通常10-30ms),把小于这个阈值的片段合并到相邻状态。太短的微状态(比如只有几个毫秒)很可能是拟合噪声导致的假阳性,统计上没什么意义。如果不设置这个阈值,你会发现个体间的噪音敏感度差异非常大,组间差异显著部分充满随机波动;设置合理阈值后,结果一下清晰很多。但阈值也不能设太高,否则会把一些真正快速切换的状态也抹掉。对静息态数据,我用30ms比较多;对任务态,如果任务本身要求快速认知切换,我会放宽到15ms左右。

4. 参数选择的策略与常见问题排查

4.1 微状态数量K。为什么你的结果和别人不一样

初次接触微状态分析的人最容易问:为什么我用K=4跑出来的微状态拓扑和文献报道的不一样?这里面的原因很多,但最常见的却是两个:一是你预先设置了不同的K值或者用了不同的聚类算法;二是你的预处理流程(尤其是滤波范围和参考电极设置)和别人不一样。再有就是你跑微状态分析时用的是个体的地形图还是组平均地形图,这两种做法的结果差异非常大。

组平均的做法是将所有被试的GFP峰值地形图拼在一起做一次聚类,得到一组“组级模板”,然后把这个模板拟合回到每个个体的数据中。个体做法则是每个被试单独聚类,得到各自的模板,然后统计指标。绝大多数文献用的是组平均做法,因为个体聚类容易出现个体间模板对不齐的问题,组间比较时需要额外做地图匹配。工具箱默认支持组平均流程,这一点设计得比较省心。但要注意:如果你想发表研究,必须在方法部分写清楚用的是哪种聚类策略,这会影响结果的可解释性和可重复性。

关于地图匹配:无论是组间比较还是个体与组模板比较,都需要确定模板间的对应关系。常见的方法是同一定义下的空间相关最大化,或者直接用Hanggi等提出的循环排列法。工具箱里一般有smoothsort或类似的地图排序功能,用起来很方便。但有个坑是地图的极性问题——微状态地形图乘以-1后物理意义完全不同(正负极性对应不同的源方向),但空间相关的绝对值可能不变。如果你在比较两组模板时没有正确对齐极性,会把两个完全不同的微状态误判为一个,或者反之。我见过一些新手在结果中报告微状态A在组间显著差异,结果一看是极性对齐错了,把A和B的负数混在一起了。这个一定要反复检查。

4.2 常见错误和解决方案速查

问题可能原因我的处理方式
聚出的地形图有大量噪声形状数据预处理不彻底,尤其是ICA去伪迹不干净重新检查ICLabel打分,重点看眨眼和心电分量,重新插值坏导
微状态数量不稳定,换一次聚类结果变一批使用了K-means且初始值随机;数据量太少改用AAHC,或固定随机种子,用多个种子跑多次取最稳定解
GEV太低(<60%)K值太小,或者数据中残留大幅伪迹增加K值范围上限(比如K=2-10),重新检查预处理质量
微状态持续时间异常短(平均<20ms)最小持续时间阈值未设置或设太低在拟合后设置最短持续时间至少在20-30ms
组间差异方向不一致模板极性问题,未做极性对齐使用工具箱的极性排序功能,或在比较前手动翻转并重新计算相关性
转换概率矩阵不对称数据中伪迹或异常片段影响,或分段边界切断了微状态检查分段时是否有边缘效应,删除明显异常片段,确保最短持续时间阈值一致

4.3 被试样本量对分析稳定性的影响。

这个可能是被低估的问题。微状态分析的稳定性严重依赖样本量和数据时长。如果每个被试只有1分钟的静息态数据,聚类时每个被试提供的峰值地形图数量可能只有几十个,组平均模板的可靠性会很差。我实际处理的经验是,静息态数据每个被试至少保证2-3分钟干净数据,被试数量最好不低于20个。如果受试者数量很多但单段数据特别短,也可以采用合并相邻分段的方式增加数据量,但要注意分段边界引起的连接性变化。任务态数据则建议至少保证每个条件有40-60个试次,并且在聚类前把所有条件和所有被试的数据合并,这样组模板更能反映整体的微状态结构。样本量过小时的显著结果往往经不起多重比较校正,如果你用的是转换概率这类多维度指标,一定记得用FDR或相邻校正来控制多重比较问题。

5. 实操过程中的独家心得与技巧

5.1 用评估模块和可视化检查结果

工具箱带了一些查看结果的功能,但很多人只看到最终统计表,忽略了中间可视化检查这一步。我建议在每个步骤都看一眼拓扑图和GFP曲线。聚类完成后,把K个模板画出来看地形图,是否符合文献中已知的地形模式:比如静息态常见的四个经典微状态(A视觉、B视觉-默认、C默认、D注意)形态上都有比较明确的特征。如果你的结果看起来非常反常,不要硬着头皮往下跑,先回头查预处理和参数设置。

在拟合完某个被试的数据后,我会随机挑几个时间段把原始地形图和拟合后的模板画在一起对比,直观感受一下拟合质量和时间序列的连续性。如果看到比较明显的锯齿状切换(即状态快速、高频地在两个模板之间来回跳),说明最短持续时间参数设得太小,对应调大后再重新统计。

5.2 统计分析。怎么处理微状态指标才能发文章

统计是微状态分析最容易陷入“怎么做都行”困境的环节。我的建议是:单指标用混合效应模型或重复测量ANOVA,主要看组间×条件交互效应;转换概率则用置换检验(permutation test)比较组间/条件间的概率矩阵差异,置换次数建议至少1000次以上。多重比较校正请务必做,尤其是转换概率矩阵,差异检验涉及K×K个元素,不做校正基本没法保证可靠性。

还要提一个容易被审稿人追问的点:如果你的组间比较用的是个体拟合指标(平均持续时间、出现率、覆盖时间),需要说明这些指标是在什么“最短持续时间”参数下计算的,以及K值是如何确定的。把这些细节写清楚,审稿人会认为你的分析流程扎实,减少了被要求重跑的麻烦。我自己每次做分析时都会保留一个参数记录文本,记录K值范围、最短持续时间、聚类算法、极性对齐方式、是否用组平均模板等信息,这样写方法部分时可以直接复制,省了很多时间。

5.3 和其他分析方法的结合。扩展思路

微状态分析不是孤立的,它可以和很多其他分析结合。比如与功率谱密度结合,看不同的微状态是否对应不同频段的能量增强;与功能性连接结合,研究微状态切换期间的网络重构;甚至能与源定位(eLORETA)结合,看每个微状态内的大脑源分布有啥不同。工具箱虽然没有直接做这些,但它的输出数据结构很友好——拟合后,每个时间点的微状态标签都存在EEGlab事件结构里,你可以很方便地索引到某一微状态的时间段,导出用于后续分析。

我在一个项目里就试过把微状态标签作为“伪事件”,提取特定微状态的时频能量,效果很好。具体做法是在EEGlab中把某个微状态的时间分段转换为事件结构(eeglab的pop_importevent配合自定义脚本),再调用标准时频分析函数。这一套流程不需要额外的大型工具包,基于EEGlab生态就能完成。如果你有类似需求,我可以在后续的分享里具体展开。

6. 写在最后的一点总结

踩过这么多坑之后,我对Microstate EEGlab工具箱的评价是:它把微状态分析的门槛降低了很多,但对使用者的要求并没有降低——数据质量、参数选择、统计分析这些核心环节依然需要你亲手把关。预处理稳了、K值选对了、最短持续时间设好了,剩下的就是按部就班地出指标。如果你刚开始接触微状态分析,一定不要一上来就追求复杂参数,先用默认参数跑通流程,再慢慢调整细节。用熟了之后,工具箱的很多可定制选项才会真正变成你的优势。我现在回头看,最先做的那些分析不少都不太规范,但正是那些不太规范的结果让我明白了每一步到底在影响什么。希望这篇经验贴能让你少走一些弯路,跑出自己满意的结果。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询