组连接测试¶
在本教程中,我们演示了如何使用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\)所属的社区或组的函数。因此,该模型由以下参数化:
网络中每个节点的分组分配。请注意,这种分配可以被视为确定性的或随机的,具体取决于想要使用的模型的具体框架。
一组组间连接概率
设\(n\)为节点数,\(K\)为SBM中的组数。对于从SBM采样的网络\(A\):
我们说对于所有 \((i,j), i \neq j\),其中 \(i\) 和 \(j\) 都从 \(1 ... n\) 运行,边 \((i,j)\) 出现的概率是:
其中 \(B \in [0,1]^{K \times K}\) 是一个组到组连接概率的矩阵,而 \(\tau \in \{1...K\}^n\) 是一个节点到组分配的向量。请注意,这里我们假设 \(\tau\) 是一个固定的分配向量,尽管 SBM 的其他公式允许这些分配本身来自一个分类分布。
在SBM模型下进行测试¶
假设这个模型,有几种方法可以测试两个网络之间的差异。在这个例子中,我们感兴趣的是比较两个图的组到组连接概率矩阵,\(B\)。
我们对测试感兴趣:
与密度测试中只需比较一个比例不同,此测试需要比较两个网络的SBM模型之间的所有\(K^2\)概率。
上述假设检验可以分解为\(K^2\)个独立的假设。\(B^{(L)}\)和\(B^{(R)}\)都是\(K \times K\)矩阵,其中每个元素\(b_{kl}\)表示从组\(k\)中的节点连接到组\(l\)中的节点的概率。我们还知道,左侧网络的组\(k\)与右侧网络的组\(k\)相对应。换句话说,组是匹配的。因此,我们感兴趣的是测试,对于\(k, l\)都从\(1...K\)运行的情况:
为了进行比较,用户需要提供两个网络的邻接矩阵和标签向量。在这个例子中,我们将生成具有已知属性的随机网络,以演示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'}>
接下来,我们为第二个网络生成第二个邻接矩阵。我们将为这个网络提供不同数量的节点和不同的连接概率矩阵。
[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'}>
现在,我们可以运行 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