scipy.stats.

multiscale_graphcorr#

scipy.stats.multiscale_graphcorr(x, y, compute_distance=<function _euclidean_dist>, reps=1000, workers=1, is_twosamp=False, random_state=None)[源代码]#

计算多尺度图相关 (MGC) 检验统计量。

具体而言,对于每个点,MGC 找到一个属性的 \(k\) 个最近邻(例如云密度),以及另一个属性的 \(l\) 个最近邻(例如草的湿度)[1]。这个对 \((k, l)\) 被称为“尺度”。然而,先验地,不知道哪些尺度最能提供信息。因此,MGC 计算所有距离对,然后有效地计算所有尺度的距离相关性。局部相关性说明了哪些尺度相对而言可以提供关于关系的信息。因此,成功发现和解读不同数据模态之间关系的关键是自适应地确定哪些尺度信息量最大,以及信息量最大的尺度的几何含义。这样做不仅可以估计模态是否相关,还可以深入了解如何做出判断。这在高维数据中尤其重要,在这些数据中,简单的可视化无法向未经训练的人眼揭示关系。此实现的具体特征已在 [2] 中推导和基准测试。

参数:
x, yndarray

如果 xy 的形状分别为 (n, p)(n, q),其中 n 是样本数量,pq 是维度数量,则将运行 MGC 独立性检验。或者,如果 xy 是距离或相似度矩阵,它们的形状可以是 (n, n),并且 compute_distance 必须设置为 None。如果 xy 的形状分别为 (n, p)(m, p),则将运行非配对双样本 MGC 检验。

compute_distancecallable, optional

一个函数,用于计算每个数据矩阵中样本之间的距离或相似度。如果 xy 已经是距离矩阵,则设置为 None。默认使用欧几里得范数度量。如果要调用自定义函数,请提前创建距离矩阵或创建形式为 compute_distance(x) 的函数,其中 x 是用于计算成对距离的数据矩阵。

repsint, optional

使用排列检验估计零值时使用的复制次数。默认值为 1000

workersint 或类 map 的可调用对象, optional

如果 workers 是一个整数,则将总体细分为 workers 个部分并并行评估(使用 multiprocessing.Pool <multiprocessing>)。提供 -1 以使用进程可用的所有核心。或者,提供一个类 map 的可调用对象,例如 multiprocessing.Pool.map,用于并行评估 p 值。此评估以 workers(func, iterable) 的形式进行。要求 func 是可 pickle 的。默认值为 1

is_twosampbool, optional

如果 True,则将运行双样本检验。如果 xy 的形状分别为 (n, p)(m, p),则此可选参数将被覆盖并设置为 True。如果 xy 的形状均为 (n, p) 并且需要双样本检验,则设置为 True。默认值为 False。请注意,如果输入是距离矩阵,则不会运行此检验。

