Resting-state中基于功能连接的分析主要是基于Node(节点)展开的,首先基于模板定义Node,然后提取时间序列做相关得到功能连接矩阵。随后就有了network/node/edge水平上的各种分析和组间比较。最近发表在Nature Neuroscience上的文章提出了一种基于edge时间序列构建功能连接的方法,并且基于该方法展开了一系列探索性的分析,结果证明了该方法的有效性。
Lucina Uddin写了一个commentory的文章很好的总结了该研究及意义。如果你不想看很多页的文章+SI的话可以考虑先读一下这篇不到一页的文章。
node-FC vs edge-FC
In node-centric network models, ... That is, strong functional connections are thought to reflect the time-averaged strength of ‘communication’ between brain regions. eFC, on the other hand, tracks how communication patterns evolve over time and ultimately assesses whether similar patterns are occurring in the brain simultaneously
eFC overcomes limitations of previous methods that assign brain regions to only one community.
(Uddin, L. Q. 2020, Nat Neurosci)
eFC原理并不复杂,对于提取的ROI时间序列做点乘,得到ROI之间的co-fluctuation,结果为正则表明在该时间点两个ROI的deflection是在同一个方向,为负则表明deflection的方向相反。如下图a, 两个ROI都为负的时间点上,点乘后为正(图b)。这样一来,如果你提取了200个Node的时间序列,两两做完点乘后得到19900个Edge的时间序列(co-fluctuation),再对其作相关即可得到edge的FC。
(Faskowitz et al 2020, Nat Neurosci)
作者github的提供了简单的Demo,如何构建edge时间序列和基于edge时间序列的探索性分析。由于对edge时间序列做相关会产生19900^2的矩阵,所以demo中没有展示有关的分析。但是可以说所有基于node-FC的分析方法都适用于edge-FC,因此会有很多的future direction,比如基于图论指标的分析方法【作者的文章中有使用到】,CPM预测,基于eFC的parcellation,CCA/PLS,新的组间比较等。
Code Demo
构建edge时间序列
假如你提取了200ROI的时间序列
1.对时间序列做标准化
ts = zscore(ts);
2. 对ROI的时间序列两两点乘,便得到了Edge的time series
[u,v] = find(triu(ones(nnodes),1));
ets = ts(:,u).*ts(:,v);
基于edge时间序列的简单聚类分析
做个kmean聚类然后排个序,会发现确实有某种pattern【有没有一种想叠加平均或者做个时间频率分析的冲动?】。横线之间的edge time series为同一个cluster。
k = 16;
ci = kmeans(ets',k,...
'distance','sqeuclidean',...
'maxiter',1000);
[~,idx] = sort(ci); dffidx = find(diff(ci(idx)));
figure, imagesc(ets(:,idx)',[-4,4]); hold on;
for i = 1:length(dffidx)
plot([0.5,T + 0.5],dffidx(i)*ones(1,2),'k');
end
title('Edge time series')
将聚类的结果ci,map到matrix中
mat = zeros(N);
mat(triu(ones(N),1) > 0) = ci;
mat = mat + mat';
[gx,gy,idx] = grid_communities(lab); % BCT function
figure, imagesc(mat(idx,idx)); axis square; hold on; plot(gx,gy,'k','linewidth',2); title('Edge communities')
计算一下每个cluster之间的相似性,并map到matrix上
hdl = @(x,y)(mean(x~=y,2));
pd = pdist(mat,hdl);
sq = 1 - squareform(pd);
[gx,gy,idx] = grid_communities(lab); % BCT function
figure, imagesc(sq(idx,idx)); axis square; hold on; plot(gx,gy,'k','linewidth',2); title('Edge community similarity')
计算一下每个cluster的信息熵,信息熵越高说明该cluster的参与度越高。
这里的label是基于聚类的结果,demo中作者自己定义的。
[u,v] = find(triu(ones(N),1));
h = zeros(n,max(ci));
for i = 1:N
idx = u == i | v == i;
h(i,:) = hist(ci(idx),1:max(ci));
end
p = bsxfun(@rdivide,h,sum(h,2));
e = -nansum(p.*log2(p),2);
enorm = e/log2(max(ci));
figure, boxplot(enorm,lab,'labels',net,'labelorientation','inline'); title('Norm entropy per system')
将信息熵排序,map到大脑上
enorm_rank = tiedrank(enorm); % for visualization, rank transform entropy
% load 32k surfaces
load fcn/surfinfo
cr = zeros(size(gr.cdata));
cl = zeros(size(gl.cdata));
cr(gr.cdata ~= 0) = enorm_rank(gr.cdata(gr.cdata ~= 0));
cl(gl.cdata ~= 0) = enorm_rank(gl.cdata(gl.cdata ~= 0));
cmap = fcn_cmaphot;
figure, th = trisurf(sr.faces,sr.vertices(:,1),sr.vertices(:,2),sr.vertices(:,3),cr);
set(th,'edgecolor','none'); axis image; set(gca,'clim',[min(enorm_rank),max(enorm_rank)]);
colormap(cmap); colorbar;
figure, th = trisurf(sl.faces,sl.vertices(:,1),sl.vertices(:,2),sl.vertices(:,3),cl);
set(th,'edgecolor','none'); axis image; set(gca,'clim',[min(enorm_rank),max(enorm_rank)]);
colormap(cmap); colorbar;
时间点上的co-fluctuation的简单分析
计算一下每个时间点上co-fluctuation的总和,排个序
% calculate co-fluctuation amplitude at each frame
rms = sum(ets.^2,2).^0.5;
% sort co-fluctuation amplitude
[~,idxsort] = sort(rms,'descend');
看下前10%和后10%的time point上的node-FC
% estimate fc using just high-amplitude frames
fctop = corr(ts(idxsort(1:nkeep),:));
% do the same using just low-amplitude
fcbot = corr(ts(idxsort(end - nkeep + 1:end),:));
会发现,基于co-fluctuation找到的top10%的时间点有较高的node-FC相似性r=0.73, bot10%的时间点上有着较低的node-FC相似性r=0.46。
用community detection的算法计算一下它们的modularity
numiter = 100;
qtop = zeros(numiter,1); qbot = qtop;
for iter = 1:numiter
[~,qtop(iter)] = community_louvain(fctop,[],[],'negative_asym');
[~,qbot(iter)] = community_louvain(fcbot,[],[],'negative_asym');
end
figure;
f = fcn_boxpts([qtop,qbot],[],jet(2));
set(gca,'xtick',1:2,'xticklabel',{'high-amp','low-amp'});
ylabel('modularity, q');
会发现,基于co-fluctuation找到的top10%的时间点有较高的node-modularity, bot10%的时间点上有着较低的node-modularity
References
Faskowitz, J., Esfahlani, F. Z., Jo, Y., Sporns, O., & Betzel, R. F. (2020). Edge-centric functional network representations of human cerebral cortex reveal overlapping system-level architecture (pp. 1-11). Nature Publishing Group.
Uddin, L. Q. (2020). An ‘edgy’new look. Nature Neuroscience, 1-2.
—END—