组连接测试

在本教程中,我们演示了如何使用graspologic.inference模块来比较两个网络的子图密度,这两个网络都包含属于某些已知家族或组的节点。两个网络中的家族或组的数量和身份必须相同。然后可以使用group_connection_test函数来确定两个网络的组到组连接密度是否存在任何统计差异。

[1]:
import numpy as np

from graspologic.inference.group_connection_test import group_connection_test
from graspologic.simulations import sbm
from graspologic.plot import heatmap

np.random.seed(8888)

%matplotlib inline
/home/runner/.cache/pypoetry/virtualenvs/graspologic-pkHfzCJ8-py3.10/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
  from .autonotebook import tqdm as notebook_tqdm

随机块模型 (SBM)

一个随机块模型(SBM)是一个流行的网络统计模型。简而言之,该模型将节点\(i\)和节点\(j\)之间出现边的概率视为纯粹是节点\(i\)\(j\)所属的社区的函数。因此,该模型由以下参数化:

  1. 网络中每个节点的分组分配。请注意,这种分配可以被视为确定性的或随机的,具体取决于想要使用的模型的具体框架。

  2. 一组组间连接概率

\(n\)为节点数,\(K\)为SBM中的组数。对于从SBM采样的网络\(A\)

\[A \sim SBM(B, \tau)\]

我们说对于所有 \((i,j), i \neq j\),其中 \(i\)\(j\) 都从 \(1 ... n\) 运行,边 \((i,j)\) 出现的概率是:

\[P[A_{ij} = 1] = P_{ij} = B_{\tau_i, \tau_j}\]

其中 \(B \in [0,1]^{K \times K}\) 是一个组到组连接概率的矩阵,而 \(\tau \in \{1...K\}^n\) 是一个节点到组分配的向量。请注意,这里我们假设 \(\tau\) 是一个固定的分配向量,尽管 SBM 的其他公式允许这些分配本身来自一个分类分布。

在SBM模型下进行测试

假设这个模型,有几种方法可以测试两个网络之间的差异。在这个例子中,我们感兴趣的是比较两个图的组到组连接概率矩阵,\(B\)

我们对测试感兴趣:

\[H_0: B^{(L)} = B^{(R)}, \quad H_A: B^{(L)} \neq B^{(R)}\]

与密度测试中只需比较一个比例不同,此测试需要比较两个网络的SBM模型之间的所有\(K^2\)概率。

上述假设检验可以分解为\(K^2\)个独立的假设。\(B^{(L)}\)\(B^{(R)}\)都是\(K \times K\)矩阵,其中每个元素\(b_{kl}\)表示从组\(k\)中的节点连接到组\(l\)中的节点的概率。我们还知道,左侧网络的组\(k\)与右侧网络的组\(k\)相对应。换句话说,是匹配的。因此,我们感兴趣的是测试,对于\(k, l\)都从\(1...K\)运行的情况:

\[H_0: B_{kl}^{(L)} = B_{kl}^{(R)}, \quad H_A: B_{kl}^{(L)} \neq B_{kl}^{(R)}\]

为了进行比较,用户需要提供两个网络的邻接矩阵和标签向量。在这个例子中,我们将生成具有已知属性的随机网络,以演示group_connection_test函数的使用。

首先,我们生成并绘制一个邻接矩阵,该矩阵表示一个具有两个组和指定组间连接概率数组的网络。

[2]:
P = np.array([[0.8, 0.6],
              [0.6, 0.8]])
csize = [50] * 2
A1, labels1 = sbm(csize, P, return_labels = True)
heatmap(A1, title='2-block SBM adjacency matrix')

[2]:
<Axes: title={'center': '2-block SBM adjacency matrix'}>
../../_images/tutorials_inference_group_connection_test_5_1.png

接下来,我们为第二个网络生成第二个邻接矩阵。我们将为这个网络提供不同数量的节点和不同的连接概率矩阵。

[3]:
P = np.array([[0.865, 0.66],
              [0.66, 0.865]])
csize = [60] * 2
A2, labels2 = sbm(csize, P, return_labels = True)
heatmap(A2, title='2-block SBM adjacency matrix')
[3]:
<Axes: title={'center': '2-block SBM adjacency matrix'}>
../../_images/tutorials_inference_group_connection_test_7_1.png

现在,我们可以运行 group_connection_test 来评估这两个网络之间是否存在统计差异。当然,我们预计会有差异,因为设计上,它们的组间连接密度是不同的。

[4]:
stat, pvalue, misc = group_connection_test(A1, A2, labels1, labels2)
print(pvalue)
3.617921207995385e-13
/home/runner/work/graspologic/graspologic/graspologic/inference/group_connection_test.py:362: UserWarning: This test assumes that the networks are directed, but one or both adjacency matrices are symmetric.
  warnings.warn(msg)

这个极低的p值表明我们应该拒绝零假设,并得出结论:在随机块模型下,这两个网络在统计上是不同的。比较每个组到组连接的个体p值也非常低:

[5]:
print(misc["corrected_pvalues"])
target             0             1
source
0       3.617921e-13  2.317673e-06
1       2.317673e-06  3.183079e-07