Example01 / 10
从 ROI 时间序列估计功能连接矩阵
用皮尔逊相关得到 40×40 的功能连接矩阵 R,再做 Fisher z 变换(对角线先置 0,避免 artanh(1)=∞)。 输出:系统内与系统间的平均相关;热图中应呈现 4 个对角块,对应 4 个模拟功能系统。 系统间平均相关略大于 0,来自模拟中的全脑共同波动(类比真实数据中的全局信号)。
Output输出图

Output文字输出
系统内平均 r = 0.346 系统间平均 r = 0.049 Fisher z 的取值范围: -0.15 ~ 0.69
Code代码
# 用皮尔逊相关得到 40×40 的功能连接矩阵 R,再做 Fisher z 变换(对角线先置 0,避免 artanh(1)=∞)。
# 输出:系统内与系统间的平均相关;热图中应呈现 4 个对角块,对应 4 个模拟功能系统。
# 系统间平均相关略大于 0,来自模拟中的全脑共同波动(类比真实数据中的全局信号)。
import numpy as np
import matplotlib.pyplot as plt
def simulate_bold(n_mod=4, per=10, T=200, seed=0):
"""模拟数据,仅用于演示方法。返回 (时间序列 N×T, 系统标签)。"""
rng = np.random.default_rng(seed)
labels = np.repeat(np.arange(n_mod), per)
sys_sig = rng.standard_normal((n_mod, T))
glob = rng.standard_normal(T)
load = rng.uniform(0.4, 1.0, size=n_mod * per) # 各脑区对本系统的载荷不同
X = load[:, None] * sys_sig[labels] + 0.3 * glob + rng.standard_normal((n_mod * per, T))
X[9] += 0.8 * sys_sig[1] # 脑区 9:跨系统连接枢纽
return X, labels
X, labels = simulate_bold()
N = X.shape[0]
R = np.corrcoef(X) # 按行计算:每行一个脑区
R0 = R.copy()
np.fill_diagonal(R0, 0)
Z = np.arctanh(R0) # Fisher z,组水平统计通常在 z 上进行
same = labels[:, None] == labels[None, :]
off = ~np.eye(N, dtype=bool)
print("系统内平均 r =", round(R[same & off].mean(), 3))
print("系统间平均 r =", round(R[~same].mean(), 3))
print("Fisher z 的取值范围:", round(Z[off].min(), 2), "~", round(Z[off].max(), 2))
plt.imshow(R, cmap="RdBu_r", vmin=-1, vmax=1)
plt.colorbar(label="Pearson r")
plt.title("Simulated functional connectivity matrix")
plt.show()Run在浏览器中运行
首次加载 Python 环境约需 20–40 秒;可以修改参数后重新运行。