当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python scipy.stats.permutation_test用法及代码示例

用法:

scipy.stats.permutation_test(data, statistic, *, permutation_type='independent', vectorized=False, n_resamples=9999, batch=None, alternative='two-sided', axis=0, random_state=None)

对提供的数据执行给定统计量的排列测试。

对于独立样本统计,原假设是数据是从同一分布中随机抽样的。对于配对样本统计,可以检验两个零假设:数据是随机配对的,或者数据是随机分配给样本的。

参数

data array-like的迭代

包含样本,每个样本都是一组观察值。样本数组的维度必须与广播兼容,除了沿轴。

statistic 可调用的

要计算假设检验的p-value 的统计量。统计必须是接受样本作为单独参数的可调用对象(例如statistic(*data)) 并返回结果统计信息。如果矢量化已设置True,统计还必须接受关键字参数并被矢量化以计算沿提供的统计量的样本数组。

permutation_type {‘independent’, ‘samples’, ‘pairings’},可选

根据原假设,要执行的排列类型。前两种排列类型用于配对样本统计,其中所有样本包含相同数量的观察值,并且沿轴具有相应索引的观察值被认为是配对的;三是独立样本统计。

  • 'samples' :观察值分配给不同的样本,但仍与来自其他样本的相同观察值配对。此排列类型适用于配对样本假设检验,例如 Wilcoxon signed-rank 检验和配对 t-test。

  • 'pairings' :观察与不同的观察配对,但它们保留在同一个样本中。此排列类型适用于具有统计信息的关联/相关测试,例如 Spearman 的 、Kendall 的 和 Pearson 的

  • 'independent'(默认):观察被分配给不同的样本。样本可能包含不同数量的观察值。此排列类型适用于独立样本假设检验,例如 Mann-Whitney 检验和独立样本 t-test。

    有关排列类型的更详细说明,请参阅下面的注释部分。

vectorized 布尔值,默认值:False

默认,统计假设只计算包含在数据.如果矢量化已设置True,统计还必须接受关键字参数并被矢量化以计算沿提供的统计量中的 ND 阵列数据.使用矢量化统计可以减少计算时间。

n_resamples int 或 np.inf 默认值:9999

用于近似零分布的随机排列(重采样)的数量。如果大于或等于不同排列的数量,将计算精确的零分布。请注意,不同排列的数量随着样本大小的增加而快速增长,因此精确测试仅适用于非常小的数据集。

batch int 可选

每次调用中要处理的排列数统计.内存使用量为 O(批处理`*``n`), 在哪里n是所有样本的总大小,与矢量化.默认为None, 在这种情况下batch是排列的数量。

alternative {‘two-sided’,‘less’, ‘greater’},可选

计算p-value 的备择假设。对于每个备选方案,p-value 为精确测试定义如下。

  • 'greater' :大于或等于检验统计量观察值的空分布百分比。

  • 'less' :小于或等于检验统计量观察值的空分布百分比。

  • 'two-sided'(默认):上述 p-values 中较小的两倍。

请注意,随机测试的 p-values 是根据 [2][3] 中建议的保守 (over-estimated) 近似值计算的,而不是根据 [4] 中建议的无偏估计量计算的。即,在计算与检验统计量的观测值一样极端的随机零分布的比例时,分子和分母中的值都加一。这种调整的一种解释是,检验统计量的观察值始终作为随机零分布的一个元素包含在内。 two-sided p-values 使用的约定不是通用的;如果首选不同的定义,则返回观察到的测试统计量和空分布。

axis int 默认值:0

计算统计数据的(广播)样本的轴。如果样本具有不同数量的维度,则在考虑轴之前,会将单一维度添加到具有较少维度的样本之前。

