功能连接的统计检验与网络可视化
算出来的 2016 条边,哪些是真信号?这一课先解决"假连接从哪来", 再解决"显著性怎么判",最后把结果画成人一眼能看懂的矩阵图和网络图。
🎯 本节学习目标
- 能解释公共源混合与公共参考为何在"无真实交互"时产生高连接
- 掌握三条缓解路径的原理与代价:PLI 类指标、电流源密度/拉普拉斯、源空间连接
- 会算 N 通道的边数,并理解"每条边一次检验"带来的多重比较爆炸
- 能为连接分析选择合适的校正方法:Bonferroni / FDR / 置换 + max-stat / NBS
- 会画并读懂 N×N 连接矩阵(上下三角、对角线、色标约定)
- 会画阈值化的圆形布局网络图,并按规范输出连接结果
一、容积导体问题深入:假连接的两个源头
6.1 已经点题:单个源的信号会同时扩散到多个电极。这里把机制再拆深一层。用矩阵语言说:
头皮电极记录到的信号 V = G × S,S 是所有源的时间过程,
G 是混合矩阵(每个电极对每个源的加权)。关键在于 G 的每一列几乎全为正数
且彼此相近——相邻两个电极的信号 = 同一批源的两种近似加权之和,天然高度相似。
源头一:公共源混合。哪怕两个脑区毫无交互,只要它们的信号都"漏"到彼此的 电极上(或第三个源同时投射到两个电极),这对电极就会表现出零滞后高相干。电极距离越近 越严重——这就是头皮连接矩阵常常"前额一片红"的原因。
源头二:公共参考。参考电极的信号被从每一个通道里减掉。参考上有什么—— 工频噪声、汗腺电位、颈部肌电——都会被原封不动地混进所有通道,于是任何 通道对之间都共享了这个"公共成分",连接指标整体被抬高。这不是理论洁癖:单侧乳突参考 会让同侧通道之间的相干系统性偏高,平均参考也依然存在零滞后混合。
一:连接矩阵几乎满格都是显著边——先怀疑体积传导/参考,而不是"全脑网络大爆发"。 二:镜像位置(如 F3–F4、C3–C4)的连接异常高且左右对称——典型的同源混合特征。 人类认知不会因为你的实验操纵就"全网重构",满矩阵结果几乎总有方法学问题。
二、三条缓解路径
| 策略 | 原理 | 优点 | 代价 |
|---|---|---|---|
| PLI / wPLI 类指标 | 扔掉零滞后成分 | 零改动、计算便宜 | 延迟极短的真实交互也会被扔掉;对试次数有要求 |
| 电流源密度 / 拉普拉斯 | 对通道做空间二阶差分(相当于"空间高通"),抵消各通道的公共成分 | 保留头皮分析框架,物理意义清楚 | 突出浅层局部活动;深部/内侧源贡献被削弱;对电极密度敏感 |
| 源空间连接 | 先做源定位,提取 ROI 时间序列再算连接 | 从源头绕开头皮混合,可定义解剖 ROI | 依赖头模型质量;存在空间泄漏;计算重(见模块 7) |
三条路不互斥。实践中常见组合是"平均参考 + 电流源密度 + wPLI"(头皮研究),或 "beamformer + ROI + wPLI/相干"(源研究,6.3 实操)。EEGLAB 用户可以安装 CSD 工具箱 (Kayser 与 Tenke 的球面样条实现)把电位转成电流源密度后,再走后续的连接分析。
三、基于边的统计:2016 条边意味着什么
在同一批数据上做很多次统计检验时,每次都有 α(如 0.05)的概率"纯靠运气显著"。 检验次数一多,假阳性就从"运气"变成"必然"。连接分析是多重比较的重灾区: 你的检验单位不是通道,而是每一条边。
先算清账。N 个通道的无向连接数 = N(N−1)/2:
| 通道数 | 边数 N(N−1)/2 | α=0.05 且不校正时的期望假显著边 |
|---|---|---|
| 32 | 496 | 约 25 条 |
| 64 | 2016 | 约 101 条 |
| 128 | 8128 | 约 406 条 |
一张纯噪声数据也能画出 100 条金光闪闪的"显著网络"——这就是连接论文审稿人看到未校正 结果会直接质疑的原因。边级检验本身不难:每个被试每条边一个值,条件间或组间做 配对 t 检验即可;难的是面对这一大把 p 值怎么办。
四、多重比较校正:四件工具
Bonferroni:单边阈值 α/边数 = 0.05/2016 ≈ 2.5×10⁻⁵。数学上"最安全", 但对连接数据过严——边与边高度相关(相邻电极对共享通道),Bonferroni 却假设检验彼此独立, 校正幅度远超必要,真实的中等强度网络会被一刀切没。只适合边数很少 (预先选定的几对 ROI)的验证性分析。
FDR(Benjamini–Hochberg):不追求"零假阳性",而是控制
显著集合中假阳性的比例(如不超过 5%)。对相关检验稳健、功效高,是连接分析的
事实标准;FieldTrip 统计函数里的 cfg.correctm = 'fdr' 就是它。
置换检验 + 最大统计量(max-stat):打乱条件标签重算所有边的统计量,每次取 全场最大值,用这个"最强边的零分布"定阈值——天然尊重边之间的相关结构 (与模块 5 的 cluster 校正同一思想:cluster 在空间上找团块,这里直接取最大)。
Zalesky 等 2010 年提出的"边团块校正":先把每条边阈值化(如 t 大于 2)连成图,找出
连通子网络,再用置换检验比较"子网络的大小"而非单条边。它牺牲单边定位精度,
换来对"整个子网络"的强推断——特别适合"找网络"而非"找边"的研究问题。
FieldTrip 中对应 ft_networkanalysis。
探索性全脑连接:FDR 或 NBS;验证少数预选边(如 5 对 ROI):Bonferroni 也可接受; 想要"最强边"式的严格 FWER 控制:置换 + max-stat。无论选哪个, 方法与阈值写进论文方法部分。
function sig = fdr_bh(p, q)
% Benjamini-Hochberg FDR:控制"显著边中假阳性的比例"
% p: 边的 p 值(列向量); q: 期望 FDR 水平,如 0.05
% 返回逻辑向量:true = 该边通过校正
% 用法:sig = fdr_bh(pvals, 0.05);(FieldTrip 的 cfg.correctm='fdr' 是同一原理的工业版)
[p_s, idx] = sort(p(:)); % 把 p 值从小到大排名
m = numel(p);
thr = q * (1:m)' / m; % 第 k 小的 p 值允许的门槛:k*q/m
ok = find(p_s <= thr, 1, 'last'); % 找到最大的合格排名 k
sig = false(m, 1);
if ~isempty(ok)
sig(idx(1:ok)) = true; % 排名前 k 的边全部标记显著
end
end
五、连接矩阵可视化:N×N 热图
连接矩阵是连接分析最基础的"成绩单"。画之前记住三个约定:
- 对称指标只看一个三角:coherence / PLV / PLI / wPLI 都是 A–B = B–A, 上下三角信息完全重复。常用技巧是一图双条件:上三角画条件 A、下三角画条件 B, 差异一目了然;
- 对角线没有信息:自己和自己永远是 1,必须置 NaN,否则一大块"满分红" 会把色标拉爆;
- 色标固定:coh / wPLI 理论值域 0–1,固定色标后不同被试、不同条件的图才能 直接对比——"每张图自适应色标"是初学者最常见的自欺欺人。
% conn: 64x64 对称连接矩阵(来自 6.3 的 ft_connectivityanalysis,或手算)
N = 64;
conn(logical(eye(N))) = NaN; % 对角线 = 自连接,无意义,置 NaN 避免误导
figure;
imagesc(conn); axis square;
colormap(jet); colorbar;
caxis([0 1]); % coh/wPLI 固定 0-1 色标:跨被试跨条件可比
title('全通道连接矩阵(上下三角信息重复)');
% 只保留下三角:更干净;也常用于一图双条件(上=条件A 下=条件B)
figure;
C = conn;
C(triu(true(N))) = NaN; % triu(true(N)):含对角线的上三角掩码
imagesc(C); axis square; colorbar; caxis([0 1]);
title('下三角(+ 上三角可以画另一个条件)');
行列顺序也有讲究:默认通道顺序(F3, F4, C3, Cz, …)把额、中央、枕区交错排开, 矩阵看起来一团乱。按脑叶分组重排(额部通道挨着额部、枕部挨着枕部)之后, 模块化的块状结构会自己浮出来。
六、阈值化脑网络图与圆形布局
矩阵图是给分析者看的,网络图是给读者看的。三条规则:
- 节点 = 电极(头皮水平)或 ROI(源水平),按头皮位置或解剖关系布局;
- 边 = 通过显著性(或强度前 5%)的连接。阈值必须报告,并对阈值做敏感性检查 (换一档阈值,结论还在吗?);
- 线的颜色/粗细映射强度——弱连接浅细、强连接深粗,图才读得动。
圆形布局最常用:电极沿头顶排成一圈(Fz 在正上方、Oz 在正下方)。连线越"长" (弧越接近圆心)= 跨脑区的长程连接;短弧 = 邻近的局部连接。满屏长线提示 长程同步网络;连线密集聚在某一叶的扇区,是局部网络。再对照第一节的 自查信号:左右镜像的密集连线永远值得怀疑。
function draw_circle_net(conn, labels, thresh)
% 圆形布局网络图:节点=电极,边=超过阈值的连接
% conn: N×N 对称连接矩阵; labels: 电极名; thresh: 画线阈值(如显著边的强度门槛)
N = size(conn, 1);
ang = pi/2 + 2*pi*(0:N-1)'/N; % 从头顶开始顺时针排一圈(F 在正上方)
pos = [cos(ang) sin(ang)]; % N×2 单位圆坐标
figure('Color', 'w'); hold on;
vmax = max(abs(conn(:)));
for i = 1:N
for j = i+1:N
if abs(conn(i,j)) > thresh % 只画过阈值的边:全画必糊成一团
w = abs(conn(i,j)) / vmax; % 相对强度 0-1,决定线的深浅与粗细
col = [0.75 0.82 0.95]*(1-w) + [0.10 0.25 0.85]*w; % 浅蓝->深蓝
plot(pos([i j],1), pos([i j],2), '-', ...
'Color', col, 'LineWidth', 0.4 + 2.5*w);
end
end
end
plot(pos(:,1), pos(:,2), 'k.', 'MarkerSize', 14); % 节点画在连线之上
for i = 1:N
text(pos(i,1)*1.14, pos(i,2)*1.14, labels{i}, ...
'FontSize', 7, 'HorizontalAlignment', 'center');
end
axis equal off;
title('阈值化脑连接网络');
end
七、结果输出规范
连接分析的方法学敏感度高,报告时比 ERP 更要"自证清白"。最低交付清单:
- 指标与出处:用了什么指标、公式引用(如 Vinck 2011 的 wPLI)、 为什么选它(容积传导立场);
- 频段与参数:频段范围、滤波参数、频率平滑(FieldTrip 的 tapsmofrq)、 每个被试进入分析的试次数;
- 统计与校正:检验类型、校正方法、最终阈值、通过校正的边数;
- 两图齐上:矩阵图 + 网络图,图注写明颜色/线宽含义与阈值;
- 可复现:脚本、随机种子、中间 .mat 全部存档(6.3 的组级骨架会做)。
① 你怎么控制体积传导?② 怎么处理 2016 次检验的多重比较?③ 换一档阈值结果还稳吗? 论文动笔前先把这三问答进方法部分——答不出来的结果别放进正文。
📌 本节小结
- 假连接两大来源:公共源混合 + 公共参考;共同特征是零滞后高连接
- 缓解三路:PLI/wPLI(扔零滞后)、电流源密度/拉普拉斯(空间去公共成分)、源空间(先源后连,见模块 7)
- 64 通道 = 2016 条边;α=0.05 不校正,纯噪声平均也能出约 100 条"显著边"
- Bonferroni 过严、FDR 常用、置换+max-stat 尊重边间相关、NBS 直接找子网络
- 矩阵图三约定:对角线置 NaN、对称指标看单三角、色标固定 0–1;网络图阈值必须报告并做敏感性检查
✏️ 课后练习
- 手算:32 通道有多少条边?若用 Bonferroni,单边阈值应设多小?再用
fdr_bh对 496 个均匀随机 p 值(rand(496,1))跑一遍,数一数显著边数,和"0.05×496"的直觉对比。 - 把 6.1 的手算代码扩展到 8 个电极(8×8 连接矩阵,两两算 PLV),用本课代码画"上三角=静息、下三角=任务"的双条件对比图。
- 用
draw_circle_net画自己数据的网络:调整阈值直到连线索约 50 条,记录此时阈值,并写一段 3 句话的"阈值选取依据"。