scipy.stats.

cramervonmises_2samp#

scipy.stats.cramervonmises_2samp(x, y, method='auto', *, axis=0, nan_policy='propagate', keepdims=False)[源代码]#

执行双样本 Cramér-von Mises 拟合优度检验。

这是 Cramér-von Mises 检验的双样本版本 ([1]):对于两个独立的样本 \(X_1, ..., X_n\)\(Y_1, ..., Y_m\),原假设是这些样本来自相同的(未指定的)连续分布。

参数:
xarray_like

随机变量 \(X_i\) 的观测值的一维数组。必须包含至少两个观测值。

yarray_like

随机变量 \(Y_i\) 的观测值的一维数组。必须包含至少两个观测值。

method{‘auto’, ‘asymptotic’, ‘exact’}, 可选

用于计算 p 值得方法,详见注释。默认值为 ‘auto’。

axisint 或 None, 默认值: 0

如果为 int,则为计算统计量的输入沿其的轴。输入的每个轴切片(例如,行)的统计量将出现在输出的相应元素中。如果为 None,则在计算统计量之前将输入展平。

nan_policy{‘propagate’, ‘omit’, ‘raise’}

定义如何处理输入 NaN。

  • propagate:如果计算统计量的轴切片(例如,行)中存在 NaN,则输出的相应条目将为 NaN。

  • omit:执行计算时将省略 NaN。 如果计算统计量的轴切片中剩余的数据不足,则输出的相应条目将为 NaN。

  • raise:如果存在 NaN,则会引发 ValueError

keepdimsbool, 默认值: False

如果设置为 True,则缩减的轴将作为大小为 1 的维度保留在结果中。使用此选项,结果将正确广播到输入数组。

返回:
res带有属性的对象
statisticfloat

Cramér-von Mises 统计量。

pvaluefloat

p 值。

注释

在 1.7.0 版本中添加。

该统计量根据 [2] 中的等式 9 计算。p 值的计算取决于关键字 method

  • asymptotic:p 值通过使用检验统计量的极限分布进行近似。

  • exact:通过枚举检验统计量的所有可能组合来计算精确的 p 值,请参阅 [2]

如果 method='auto',如果两个样本都包含小于或等于 20 个观测值,则使用精确方法,否则使用渐近分布。

如果底层分布不是连续的,则 p 值很可能是保守的([3] 中的第 6.2 节)。当对数据进行排序以计算检验统计量时,如果有并列值,则使用中间秩。

从 SciPy 1.9 开始,在执行计算之前,np.matrix 输入(不建议用于新代码)会转换为 np.ndarray。在这种情况下,输出将是标量或具有适当形状的 np.ndarray,而不是二维 np.matrix。 类似地,虽然会忽略掩码数组的掩码元素,但输出将是标量或 np.ndarray,而不是 mask=False 的掩码数组。

参考文献

[2] (1,2)

Anderson, T.W. (1962). On the distribution of the two-sample Cramer-von-Mises criterion. The Annals of Mathematical Statistics, pp. 1148-1159.

[3]

Conover, W.J., Practical Nonparametric Statistics, 1971.

示例

假设我们想测试由 scipy.stats.norm.rvs 生成的两个样本是否具有相同的分布。我们选择显著性水平 alpha=0.05。

>>> import numpy as np
>>> from scipy import stats
>>> rng = np.random.default_rng()
>>> x = stats.norm.rvs(size=100, random_state=rng)
>>> y = stats.norm.rvs(size=70, random_state=rng)
>>> res = stats.cramervonmises_2samp(x, y)
>>> res.statistic, res.pvalue
(0.29376470588235293, 0.1412873014573014)

p 值超过了我们选择的显著性水平,因此我们不拒绝原假设,即观察到的样本来自同一分布。

对于小样本量,可以计算精确的 p 值

>>> x = stats.norm.rvs(size=7, random_state=rng)
>>> y = stats.t.rvs(df=2, size=6, random_state=rng)
>>> res = stats.cramervonmises_2samp(x, y, method='exact')
>>> res.statistic, res.pvalue
(0.197802197802198, 0.31643356643356646)

即使样本量很小,基于渐近分布的 p 值也是一个很好的近似值。

>>> res = stats.cramervonmises_2samp(x, y, method='asymptotic')
>>> res.statistic, res.pvalue
(0.197802197802198, 0.2966041181527128)

与方法无关,在这个例子中,人们不会在选择的显著性水平上拒绝原假设。