random_state {无,int numpy.random.Generator

用于生成排列的伪随机数生成器状态。

如果random_stateNone(默认),numpy.random.RandomState使用单例。如果random_state是一个int 一个新的RandomState使用实例,播种random_state.如果random_state已经是一个Generator或者RandomState实例然后使用该实例。

返回

statistic 浮点数或 ndarray

观察到的数据检验统计量。

pvalue 浮点数或 ndarray

给定备选方案的p-value。

null_distribution ndarray

在原假设下生成的检验统计量的值。

注意

该函数支持的三种置换测试如下所述。

非配对统计(permutation_type='independent'):

与这种排列类型相关的零假设是所有观测值都是从相同的基础分布中采样的,并且它们已被随机分配给其中一个样本。

假设data 包含两个样本;例如a, b = data 。当 1 < n_resamples < binom(n, k) 时,其中

  • ka 中的观察数,

  • nab 中的观察总数,并且

  • binom(n, k) 是二项式系数( n 选择 k ),

将数据合并(连接),随机分配给第一个或第二个样本,然后计算统计量。该过程重复执行,置换次数,生成零假设下的统计分布。将原始数据的统计数据与此分布进行比较以确定p-value。

什么时候n_resamples >= binom(n, k),进行精确检验:数据为分区的在每种不同方式的样本之间恰好一次,并且形成了精确的零分布。请注意,对于样本之间的给定数据分区,数据只有一个排序/排列之内每个样本都被考虑。对于不依赖于样本中数据顺序的统计数据,这会显著降低计算成本,而不会影响零分布的形状(因为每个值的频率/计数受相同因子的影响)。

为了a = [a1, a2, a3, a4]b = [b1, b2, b3], 这种排列类型的一个例子是x = [b3, a1, a2, b2]y = [a4, b1, a3].因为数据只有一种排序/排列之内每个样本都被考虑在一个精确的测试中,一个重采样像x = [b3, a1, b2, a2]y = [a4, a3, b1]不是被认为与上面的例子不同。

permutation_type='independent' 不支持one-sample 统计,但可以应用于两个以上样本的统计。在这种情况下,如果 n 是每个样本中的观察数的数组,则不同分区的数量为:

np.product([binom(sum(n[i:]), sum(n[i+1:])) for i in range(len(n)-1)])

配对统计,置换配对(permutation_type='pairings'):

与这种排列类型相关的零假设是,每个样本中的观察来自相同的基础分布,并且与其他样本的元素的配对是随机分配的。

假设data 只包含一个样本;例如a, = data ,我们希望考虑 a 的元素与第二个样本 b 的元素的所有可能配对。令 na 中的观察数,它也必须等于 b 中的观察数。

什么时候1 < n_resamples < factorial(n), 的元素a是随机排列的。用户提供的统计数据接受一个数据参数,比如a_perm, 并计算统计量a_permb.这个过程反复进行,排列次,生成零假设下的统计分布。将原始数据的统计数据与此分布进行比较以确定p-value。

什么时候n_resamples >= factorial(n), 进行精确测试:a以每种不同的方式恰好排列一次。因此,统计为每个唯一的样本对计算ab恰好一次。

对于 a = [a1, a2, a3]b = [b1, b2, b3] ,此排列类型的示例是 a_perm = [a3, a1, a2]b 保留其原始顺序。

permutation_type='pairings'支持data包含任意数量的样本,每个样本必须包含相同数量的观测值。提供的所有样品data被置换独立地.因此,如果m是样本数和n是每个样本内的观察数,那么精确测试中的排列数是:

factorial(n)**m

请注意,例如,如果 two-sample 统计数据本身并不依赖于提供观察的顺序 - 仅依赖于配对的观察 - 那么应该只提供两个样本中的一个data.这在不影响零分布形状的情况下显著降低了计算成本(因为每个值的频率/计数受相同因子的影响)。

配对统计,置换样本(permutation_type='samples'):

与此排列类型相关的原假设是,每对中的观察值均来自相同的基础分布,并且分配给它们的样本是随机的。

假设data 包含两个样本;例如a, b = data 。令 na 中的观察数,它也必须等于 b 中的观察数。

什么时候1 < n_resamples < 2**n, 的元素ab在样本之间随机交换(保持它们的配对)并计算统计量。这个过程反复进行,排列次,生成零假设下的统计分布。将原始数据的统计数据与此分布进行比较以确定p-value。

n_resamples >= 2**n 时,将执行精确测试:以每种不同的方式(同时保持配对)将观察结果分配给两个样本恰好一次。

对于 a = [a1, a2, a3]b = [b1, b2, b3] ,这种排列类型的示例是 x = [b1, a2, b3]y = [a1, b2, a3]

permutation_type='samples'支持data包含任意数量的样本,每个样本必须包含相同数量的观测值。如果data包含多个样本,其中的成对观察data在样本之间交换独立地.因此,如果m是样本数和n是每个样本内的观察数,那么精确测试中的排列数是:

factorial(m)**n

几个配对样本统计检验,例如 Wilcoxon 符号秩检验和配对样本t-test,可以只考虑区别在两个配对元素之间。因此,如果data只包含一个样本,则通过独立改变标志每个观察。

参考

1

    1. 费舍尔。实验设计,第 6 版(1951 年)。

scipy.stats.permutation_test

B. Phipson 和 G. K. Smyth。 “排列 P-values 永远不应该为零:在随机绘制排列时计算精确的 P-values。”遗传学和分子生物学中的统计应用 9.1 (2010)。

scipy.stats.permutation_test

M.D.恩斯特。 “排列方法:精确推断的基础”。统计科学(2004 年)。

scipy.stats.permutation_test

B. Efron 和 R. J. Tibshirani。 Bootstrap 简介(1993 年)。

例子

假设我们希望测试两个样本是否来自同一分布。假设我们不知道潜在的分布,并且在观察数据之前,我们假设第一个样本的平均值会小于第二个样本的平均值。我们决定将样本均值之间的差异用作检验统计量,并且我们将认为 0.05 的 p-value 具有统计显著性。

为了提高效率,我们以向量化的方式编写定义测试统计量的函数:样本xy可以是 ND 数组,并且会为每个 axis-slice 计算统计量.

>>> def statistic(x, y, axis):
...     return np.mean(x, axis=axis) - np.mean(y, axis=axis)

收集数据后,我们计算检验统计量的观察值。

>>> from scipy.stats import norm
>>> rng = np.random.default_rng()
>>> x = norm.rvs(size=5, random_state=rng)
>>> y = norm.rvs(size=6, loc = 3, random_state=rng)
>>> statistic(x, y, 0)
-3.5411688580987266

实际上,检验统计量为负,表明 x 的分布的真实均值小于 y 的分布的真实均值。如果两个样本是从同一分布中抽取的,为了确定偶然发生这种情况的概率,我们进行了置换检验。

>>> from scipy.stats import permutation_test
>>> # because our statistic is vectorized, we pass `vectorized=True`
>>> # `n_resamples=np.inf` indicates that an exact test is to be performed
>>> res = permutation_test((x, y), statistic, vectorized=True,
...                        n_resamples=np.inf, alternative='less')
>>> print(res.statistic)
-3.5411688580987266
>>> print(res.pvalue)
0.004329004329004329

在原假设下获得小于或等于观测值的检验统计量的概率为 0.4329%。这低于我们选择的 5% 阈值,因此我们认为这是反对零假设的重要证据,支持替代假设。

由于上述样本的大小很小, permutation_test 可以进行精确测试。对于较大的样本,我们采用随机排列测试。

>>> x = norm.rvs(size=100, random_state=rng)
>>> y = norm.rvs(size=120, loc=0.3, random_state=rng)
>>> res = permutation_test((x, y), statistic, n_resamples=100000,
...                        vectorized=True, alternative='less',
...                        random_state=rng)
>>> print(res.statistic)
-0.5230459671240913
>>> print(res.pvalue)
0.00016999830001699983

在原假设下获得小于或等于观测值的检验统计量的近似概率为 0.0225%。这再次低于我们选择的 5% 阈值,因此我们再次有重要证据可以拒绝零假设而支持替代假设。

对于大样本和排列数量,结果与相应的渐近检验的结果相当,独立样本t-test。

>>> from scipy.stats import ttest_ind
>>> res_asymptotic = ttest_ind(x, y, alternative='less')
>>> print(res_asymptotic.pvalue)
0.00012688101537979522

提供检验统计量的排列分布以供进一步研究。

>>> import matplotlib.pyplot as plt
>>> plt.hist(res.null_distribution, bins=50)
>>> plt.title("Permutation distribution of test statistic")
>>> plt.xlabel("Value of Statistic")
>>> plt.ylabel("Frequency")
scipy-stats-permutation_test-1.png

相关用法

注:本文由堆栈答案筛选整理自scipy.org大神的英文原创作品 scipy.stats.permutation_test。非经特殊声明,原始代码版权归原作者所有,本译文的传播和使用请遵循“署名-相同方式共享 4.0 国际 (CC BY-SA 4.0)”协议。