生物医学网络科学Biomedical Network Science
Example01 / 11

阈值敏感性——同一个相关矩阵,不同绝对阈值下的拓扑指标

所属专题
网络构建与统计验证
下载
Notebook · .py

用一个 60 脑区的模拟相关矩阵,在一串绝对阈值上计算密度、平均聚集系数、全局效率, 并用 Spearman 秩相关检查“度排序”(枢纽排序)与参考阈值下是否一致。 解读:聚集系数和效率随阈值(也就是随密度)系统变化;枢纽排序在不同阈值下并不完全一致。 报告时应给出整条曲线或曲线下面积,而不是挑一个阈值。

Output输出图

阈值敏感性——同一个相关矩阵,不同绝对阈值下的拓扑指标:输出图 1

Output文字输出

阈值 0.10: 密度=0.521  聚集系数=0.655  全局效率=0.761  最大连通分支占比=1.00  度排序与阈值0.25的秩相关=-0.06
阈值 0.15: 密度=0.344  聚集系数=0.690  全局效率=0.659  最大连通分支占比=1.00  度排序与阈值0.25的秩相关=0.11
阈值 0.20: 密度=0.258  聚集系数=0.780  全局效率=0.569  最大连通分支占比=1.00  度排序与阈值0.25的秩相关=0.59
阈值 0.25: 密度=0.203  聚集系数=0.858  全局效率=0.348  最大连通分支占比=0.75  度排序与阈值0.25的秩相关=1.00
阈值 0.30: 密度=0.153  聚集系数=0.811  全局效率=0.228  最大连通分支占比=0.50  度排序与阈值0.25的秩相关=0.85
阈值 0.35: 密度=0.106  聚集系数=0.643  全局效率=0.155  最大连通分支占比=0.25  度排序与阈值0.25的秩相关=0.71
阈值 0.40: 密度=0.073  聚集系数=0.493  全局效率=0.101  最大连通分支占比=0.22  度排序与阈值0.25的秩相关=0.71
阈值 0.45: 密度=0.049  聚集系数=0.372  全局效率=0.070  最大连通分支占比=0.20  度排序与阈值0.25的秩相关=0.70

Code代码

# 用一个 60 脑区的模拟相关矩阵,在一串绝对阈值上计算密度、平均聚集系数、全局效率,
# 并用 Spearman 秩相关检查“度排序”(枢纽排序)与参考阈值下是否一致。
# 解读:聚集系数和效率随阈值(也就是随密度)系统变化;枢纽排序在不同阈值下并不完全一致。
# 报告时应给出整条曲线或曲线下面积,而不是挑一个阈值。
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
from scipy.stats import spearmanr

plt.rcParams["font.sans-serif"] = ["PingFang SC", "Microsoft YaHei", "SimHei", "Noto Sans CJK SC", "DejaVu Sans"]
rng = np.random.default_rng(1)
n_mod, per, T = 4, 15, 200
N = n_mod * per
labels = np.repeat(np.arange(n_mod), per)
load = rng.uniform(0.3, 1.0, size=N)                     # 各脑区对本系统的载荷不同
sys_sig = rng.standard_normal((n_mod, T))
glob = rng.standard_normal(T)
X = load[:, None] * sys_sig[labels] + 0.3 * glob + rng.standard_normal((N, T))
R = np.corrcoef(X)
np.fill_diagonal(R, 0)

taus = np.round(np.arange(0.10, 0.46, 0.05), 2)
ref_tau = 0.25
deg_ref = (np.abs(R) > ref_tau).sum(axis=1)
rows = []
for tau in taus:
    A = (np.abs(R) > tau).astype(int)
    G = nx.from_numpy_array(A)
    dens = nx.density(G)
    C = nx.average_clustering(G)
    E = nx.global_efficiency(G)
    gcc = max(len(c) for c in nx.connected_components(G)) / N
    rho = spearmanr(A.sum(axis=1), deg_ref)[0]
    rows.append((tau, dens, C, E, gcc, rho))
    print(f"阈值 {tau:.2f}: 密度={dens:.3f}  聚集系数={C:.3f}  全局效率={E:.3f}  "
          f"最大连通分支占比={gcc:.2f}  度排序与阈值{ref_tau}的秩相关={rho:.2f}")

rows = np.array(rows)
fig, ax = plt.subplots(1, 2, figsize=(9, 3.5))
ax[0].plot(rows[:, 0], rows[:, 1], "o-", label="密度")
ax[0].plot(rows[:, 0], rows[:, 2], "s-", label="平均聚集系数")
ax[0].plot(rows[:, 0], rows[:, 3], "^-", label="全局效率")
ax[0].set_xlabel("绝对阈值 |r| >")
ax[0].legend(fontsize=8)
ax[1].plot(rows[:, 1], rows[:, 2], "s-", label="聚集系数")
ax[1].plot(rows[:, 1], rows[:, 3], "^-", label="全局效率")
ax[1].set_xlabel("网络密度")
ax[1].legend(fontsize=8)
fig.suptitle("模拟数据:拓扑指标随阈值与密度变化")
fig.tight_layout()
plt.show()

Run在浏览器中运行

首次加载 Python 环境约需 20–40 秒;可以修改参数后重新运行。

阈值敏感性——同一个相关矩阵,不同绝对阈值下的拓扑指标