任务态微状态分析(下):CARTOOL 实操
上一课手写了整条微状态流水线;这一课换成微状态学派的官方装备 CARTOOL, 把任务态数据的"原型拟合 + 时间锁定叠加"点出来,再和 Matlab 统计流程接上。
🎯 本节学习目标
- 完成 CARTOOL 的安装与数据导入,理解它对数据的基本要求
- 说清任务态微状态与静息态在"原型地图来源"上的关键差别:跨条件统一原型
- 掌握"拟合到 epoch + 时间锁定叠加"的流程,得到微状态版的"ERP"
- 会把 CARTOOL 导出的指标接入 Matlab 统计流程,形成 GUI + 脚本的分工模式
一、CARTOOL:微状态研究的主流工具
微状态方法发源于瑞士(苏黎世 KEY Institute,"微状态"概念即由 Lehmann 提出), CARTOOL 正是由这一学派的后续研究团队(瑞士洛桑一带的脑功能成像实验室) 开发维护的免费软件。可以把它想成微状态界的"专业傻瓜相机": 自动模式(默认参数)拍出来就能看,专业参数(聚类、拟合、统计)也都暴露给你调。
- 免费、图形界面:独立可执行程序,不依赖 Matlab license,Windows / macOS / Linux 都有;
- 覆盖全流程:极性无关聚类(含交叉验证选 K)、反向拟合、指标统计、地形图动画,模块 8.1 手写的每一步它都内置了;
- 与 EEGLAB 互补:EEGLAB 管预处理(模块 2),CARTOOL 管微状态——这是一条很常见的组合流水线。
聚类得到的 K 张"标准拓扑图"。任务态分析的纪律是:原型地图必须跨条件、跨被试统一确定,再分别拟合回每个被试、每个条件的数据。
二、安装与数据导入
从官方网站(cartool.community)注册并免费下载,解压即可运行。
导入方面,CARTOOL 支持多种常见采集格式与它原生的 .dat 格式;
对 EEGLAB 用户,最通用的做法是把预处理好的数据导出成
"通道 × 时间点"的文本矩阵 + 电极坐标文件,再在导入向导里指定采样率
(不同版本菜单略有差异,导入后核对通道数、采样率、时长三件事)。
% ---- 从 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)对整段连续数据聚类即可。任务态多了一个必须想清楚的问题: 原型地图从哪来?答案是:从"不偏向任何一个条件"的数据里来。 常见两种做法:
- 用同批被试的静息态数据确定原型,再拟合到任务态 epoch;
- 把所有条件、所有被试的任务数据合并后聚类得到原型(组级模板),再拟合回每个 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 校正、批量组图全部脚本化 |
% ---- 读取 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 统计与作图
✏️ 课后练习
- 把一份预处理好的静息态数据导出并导入 CARTOOL,跑通"聚类 → 查看 K 张原型地图"。
- 把这套原型拟合到同一名被试的任务态 epoch,导出时间锁定覆盖比例曲线并在 Matlab 中画图。
- 收集两个条件 × 若干被试的 duration 指标,用课中的置换检验代码比较两条件差异。