random_state{None, int, numpy.random.Generator,

如果 seed 为 None(或 np.random),则使用 numpy.random.RandomState 单例。如果 seed 是一个整数,则使用一个新的 RandomState 实例,并使用 seed 作为种子。如果 seed 已经是 GeneratorRandomState 实例,则使用该实例。

返回:
resMGCResult

一个包含属性的对象

statisticfloat

样本 MGC 检验统计量,范围在 [-1, 1] 内。

pvaluefloat

通过排列获得的 p 值。

mgc_dictdict

包含其他有用的结果

  • mgc_mapndarray

    关系潜在几何的二维表示。

  • opt_scale(int, int)

    估计的最佳尺度,以 (x, y) 对表示。

  • null_distlist

    从置换矩阵导出的零分布。

另请参阅

pearsonr

用于检验非相关的 Pearson 相关系数和 p 值。

kendalltau

计算 Kendall 的 tau。

spearmanr

计算 Spearman 等级顺序相关系数。

注释

有关 MGC 流程和在神经科学数据上的应用的描述,请参见 [1]。它使用以下步骤执行

  1. 计算两个距离矩阵 \(D^X\)\(D^Y\),并进行修改以使其按列均值为零。这会生成两个 \(n \times n\) 距离矩阵 \(A\)\(B\)(居中和无偏修改)[3]

  2. 对于 \(1, ..., n\) 中的所有值 \(k\)\(l\)

    • 计算每个属性的 \(k\)-最近邻图和 \(l\)-最近邻图。其中,\(G_k (i, j)\) 表示 \(A\) 的第 \(i\) 行的 \(k\) 个最小值,\(H_l (i, j)\) 表示 \(B\) 的第 \(i\) 行的 \(l\) 个最小值

    • \(\circ\) 表示逐元素的矩阵乘积,则局部相关性通过以下统计量求和并归一化:

\[c^{kl} = \frac{\sum_{ij} A G_k B H_l} {\sqrt{\sum_{ij} A^2 G_k \times \sum_{ij} B^2 H_l}}\]
  1. MGC检验统计量是 \(\{ c^{kl} \}\) 的平滑最优局部相关性。将平滑操作表示为 \(R(\cdot)\) (其本质是将所有孤立的大相关性设置为0,并将连接的大相关性保持不变,参见 [3]。) MGC为:

\[MGC_n (x, y) = \max_{(k, l)} R \left(c^{kl} \left( x_n, y_n \right) \right)\]

由于进行了归一化,检验统计量返回一个介于 \((-1, 1)\) 之间的值。

返回的p值是使用置换检验计算的。此过程首先随机置换 \(y\) 以估计零分布,然后计算在零假设下,观察到的检验统计量至少与观察到的检验统计量一样极端的概率。

MGC至少需要5个样本才能可靠运行。它还可以处理高维数据集。此外,通过操作输入数据矩阵,可以将双样本检验问题简化为独立性检验问题 [4]。给定大小为 \(p \times n\)\(p \times m\) 的样本数据 \(U\)\(V\),可以按如下方式创建数据矩阵 \(X\)\(Y\)

\[X = [U | V] \in \mathcal{R}^{p \times (n + m)} Y = [0_{1 \times n} | 1_{1 \times m}] \in \mathcal{R}^{(n + m)}\]

然后,可以像正常情况一样计算MGC统计量。这种方法可以扩展到类似的检验,例如距离相关性 [4]

在1.4.0版本中添加。

参考文献

[1] (1,2)

Vogelstein, J. T., Bridgeford, E. W., Wang, Q., Priebe, C. E., Maggioni, M., & Shen, C. (2019). Discovering and deciphering relationships across disparate data modalities. ELife.

[2]

Panda, S., Palaniappan, S., Xiong, J., Swaminathan, A., Ramachandran, S., Bridgeford, E. W., … Vogelstein, J. T. (2019). mgcpy: A Comprehensive High Dimensional Independence Testing Python Package. arXiv:1907.02088

[3] (1,2)

Shen, C., Priebe, C.E., & Vogelstein, J. T. (2019). From distance correlation to multiscale graph correlation. Journal of the American Statistical Association.

[4] (1,2)

Shen, C. & Vogelstein, J. T. (2018). The Exact Equivalence of Distance and Kernel Methods for Hypothesis Testing. arXiv:1806.05514

示例

>>> import numpy as np
>>> from scipy.stats import multiscale_graphcorr
>>> x = np.arange(100)
>>> y = x
>>> res = multiscale_graphcorr(x, y)
>>> res.statistic, res.pvalue
(1.0, 0.001)

要运行非配对双样本检验,请执行以下操作:

>>> x = np.arange(100)
>>> y = np.arange(79)
>>> res = multiscale_graphcorr(x, y)
>>> res.statistic, res.pvalue  
(0.033258146255703246, 0.023)

或者,如果输入的形状相同,则执行以下操作:

>>> x = np.arange(100)
>>> y = x
>>> res = multiscale_graphcorr(x, y, is_twosamp=True)
>>> res.statistic, res.pvalue  
(-0.008021809890200488, 1.0)