skbio.stats.distance.mantel

skbio.stats.distance.mantel(x, y, method='pearson', permutations=999, alternative='two-sided', strict=True, lookup=None)[源代码]

使用Mantel检验计算距离矩阵之间的相关性。

状态:从0.4.0开始实验。

Mantel测试通过计算对称距离矩阵的下(或上)三角部分中的距离之间的相关性来比较两个距离矩阵。相关性可以使用皮尔逊乘积矩相关系数或斯皮尔曼等级相关系数来计算。

如中所定义 [1], Mantel测试计算测试统计数据 \(r_M\) 给定两个对称距离矩阵 \(D_X\)\(D_Y\)\(r_M\) 被定义为

\[R_M=\frac{1}{d-1}\sum_{i=1}^{n-1}\sum_{j=i+1}^{n} 看台(D_X)_{ij}看台(D_Y)_{ij}\]

哪里

\[D=\FRAC{n(n-1)}{2}\]

\(n\) 是每个距离矩阵中的行数/列数。 \(stand(D_X)\)\(stand(D_Y)\) 是距离矩阵,其上三角形包含标准化距离。请注意,由于 \(D_X\)\(D_Y\) 如果矩阵的下三角部分是对称的,则可以等效地使用矩阵的下三角部分来代替上三角部分(Current函数以这种方式工作)。

如果 method='spearman' ,上述公式对排序距离而不是原始距离进行运算。

统计意义通过排列检验来评估。第一个距离矩阵的行和列 (x )被随机排列多次(通过控制 permutations )。为每个排列计算相关系数,并且p值是等于或比原始(未排列的)相关系数更极端的排列的相关系数的比例。置换后的相关系数是否比原始相关系数“更极端”取决于替代假设(通过 alternative )。

参数:
  • x (DistanceMatrix or array_like) -- 要比较的输入距离矩阵。如果 xy 两者都是 DistanceMatrix 实例,它们将根据匹配的ID重新排序(请参见 strictlookup 下面用于处理匹配/不匹配的ID);因此,它们不需要具有相同的ID顺序。如果 xyarray_like ,则不应用重新排序,并且两个矩阵必须具有相同的形状。不管是哪种情况, xy 大小必须至少为3x3 after ID的重新排序和匹配。

  • y (DistanceMatrix or array_like) -- 要比较的输入距离矩阵。如果 xy 两者都是 DistanceMatrix 实例,它们将根据匹配的ID重新排序(请参见 strictlookup 下面用于处理匹配/不匹配的ID);因此,它们不需要具有相同的ID顺序。如果 xyarray_like ,则不应用重新排序,并且两个矩阵必须具有相同的形状。不管是哪种情况, xy 大小必须至少为3x3 after ID的重新排序和匹配。

  • method ({'pearson', 'spearman','kendalltau'}) -- 一种用于计算距离矩阵之间相关性的方法。

  • permutations (int, optional) -- 随机置换的次数 x 在评估统计意义时。必须大于或等于零。如果为零,则将跳过统计显著性计算,并且p值将 np.nan

  • alternative ({'two-sided', 'greater', 'less'}) -- 计算统计显著性时使用的替代假设。默认设置 'two-sided' 替代假设计算其大小(即取绝对值之后)大于或等于原始相关系数绝对值的置换相关系数的比例。 'greater' 计算大于或等于原始系数的置换系数的比例。 'less' 计算小于或等于原始系数的置换系数的比例。

  • strict (bool, optional) -- 如果 True ,引发了一个 ValueError 如果找到在两个距离矩阵中都不存在的ID。如果 False ,则在运行测试之前丢弃任何不匹配的ID。看见 n (在下面的返回部分中)获取测试中使用的匹配ID的数量。如果出现以下情况,则忽略此参数 xyarray_like

  • lookup (dict, optional) -- 将距离矩阵中的每个ID映射到新ID。用于在运行Mantel测试之前跨距离矩阵匹配ID。如果距离矩阵之间的ID已经匹配,则不需要此参数。如果出现以下情况,则不允许使用此参数 xyarray_like

