当前位置:首页>python>基于 Python / MATLAB 双轨的预处理简单示例(含 QC 思路)

基于 Python / MATLAB 双轨的预处理简单示例(含 QC 思路)

  • 2026-10-21 13:28:50
基于 Python / MATLAB 双轨的预处理简单示例(含 QC 思路)

在前两篇关于 ICA 的文章下面,有不少朋友留言:

“能不能出一个完整教程?”
“到底什么样的预处理流程,才算是规范又不过度?”

这篇文章,就是对这些问题的集中回应。

需要先说明的是:
这不是一套“最复杂”的流程,也不是“顶刊模板”。

它的目标只有一个:

给你一套你能跑、能解释、能在组会上讲清楚的 EEG 预处理流程。


一、整体流程总览(先看全局)

本文采用一个非常克制、但足够严谨的四步流程:

  1. 数据转换:统一整理为 BIDS-EEG 格式
  2. 初始数据质量检查(QC-1):判断“值不值得继续分析”
  3. 最小可用预处理流程:不为清洗而清洗
  4. 预处理后质量检查(QC-2):验证“清洗是否真的有益”

如果你现在对 EEG 预处理感到混乱,先把这四步跑通,比调任何参数都重要。


二、Step 1:数据统一为 BIDS-EEG(为什么这一步非常重要)

1️⃣ 为什么一定要做 BIDS?

很多初学者一上来就问:

  • “能不能直接用原始 .set / .edf 跑?”

技术上可以,但科研上不推荐。

BIDS 的价值不在于格式,而在于三点:

  • 数据与元数据强绑定(采样率、导联、参考方式)
  • 分析流程天然可复现
  • 后续无论 Python / MATLAB 都能无缝衔接

如果你未来打算投稿、共享数据、或者长期维护项目,BIDS 几乎是不可跳过的一步。


2️⃣ Python 示例:原始 EEG → BIDS

from mne_bids import BIDSPath, write_raw_bids
import mne

raw = mne.io.read_raw_eeglab("sub01_raw.set", preload=True)

bids_path = BIDSPath(
    subject="01",
    task="rest",
    root="bids_dataset",
    datatype="eeg"
)

write_raw_bids(raw, bids_path, overwrite=True)

关键参数解释:

  • subject / task:后续统计分析直接按任务分组
  • preload=True:后面 QC 与 ICA 都依赖内存操作
  • overwrite=True:避免调试阶段重复报错

3️⃣ MATLAB 示例:EEGLAB → BIDS

EEG = pop_loadset('filename','sub01_raw.set');
pop_exportbids(EEG, 'bids_dataset', ...
'subject','01', ...
'task','rest');


三、Step 2:初始数据质量检查(QC-1)

这一步只做一件事:

判断:这份数据是否“值得”继续分析。


1️⃣ 必做的 3 项基础 QC

(1)原始时域波形

raw.plot(n_channels=32, duration=10)

你要看的不是“干不干净”,而是:

  • 是否存在明显断裂
  • 是否有整段饱和
  • 是否存在通道整体失真

(2)功率谱密度(PSD)

raw.plot_psd(fmax=50)

关注点:

  • 是否存在异常 50/60 Hz 峰
  • 高频是否异常抬升(肌电嫌疑)
  • 各通道 PSD 是否形态一致但不完全重合

(3)坏导联初筛

raw.info['bads'] = []
raw.plot()

坏导不是“越多越好”,而是:

明确、可解释、数量克制。


四、Step 3:最小可用的预处理流程(核心)

下面这套流程,我非常建议新手从这里开始。


1️⃣ 基础滤波(不过度)

raw.filter(l_freq=0.1, h_freq=45)

参数解释:

  • 0.1 Hz:保留慢波趋势,避免 ERP 失真
  • 45 Hz:足够覆盖大多数认知范式

滤波不是“越窄越好”,而是为分析服务。


2️⃣ 重参考(在坏导处理之后)

raw.set_eeg_reference('average')

重参考之前,请确保:

  • 明确的坏导已经被标记
  • 不要让坏导参与平均

3️⃣ ICA(在数据条件允许时)

ica = mne.preprocessing.ICA(
    n_components=0.99,
    method='fastica',
    random_state=42
)
ica.fit(raw)

参数解释:

  • n_components=0.99:按方差解释率,而非固定数量
  • random_state:保证可复现ICA 不是必须步骤,而是“有条件的工具”。

4️⃣ ICA 成分识别(不盲删)

ica.plot_components()
ica.plot_properties(raw)

判断依据必须来自:

  • 空间拓扑
  • 时域特征
  • 频谱特性 而不是:

“这个看起来像噪声。”


五、Step 4:预处理后的质量检查(QC-2)

这一部分比预处理本身更重要。


1️⃣ 对比前后 PSD

raw_clean.plot_psd(fmax=50)

你要看到的是:

  • 工频峰下降
  • 高频噪声受控
  • 主频结构仍然存在

2️⃣ 对比时域形态

raw_clean.plot(n_channels=32, duration=10)

如果你觉得:

“怎么没之前那么好看了?” 那恭喜你,你可能做对了。


3️⃣ 检查结论稳定性

尝试轻微改动参数:

  • ICA 成分 ±1
  • 滤波边界 ±5 Hz 如果你的核心结论方向不变:

这套预处理是“够用且稳健的”。


六、总结:什么时候可以停下来?

如果你满足:

  1. 信号仍有清晰生理形态
  2. 系统性噪声明显下降
  3. 结论对合理参数变化不敏感 那么可以负责任地说:

这份 EEG 预处理,已经可以进入分析阶段了。


七、留给你的问题(欢迎留言)

  • 你目前的预处理流程,卡在哪一步最久?
  • 你是否有过“越清越不敢用”的经历?
  • 你更希望我下一篇写:ICA 成分判读实战,还是 QC 自动化脚本?

欢迎在评论区继续讨论。

最新文章

随机文章