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)[source]#

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

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

参数:
x, yndarray

如果 xy 的形状为 (n, p)(n, q),其中 n 是样本数,pq 是维度数,则将运行 MGC 独立性检验。或者,如果 xy 是距离或相似度矩阵,则 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 or map-like callable, optional

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

[-1, 1] 中的样本 MGC 检验统计量。

pvaluefloat

通过置换获得的 p 值。

mgc_dictdict

包含其他有用的结果

  • mgc_mapndarray

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

  • opt_scale(int, int)

    估计的最佳尺度作为 (x, y) 对。

  • null_distlist

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

参见

pearsonr

用于测试非相关的皮尔逊相关系数和 p 值。

kendalltau

计算肯德尔 tau。

spearmanr

计算斯皮尔曼等级顺序相关系数。

注释

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)