使用密度测试测试两个网络的对称性

graspologic的“inference”模块包含了一些函数,这些函数能够对两个网络进行定量比较,以评估它们是否在统计上相似。这种“相似性”可以通过几种不同的方式来评估,具体取决于要比较的网络的细节以及用户的偏好。

可以执行的最简单的测试是密度测试,该测试基于Erdos-Renyi模型。在此模型下,假设网络中任意两个节点之间的边的概率是某个常数p。为了比较两个网络,问题在于第一个网络的边概率是否与第二个网络的边概率不同。这个测试可以很容易地使用推理模块执行,具体过程将在下面详细描述。

Erdos-Renyi (ER) 模型

Erdos-Renyi (ER) 模型是最简单的网络模型之一。该模型认为网络中每条潜在边出现的概率是相同的。换句话说,任何两个节点之间的所有边出现的可能性都是相同的。

```{admonition} 数学 设 \(n\) 为节点数。我们说对于所有 \((i, j), i \neq j\),其中 \(i\)\(j\) 都从 \(1 ... n\) 运行,边 \((i, j)\) 出现的概率为:

\[P[A_{ij} = 1] = p_{ij} = p\]

其中 \(p\) 是全局连接概率。

邻接矩阵 \(A\) 的每个元素随后根据 伯努利分布 独立采样:

\[A_{ij} \sim Bernoulli(p)\]

对于如上所述的网络模型,我们称其为分布式

\[A \sim ER(n, p)\]

```

因此,对于这个模型,唯一感兴趣的参数是全局连接概率,\(p\)。这有时也被称为网络密度

在ER模型下进行测试

为了在这个模型下比较两个网络 \(A^{(L)}\)\(A^{(R)}\),我们只需要计算这些网络的密度(\(p^{(L)}\)\(p^{(R)}\)),然后运行一个统计测试来查看这些密度是否显著不同。

```{admonition} 数学 在这个模型下,边的总数 \(m\) 来自一个 \(Binomial(n(n-1), p)\) 分布,其中 \(n\) 是节点的数量。这是因为边的数量是具有相同概率的独立伯努利试验的总和。如果 \(m^{(L)}\) 是左半球的边数,而 \(m^{(R)}\) 是右半球的边数,那么我们有以下关系:

\[m^{(L)} \sim Binomial(n^{(L)}(n^{(L)} - 1), p^{(L)})\]

并且独立地,

\[m^{(R)} \sim Binomial(n^{(R)}(n^{(R)} - 1), p^{(R)})\]

为了比较这两个网络,我们只对\(p^{(L)}\)\(p^{(R)}\)的比较感兴趣。正式地,我们正在测试:

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

幸运的是,测试比例相等的问题已经被很好地研究过了。使用graspologic.inference,我们可以通过使用method="fisher"或method="chi2"分别进行Fisher精确检验或卡方检验来进行这种比较。在这个例子中,我们使用Fisher精确检验。

[1]:
import numpy as np
import matplotlib.pyplot as plt

from graspologic.inference.density_test import density_test
from graspologic.simulations import er_np
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

执行密度测试

为了说明密度测试,我们将首先随机生成两个已知密度的网络,以便使用该测试进行比较。

[2]:
A1 = er_np(500, 0.6)
A2 = er_np(400, 0.8)
heatmap(A1, title='Adjacency Matrix for Network 1')
heatmap(A2, title='Adjacency Matrix for Network 2')
[2]:
<Axes: title={'center': 'Adjacency Matrix for Network 2'}>
../../_images/tutorials_inference_density_test_5_1.png
../../_images/tutorials_inference_density_test_5_2.png

显然,这些网络的密度非常不同。我们可以通过进行密度测试来统计确认这种差异。

[3]:
stat, pvalue, er_misc = density_test(A1,A2)
print(pvalue)

0.0
/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)