使用密度测试测试两个网络的对称性¶
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\) 的每个元素随后根据 伯努利分布 独立采样:
对于如上所述的网络模型,我们称其为分布式
```
因此,对于这个模型,唯一感兴趣的参数是全局连接概率,\(p\)。这有时也被称为网络密度。
在ER模型下进行测试¶
为了在这个模型下比较两个网络 \(A^{(L)}\) 和 \(A^{(R)}\),我们只需要计算这些网络的密度(\(p^{(L)}\) 和 \(p^{(R)}\)),然后运行一个统计测试来查看这些密度是否显著不同。
```{admonition} 数学 在这个模型下,边的总数 \(m\) 来自一个 \(Binomial(n(n-1), p)\) 分布,其中 \(n\) 是节点的数量。这是因为边的数量是具有相同概率的独立伯努利试验的总和。如果 \(m^{(L)}\) 是左半球的边数,而 \(m^{(R)}\) 是右半球的边数,那么我们有以下关系:
并且独立地,
为了比较这两个网络,我们只对\(p^{(L)}\)与\(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'}>
显然,这些网络的密度非常不同。我们可以通过进行密度测试来统计确认这种差异。
[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)