返回:

  • corr_coeff ( float )--测试的相关系数(取决于 method )。

  • p_value ( float )--p-测试的值。

  • n ( int )-在ID的任何重新排序/匹配之后,每个距离矩阵中的行数/列数。如果 strict=False ,在运行Mantel测试之前,可能已经从一个或两个距离矩阵中丢弃了不匹配的ID,因此此值可能很重要,因为它指示 actual 所比较的矩阵的大小。

抛出:
  • ValueError -- 如果 xy ID重新排序/匹配后大小不至少为3x3,或无效 method 、数量 permutations ,或 alternative 都提供了。

  • TypeError -- 如果 xy 不是两者都是 DistanceMatrix 实例或 array_like

备注

曼特尔测试最初是在#年描述的。 [2]. 通用算法和界面类似于 vegan::mantel ,在R‘s素食套餐中提供 [3].

np.nan 将为p值返回 permutations 为零,或者如果相关系数为 np.nan 。相关系数将为 np.nan 如果一个输入或两个输入没有任何变化(即距离都是恒定的),并且 method='spearman'

引用

示例

导入我们将在以下示例中使用的功能:

>>> from skbio import DistanceMatrix
>>> from skbio.stats.distance import mantel

定义两个3x3距离矩阵:

>>> x = DistanceMatrix([[0, 1, 2],
...                     [1, 0, 3],
...                     [2, 3, 0]])
>>> y = DistanceMatrix([[0, 2, 7],
...                     [2, 0, 6],
...                     [7, 6, 0]])

计算它们之间的皮尔逊相关性,并使用包含999个排列的双侧测试来评估重要性:

>>> coeff, p_value, n = mantel(x, y)
>>> print(round(coeff, 4))
0.7559

因此,我们看到一种中等到强烈的正相关性 (\(r_M=0.7559\) 两个矩阵之间)。

在上一个示例中,距离矩阵 (xy )具有相同的ID,顺序相同:

>>> x.ids
('0', '1', '2')
>>> y.ids
('0', '1', '2')

如有必要, mantel 将在运行测试之前对距离矩阵重新排序。该函数还支持 lookup 将距离矩阵ID映射到新ID的字典,提供在运行Mantel测试之前在距离矩阵之间匹配ID的方法。

例如,让我们重新分配距离矩阵的ID,以便它们之间没有匹配的ID:

>>> x.ids = ('a', 'b', 'c')
>>> y.ids = ('d', 'e', 'f')

如果我们重新运行 mantel ,我们收到以下错误,通知我们存在不匹配的ID(这是的默认行为 strict=True ):

>>> mantel(x, y)
Traceback (most recent call last):
    ...
ValueError: IDs exist that are not in both distance matrices.

如果我们通过了 strict=False 要忽略/丢弃不匹配的ID,我们会看到 xy ,因此仍无法运行Mantel测试:

>>> mantel(x, y, strict=False)
Traceback (most recent call last):
    ...
ValueError: No matching IDs exist between the distance matrices.

要解决此问题,我们可以定义一个 lookup 用于指定距离矩阵之间的ID应如何匹配的字典:

>>> lookup = {'a': 'A', 'b': 'B', 'c': 'C',
...           'd': 'A', 'e': 'B', 'f': 'C'}

lookup 将每个ID映射到 'A''B' ,或 'C' 。如果我们重新运行 mantel 使用 lookup ,我们得到与所有距离矩阵ID匹配的原始示例相同的结果:

>>> coeff, p_value, n = mantel(x, y, lookup=lookup)
>>> print(round(coeff, 4))
0.7559

mantel 还接受以下输入: array_like 。例如,如果我们重新定义 xy 作为嵌套的Python列表,而不是 DistanceMatrix 实例,我们得到相同的结果:

>>> x = [[0, 1, 2],
...      [1, 0, 3],
...      [2, 3, 0]]
>>> y = [[0, 2, 7],
...      [2, 0, 6],
...      [7, 6, 0]]
>>> coeff, p_value, n = mantel(x, y)
>>> print(round(coeff, 4))
0.7559

需要注意ID重新排序/匹配(因此 strictlookup 参数)在输入为 array_like 因为没有身份证的概念。