阶段五 · 前沿专题 · 模块 8 · 第 23 课 / 共 28 课

任务态微状态分析(下):CARTOOL 实操

上一课手写了整条微状态流水线;这一课换成微状态学派的官方装备 CARTOOL, 把任务态数据的"原型拟合 + 时间锁定叠加"点出来,再和 Matlab 统计流程接上。

🕐 30 分钟🎯 难度:高阶✅ 前置:8.1

🎯 本节学习目标

  • 完成 CARTOOL 的安装与数据导入,理解它对数据的基本要求
  • 说清任务态微状态与静息态在"原型地图来源"上的关键差别:跨条件统一原型
  • 掌握"拟合到 epoch + 时间锁定叠加"的流程,得到微状态版的"ERP"
  • 会把 CARTOOL 导出的指标接入 Matlab 统计流程,形成 GUI + 脚本的分工模式

一、CARTOOL:微状态研究的主流工具

微状态方法发源于瑞士(苏黎世 KEY Institute,"微状态"概念即由 Lehmann 提出), CARTOOL 正是由这一学派的后续研究团队(瑞士洛桑一带的脑功能成像实验室) 开发维护的免费软件。可以把它想成微状态界的"专业傻瓜相机": 自动模式(默认参数)拍出来就能看,专业参数(聚类、拟合、统计)也都暴露给你调。

  • 免费、图形界面:独立可执行程序,不依赖 Matlab license,Windows / macOS / Linux 都有;
  • 覆盖全流程:极性无关聚类(含交叉验证选 K)、反向拟合、指标统计、地形图动画,模块 8.1 手写的每一步它都内置了;
  • 与 EEGLAB 互补:EEGLAB 管预处理(模块 2),CARTOOL 管微状态——这是一条很常见的组合流水线。
📖 概念:原型地图(prototype map)

聚类得到的 K 张"标准拓扑图"。任务态分析的纪律是:原型地图必须跨条件、跨被试统一确定,再分别拟合回每个被试、每个条件的数据。

二、安装与数据导入

从官方网站(cartool.community)注册并免费下载,解压即可运行。 导入方面,CARTOOL 支持多种常见采集格式与它原生的 .dat 格式; 对 EEGLAB 用户,最通用的做法是把预处理好的数据导出成 "通道 × 时间点"的文本矩阵 + 电极坐标文件,再在导入向导里指定采样率 (不同版本菜单略有差异,导入后核对通道数、采样率、时长三件事)。

Matlab
% ---- 从 EEGLAB 导出数据,交给 CARTOOL 导入 ----
% 导出前确认:已完成平均参考、坏通道已处理(微状态对这两点极其敏感)
writematrix(EEG.data, 'sub01_rest.txt', 'Delimiter', 'tab');
fs = EEG.srate;                        % 记下来:CARTOOL 导入时要手工填采样率

% 电极坐标:CARTOOL 需要三维位置才能画拓扑图(若为空,先回 EEGLAB 完成电极定位)
fid = fopen('sub01_electrodes.txt', 'w');
fprintf(fid, 'name\tX\tY\tZ\n');
for ch = 1:EEG.nbchan
    fprintf(fid, '%s\t%.4f\t%.4f\t%.4f\n', EEG.chanlocs(ch).labels, ...
            EEG.chanlocs(ch).X, EEG.chanlocs(ch).Y, EEG.chanlocs(ch).Z);
end
fclose(fid);
💡 建议的练习节奏

先用一份数据量小的静息态片段(比如 60–120 秒)把"导入 → 聚类 → 查看 K 张地图"完整点一遍,熟悉界面后再上任务态和全部被试。软件官网提供教程文档和示例数据,比摸索快得多。

三、任务态微状态的核心思路:原型从哪来

静息态微状态(8.1)对整段连续数据聚类即可。任务态多了一个必须想清楚的问题: 原型地图从哪来?答案是:从"不偏向任何一个条件"的数据里来。 常见两种做法:

  1. 用同批被试的静息态数据确定原型,再拟合到任务态 epoch;
  2. 所有条件、所有被试的任务数据合并后聚类得到原型(组级模板),再拟合回每个 epoch。
⚠️ 绝不要每个条件各聚各的

如果条件 A 用一套地图、条件 B 用另一套,那么"两条件的 duration 差异"可能只是两套地图本身不同造成的假象。任务态微状态的全部可比性都建立在同一套原型地图上——这一步错了,后面全部作废。

