3、伪迹去除与ICA应用:眼电伪迹(EOG)识别、肌电伪迹(EMG)处理、独立成分分析(ICA)原理、ICA在EEG中的应用、手动与自动成分选择
做ERP分析的朋友都知道,数据采集完第一件事不是急着看波形,而是——去伪迹。我刚开始做EEG那几年,最头疼的就是眼电和肌电。你想想看,好不容易攒了60个试次,结果一半都被眨眼污染了,那叫一个心疼。
这一章咱们就聊聊伪迹去除这件事。核心武器就是独立成分分析(ICA)。说白了,ICA就是帮我们把混在一起的信号拆开,看看哪些是大脑活动,哪些是干扰。
核心观点:伪迹不是垃圾,是信号中的“杂质”。ICA能帮我们分离它们,而不是简单粗暴地扔掉数据。
3.1 眼电伪迹(EOG)识别
眼电伪迹,说白了就是眨眼和眼动带来的干扰。你想想,眼球本身就是一个电偶极子,角膜带正电,视网膜带负电。一眨眼,这个电偶极子就转一下,额叶电极(比如Fp1、Fp2)上就会冒出个大波。
EOG的典型特征:
- 眨眼:额叶电极出现正向大波,持续约200-400ms,波形平滑
- 水平眼动:F7/F8出现极性相反的偏转
- 垂直眼动:Fpz与VEOG通道出现同步变化
我的经验:判断EOG成分,我习惯看两个东西——地形图和时间序列。EOG成分的地形图通常集中在额叶,而且时间波形很平滑,不像脑电那么“毛糙”。
我在项目中遇到过一件事:有个被试眨眼特别频繁,平均每2秒眨一次。如果用传统的阈值法去伪迹,那基本没剩几个试次了。后来我用ICA把眨眼成分单独拎出来,剩下的数据照样能用。这就是ICA的魅力。
3.2 肌电伪迹(EMG)处理
肌电伪迹比眼电麻烦多了。为什么?因为EMG的频率范围很宽,从20Hz一直延伸到200Hz以上,跟很多脑电频段(尤其是beta和gamma)重叠。你想想看,咬牙、耸肩、皱眉,这些动作都会产生EMG。
EMG的典型特征:
- 高频成分:功率谱在20-100Hz明显抬升
- 突发性:持续时间短,几十到几百毫秒
- 空间分布:靠近肌肉群的电极(如颞叶、枕叶)更明显
注意:千万别用简单的带通滤波去EMG!我曾经犯过这个错——把30Hz以上的全滤掉,结果gamma频段的脑电信号也跟着没了。后来学乖了,先用ICA分离,再决定哪些成分要保留。
处理EMG,我个人习惯分两步走:
- 第一步:用ICA把数据分解成独立成分
- 第二步:识别出那些功率谱高频段异常抬高的成分,标记为EMG
嗯,这里要注意:EMG成分往往不止一个,有时候能分出3-5个。别手软,该去的就去。
3.3 独立成分分析(ICA)原理
ICA的原理,说白了就是盲源分离。你想想看,你在一个房间里放了好几个麦克风,每个人都在说话。每个麦克风录到的是所有人的声音混在一起。ICA就是帮你把每个人的声音单独拎出来。
数学上,ICA假设观测信号X是由独立源信号S通过混合矩阵A线性组合得到的:
X = A * S
我们的目标是找到一个解混矩阵W,使得:
Y = W * X ≈ S
其中Y就是估计出来的独立成分。
ICA的两个关键假设:
- 统计独立性:源信号之间相互独立
- 非高斯性:源信号不服从高斯分布(脑电信号确实是非高斯的)
为什么ICA适合EEG?因为EEG信号是多个源(大脑皮层、眼睛、肌肉等)的线性混合,而且这些源在统计上是独立的。ICA正好能拆开它们。
常用的ICA算法有Infomax、FastICA、SOBI等。我个人习惯用Infomax,它在EEGLAB里是默认算法,效果稳定。FastICA速度快,但有时候收敛不稳定。
3.4 ICA在EEG中的应用
ICA在EEG里到底怎么用?我总结了三步走:
- 数据预处理:先做带通滤波(0.5-40Hz),然后做坏导插值、重参考
- 运行ICA:把数据喂给ICA算法,得到N个独立成分(N等于电极数)
- 成分选择与重建:挑出伪迹成分,置零,然后反变换回电极空间
举个例子,假设你有64个电极,ICA会输出64个成分。其中可能有3-5个是眨眼成分,2-3个是肌电成分,1-2个是心电成分。剩下的才是真正的脑电成分。
我的建议:别指望ICA能自动搞定一切。我见过有人跑完ICA就直接把所有看起来像伪迹的成分都删了,结果把P300成分也给删了。一定要结合地形图、频谱图和时域波形综合判断。
为什么会这样?因为有些脑电成分(比如额叶的theta波)在地形图上跟EOG有点像。如果你只看地形图,很容易误判。所以我的习惯是:地形图 + 频谱图 + 时间序列,三管齐下。
3.5 手动与自动成分选择
成分选择是ICA应用中最关键的一步。选对了,数据质量飞升;选错了,数据就废了。
手动选择:
- 优点:灵活,可以结合经验判断
- 缺点:耗时,主观性强,不同人可能选出不同结果
- 常用工具:EEGLAB的pop_selectcomps函数,可以看地形图、频谱、时域波形
自动选择:
- 优点:速度快,可重复性好
- 缺点:可能误判,尤其是遇到不典型的伪迹
- 常用工具:ADJUST、ICLabel、MARA等
我个人习惯是先自动后手动。先用ICLabel跑一遍,它会给出每个成分属于脑电、眼电、肌电、心电等的概率。然后我再手动确认一遍,把那些概率高但看起来不太对的成分调整一下。
避坑指南:我曾经用自动选择工具一次性删了20个成分,结果发现ERP波形变得很奇怪。后来检查发现,工具把几个额叶的脑电成分误判成了EOG。从那以后,我再也不敢完全信任自动选择了。
下面是一个简单的自动选择代码示例(基于EEGLAB和ICLabel):
% 加载数据
EEG = pop_loadset('data.set');
% 运行ICA
EEG = pop_runica(EEG, 'icatype', 'runica');
% 使用ICLabel进行自动分类
EEG = pop_iclabel(EEG, 'default');
% 选择概率大于0.8的眼电和肌电成分
bad_comps = find(EEG.etc.iclabel.classifications(:, 2) > 0.8 | ...
EEG.etc.iclabel.classifications(:, 3) > 0.8);
% 去除伪迹成分
EEG = pop_subcomp(EEG, bad_comps, 0);
嗯,这里要注意:ICLabel的分类概率阈值怎么设?我一般设0.8。设得太低(比如0.5)会误删太多脑电成分,设得太高(比如0.95)又会漏掉一些伪迹。0.8是个不错的折中。
总结一下:ICA是ERP分析中去除伪迹的利器,但不是万能药。手动选择+自动选择结合,才是靠谱的做法。记住:宁可少删,不要多删。删错了脑电成分,数据就真的救不回来了。