四、实操:拟合到 epoch 并做时间锁定叠加

确定原型后,任务态流程与 ERP 分析惊人地相似:

① 导入任务态 epoch 数据(模块 2 分好的段)
② 选择已确定的原型地图,执行拟合(fit back)
③ 每个试次得到一条"微状态标签序列"
④ 按刺激 onset 对齐,跨试次平均标签
⑤ 得到"微状态版 ERP"

所谓"微状态版 ERP",就是时间锁定的覆盖比例曲线: 对每个时间点,统计所有试次中处于微状态 k 的比例。 传统 ERP 平均的是电位(幅值信息),这里平均的是状态归属(构型信息)—— 一条曲线告诉你"刺激后第 300ms,大脑有多大概率处于状态 C"。

与 ERP 的联合解读是任务态微状态最有味道的地方:

  • 某时间窗 ERP 幅值增大 + 某微状态覆盖比例同步升高 → 幅值与构型两个独立证据,结论更硬;
  • ERP 幅值不变 + 覆盖比例变化 → 提示加工方式重组而非强度变化;
  • 覆盖比例不变 + ERP 变化 → 幅值层面的调节,构型稳定。
📌 本课核心心智模型

任务态微状态 = "用同一套原型地图给每个试次贴标签,再像 ERP 一样按刺激对齐平均"。地图统一是可比性的前提,时间锁定是任务态的灵魂。

五、输出指标与导出

CARTOOL 的微状态统计模块可以输出:每个条件、每个状态的 duration / occurrence / coverage / 转移矩阵,以及时间锁定的覆盖比例曲线。结果可导出为文本 / CSV—— 这正是与 Matlab 统计流程的接口。

六、CARTOOL + Matlab 的分工模式

环节工具理由
预处理EEGLAB(模块 2)成熟的滤波 / ICA / 分段流水线
原型确定与拟合CARTOOL算法成熟、GUI 高效,跨被试跨条件统一拟合方便
统计与作图Matlab置换检验、FDR 校正、批量组图全部脚本化
Matlab
% ---- 读取 CARTOOL 导出的指标,进入 Matlab 统计 ----
% 假设导出的 CSV 每行一条记录,列含义:
%   subject, condition, state, duration_ms, coverage
T = readtable('cartool_ms_metrics.csv');

% 例:比较两种条件下微状态 C 的平均持续时间(置换检验,不假设正态)
selA = strcmp(T.condition, 'attend')   & strcmp(T.state, 'C');
selB = strcmp(T.condition, 'distract') & strcmp(T.state, 'C');
durA = T.duration_ms(selA);  durB = T.duration_ms(selB);
obs  = mean(durA) - mean(durB);

allDur = [durA; durB];  nA = numel(durA);  nPerm = 5000;
perm = zeros(nPerm, 1);
for p = 1:nPerm
    idx = randperm(numel(allDur));
    perm(p) = mean(allDur(idx(1:nA))) - mean(allDur(idx(nA+1:end)));
end
pval = mean(abs(perm) >= abs(obs));
fprintf('微状态C duration: 差异 = %.1f ms, 置换 p = %.3f\n', obs, pval);
% 多个状态 x 多个指标的比较,记得做 FDR 校正(模块 5 讲过)

📌 本节小结

  • CARTOOL 出自微状态方法的发源学派:免费、GUI、覆盖聚类-拟合-统计全流程
  • 任务态微状态的铁律:原型地图跨条件跨被试统一确定,再拟合到每个 epoch
  • 时间锁定叠加得到"微状态版 ERP":某时刻各状态的覆盖比例,平均的是构型而非电位
  • 与 ERP 联合解读:幅值变化与构型变化是两类互相独立的证据
  • 推荐分工:EEGLAB 预处理 → CARTOOL 原型与拟合 → Matlab 统计与作图

✏️ 课后练习

  1. 把一份预处理好的静息态数据导出并导入 CARTOOL,跑通"聚类 → 查看 K 张原型地图"。
  2. 把这套原型拟合到同一名被试的任务态 epoch,导出时间锁定覆盖比例曲线并在 Matlab 中画图。
  3. 收集两个条件 × 若干被试的 duration 指标,用课中的置换检验代码比较两条件差异。