类 KolmogorovSmirnovTest
K-S检验使用基于样本数据点的经验分布与零假设下期望分布的最大偏差的统计量。对于评估一组样本数据点是否遵循给定分布的单样本检验,检验统计量为 \(D_n=\sup_x |F_n(x)-F(x)|\),其中 \(F\) 是期望分布,\(F_n\) 是 \(n\) 个样本数据点的经验分布。使用基于 [1] 的方法估计 \(D_n\) 的分布,对极端值做出一些快速决策,详见 [2]。
还支持双样本检验,评估两个样本 x 和 y 是否来自相同的基础分布的零假设。在这种情况下,检验统计量为 \(D_{n,m}=\sup_t | F_n(t)-F_m(t)|\),其中 \(n\) 是 x 的长度,\(m\) 是 y 的长度,\(F_n\) 是将质量 \(1/n\) 放在 x 中的每个值上的经验分布,\(F_m\) 是 y 值的经验分布。默认的双样本检验方法 kolmogorovSmirnovTest(double[], double[]) 的工作方式如下:
- 对于小样本(样本大小的乘积小于
LARGE_SAMPLE_PRODUCT),使用 [4] 中提出的方法计算双样本检验的精确 p 值。 - 当样本大小的乘积超过
LARGE_SAMPLE_PRODUCT时,使用 \(D_{n,m}\) 的渐近分布。有关近似值的详细信息,请参阅approximateP(double, int, int)。
如果样本大小的乘积小于 LARGE_SAMPLE_PRODUCT 并且样本数据包含并列值,则在应用上述算法之前,会向样本数据添加随机抖动以打破并列值。或者,如果数据中已知存在并列值,则可以使用模仿 R Matching 包中的 bootstrap(double[], double[], int, boolean) 方法。[3]。
在双样本情况下,\(D_{n,m}\) 具有离散分布。这使得与零假设 \(H_0 : D_{n,m} \ge d \) 相关的 p 值与 \(H_0 : D_{n,m} > d \) 有所不同,差异在于观察值 \(d\) 的质量。为了区分这两者,双样本检验使用布尔型 strict 参数。对于大样本,此参数将被忽略。
2-样本默认实现使用的方法也直接暴露出来:
exactP(double, int, int, boolean)计算精确的 2-样本 p 值approximateP(double, int, int)使用渐近分布。前两种方法中的boolean参数允许用严格或非严格不等式来表示用于估计 p 值的概率。请参阅kolmogorovSmirnovTest(double[], double[], boolean)。
参考文献:
- [1] 评估 Kolmogorov 分布,George Marsaglia、Wai Wan Tsang 和 Jingbo Wang
- [2] 计算双侧 Kolmogorov-Smirnov 分布,Richard Simard 和 Pierre L'Ecuyer
- [3] Jasjeet S. Sekhon。2011。 具有自动平衡优化的多变量和倾向得分匹配软件:R 包中的匹配软件 统计软件杂志,42(7):1-52。
- [4] Kim, P. J. 和 Jennrich, R. I. (1970)。在数理统计中的选定表格中的两样本 Kolmogorov-Smirnov 准则 D_mn 的精确抽样分布表,Vol. 1,H. L. Harter 和 D. B. Owen,编辑。
请注意,[1] 中计算 h 的过程存在错误,请参考 MATH-437 了解详情。
-
字段概要
字段修饰符和类型字段说明protected static final doubleprotected static final int当样本大小的乘积超过此值时,双样本 K-S 检验使用渐近分布计算 p 值。protected static final intksSum(double, double, int)中部分和的数量上限protected static final double#pelzGood(double, double, int) 中求和的收敛标准 -
构造器概要
构造器构造器说明构造一个 KolmogorovSmirnovTest 实例。KolmogorovSmirnovTest(long seed) 构造一个 KolmogorovSmirnovTest 实例,为bootstrap(double[], double[], int)方法使用的 PRNG 提供种子。 -
方法概要
修饰符和类型方法说明doubleapproximateP(double d, int n, int m) 使用 Kolmogorov-Smirnov 分布来近似 \(P(D_{n,m} > d)\),其中 \(D_{n,m}\) 是双样本 Kolmogorov-Smirnov 统计量。doublebootstrap(double[] x, double[] y, int iterations) 计算bootstrap(x, y, iterations, true)。doublebootstrap(double[] x, double[] y, int iterations, boolean strict) 估计双样本 Kolmogorov-Smirnov 检验的 p 值,评估x和y是否来自相同的概率分布的零假设。doublecdf(double d, int n) 使用 [1] 中描述的方法计算P(D_n < d),对极端值做出快速决策,详见 [2](见上文)。doublecdf(double d, int n, boolean exact) 使用 [1] 中描述的方法计算P(D_n < d),对极端值做出快速决策,详见 [2](见上文)。doublecdfExact(double d, int n) 计算P(D_n < d)。doubleexactP(double d, int n, int m, boolean strict) 如果strict为true,则计算 \(P(D_{n,m} > d)\);否则计算 \(P(D_{n,m} \ge d)\),其中 \(D_{n,m}\) 是双样本 Kolmogorov-Smirnov 统计量。doublekolmogorovSmirnovStatistic(double[] x, double[] y) 计算双样本 Kolmogorov-Smirnov 检验统计量,\(D_{n,m}=\sup_x |F_n(x)-F_m(x)|\),其中 \(n\) 是x的长度,\(m\) 是y的长度,\(F_n\) 是将质量 \(1/n\) 放在x中的每个值上的经验分布,\(F_m\) 是y值的经验分布。doublekolmogorovSmirnovStatistic(RealDistribution distribution, double[] data) 计算单样本 Kolmogorov-Smirnov 检验统计量,\(D_n=\sup_x |F_n(x)-F(x)|\),其中 \(F\) 是与distribution相关的分布(cdf)函数,\(n\) 是data的长度,\(F_n\) 是将质量 \(1/n\) 放在data中的每个值上的经验分布。doublekolmogorovSmirnovTest(double[] x, double[] y) doublekolmogorovSmirnovTest(double[] x, double[] y, boolean strict) doublekolmogorovSmirnovTest(RealDistribution distribution, double[] data) doublekolmogorovSmirnovTest(RealDistribution distribution, double[] data, boolean exact) booleankolmogorovSmirnovTest(RealDistribution distribution, double[] data, double alpha) doubleksSum(double t, double tolerance, int maxIterations) 计算 \( 1 + 2 \sum_{i=1}^\infty (-1)^i e^{-2 i^2 t^2} \),当连续部分和彼此之间的连续部分和在tolerance范围内,或者计算了maxIterations个部分和时停止。doublepelzGood(double d, int n) 计算 [2] 中描述的 Pelz-Good 近似值 \(P(D_n < d)\)。
-
字段详细资料
-
MAXIMUM_PARTIAL_SUM_COUNT
protected static final int MAXIMUM_PARTIAL_SUM_COUNTksSum(double, double, int)中部分和的数量上限- 另请参阅:
-
KS_SUM_CAUCHY_CRITERION
protected static final double KS_SUM_CAUCHY_CRITERION- 另请参阅:
-
PG_SUM_RELATIVE_ERROR
protected static final double PG_SUM_RELATIVE_ERROR#pelzGood(double, double, int)中求和的收敛准则- 另请参阅:
-
LARGE_SAMPLE_PRODUCT
protected static final int LARGE_SAMPLE_PRODUCT当样本大小的乘积超过此值时,2样本K-S检验使用渐近分布来计算p值。- 另请参阅:
-
-
构造器详细资料
-
KolmogorovSmirnovTest
public KolmogorovSmirnovTest()构造一个KolmogorovSmirnovTest实例。 -
KolmogorovSmirnovTest
public KolmogorovSmirnovTest(long seed) 构造一个KolmogorovSmirnovTest实例,为bootstrap(double[], double[], int)方法使用的PRNG提供种子。- 参数:
-
seed- PRNG的种子
-
-
方法详细资料
-
kolmogorovSmirnovTest
计算一样本Kolmogorov-Smirnov检验的p值,或观察显著水平,评估data符合distribution的零假设。如果exact为true,则用于计算p值的分布使用扩展精度计算。参见cdfExact(double, int)。- 参数:
-
distribution- 参考分布 -
data- 正在评估的样本 -
exact- 是否强制计算p值的精确值 - 返回:
-
与零假设相关联的p值,即
data是distribution的样本 - 抛出:
-
MathIllegalArgumentException- 如果data的长度不至少为2 -
NullArgumentException- 如果data为null
-
kolmogorovSmirnovStatistic
计算一样本Kolmogorov-Smirnov检验统计量,\(D_n=\sup_x |F_n(x)-F(x)|\),其中\(F\)是与distribution相关联的分布(cdf)函数,\(n\)是data的长度,\(F_n\)是将质量\(1/n\)放在data中的每个值上的经验分布。- 参数:
-
distribution- 参考分布 -
data- 正在评估的样本 - 返回:
- Kolmogorov-Smirnov统计量\(D_n\)
- 抛出:
-
MathIllegalArgumentException- 如果data的长度不至少为2 -
NullArgumentException- 如果data为null
-
kolmogorovSmirnovTest
public double kolmogorovSmirnovTest(double[] x, double[] y, boolean strict) 计算二样本Kolmogorov-Smirnov检验的p值,或观察显著水平,评估x和y是否来自相同概率分布的零假设。具体来说,返回的是一个估计概率,即从将合并样本随机分成大小为x.length和y.length的子样本的分区中随机选择的分区与kolmogorovSmirnovStatistic(x, y)相关联的kolmogorovSmirnovStatistic(double[], double[])将严格超过(如果strict为true)或至少与strict = false一样大的概率。- 对于小样本(其中样本大小的乘积小于
LARGE_SAMPLE_PRODUCT),使用[4]中提出的方法计算精确p值,实现在exactP(double, int, int, boolean)中。 - 当样本大小的乘积超过
LARGE_SAMPLE_PRODUCT时,使用\(D_{n,m}\)的渐近分布。有关近似值的详细信息,请参见approximateP(double, int, int)。
如果
x.length * y.length<LARGE_SAMPLE_PRODUCT,并且x和y中包含的值的组合集包含平局,则在计算\(D_{n,m}\)和p值之前,向x和y添加随机抖动以打破平局。抖动在(-minDelta / 2, minDelta / 2)上均匀分布,其中minDelta是组合样本中值之间的最小两两差异。如果数据中已知存在平局,则可以使用
bootstrap(double[], double[], int, boolean)作为估计p值的替代方法。- 参数:
-
x- 第一个样本数据集 -
y- 第二个样本数据集 -
strict- 是否将要计算的概率表示为严格不等式(对于大样本忽略) - 返回:
-
与零假设相关联的p值,即
x和y表示来自相同分布的样本 - 抛出:
-
MathIllegalArgumentException- 如果x或y的长度不至少为2 -
NullArgumentException- 如果x或y为null - 另请参阅:
- 对于小样本(其中样本大小的乘积小于
-
kolmogorovSmirnovTest
public double kolmogorovSmirnovTest(double[] x, double[] y) 计算二样本Kolmogorov-Smirnov检验的p值,或观察显著水平,评估x和y是否来自相同概率分布的零假设。假设用于计算p值的不等式的严格形式。参见kolmogorovSmirnovTest(RealDistribution, double[], boolean)。- 参数:
-
x- 第一个样本数据集 -
y- 第二个样本数据集 - 返回:
-
与零假设相关联的p值,即
x和y表示来自相同分布的样本 - 抛出:
-
MathIllegalArgumentException- 如果x或y的长度不至少为2 -
NullArgumentException- 如果x或y为null
-
kolmogorovSmirnovStatistic
public double kolmogorovSmirnovStatistic(double[] x, double[] y) 计算二样本Kolmogorov-Smirnov检验统计量,\(D_{n,m}=\sup_x |F_n(x)-F_m(x)|\),其中\(n\)是x的长度,\(m\)是y的长度,\(F_n\)是将质量\(1/n\)放在x中的每个值上的经验分布,\(F_m\)是y值的经验分布。- 参数:
-
x- 第一个样本 -
y- 第二个样本 - 返回:
-
用于评估
x和y表示来自相同基础分布的零假设的检验统计量\(D_{n,m}\) - 抛出:
-
MathIllegalArgumentException- 如果x或y的长度不至少为2 -
NullArgumentException- 如果x或y为null
-
kolmogorovSmirnovTest
计算一样本Kolmogorov-Smirnov检验的p值,或观察显著水平,评估data是否符合distribution的零假设。- 参数:
-
distribution- 参考分布 -
data- 正在评估的样本 - 返回:
-
与零假设相关联的p值,即
data是distribution的样本 - 抛出:
-
MathIllegalArgumentException- 如果data的长度不至少为2 -
NullArgumentException- 如果data为null
-
kolmogorovSmirnovTest
执行Kolmogorov-Smirnov检验,评估data是否符合distribution的零假设。- 参数:
-
distribution- 参考分布 -
data- 正在评估的样本 -
alpha- 测试的显著水平 - 返回:
-
如果可以以置信度1 -
alpha拒绝data是distribution的样本的零假设,则为true - 抛出:
-
MathIllegalArgumentException- 如果data的长度不至少为2 -
NullArgumentException- 如果data为null
-
bootstrap
public double bootstrap(double[] x, double[] y, int iterations, boolean strict) 估计两样本 Kolmogorov-Smirnov 检验的p值,评估x和y是否来自相同概率分布的零假设。该方法通过重复从合并样本的经验分布中抽取大小为x.length和y.length的集合来估计p值。当strict为true时,这等同于R函数ks.boot中实现的算法,描述如下:Jasjeet S. Sekhon. 2011. 'Multivariate and Propensity Score Matching Software with Automated Balance Optimization: The Matching package for R.' Journal of Statistical Software, 42(7): 1-52.
- 参数:
-
x- 第一个样本 -
y- 第二个样本 -
iterations- 自举重采样迭代次数 -
strict- 零假设是否表达为严格不等式 - 返回:
- 估计的p值
-
bootstrap
public double bootstrap(double[] x, double[] y, int iterations) 计算bootstrap(x, y, iterations, true)。这等同于使用R Matching包函数ks.boot(x,y, nboots=iterations)。参见#bootstrap(double[], double[], int, boolean)。- 参数:
-
x- 第一个样本 -
y- 第二个样本 -
iterations- 自举重采样迭代次数 - 返回:
- 估计的p值
-
cdf
使用[1]中描述的方法计算P(D_n < d),对极端值做出快速决策[2](见上文)。结果不像cdfExact(double, int)那样精确,因为计算基于double而不是BigFraction。- 参数:
-
d- 统计量 -
n- 样本大小 - 返回:
- \(P(D_n < d)\)
- 抛出:
-
MathRuntimeException- 如果算法无法将h转换为BigFraction,以便将d表示为\((k - h) / m\),其中k, m为整数,且\(0 <= h < 1\)
-
cdfExact
计算P(D_n < d)。结果是精确的,因为在所有地方都使用了BigFraction/BigReal,但执行速度非常慢。在实际应用中几乎永远不要选择这个,除非你非常确定;这几乎完全是为了验证目的。通常,你会选择cdf(double, int)。有关定义和算法描述,请参阅类javadoc。- 参数:
-
d- 统计量 -
n- 样本大小 - 返回:
- \(P(D_n < d)\)
- 抛出:
-
MathRuntimeException- 如果算法无法将h转换为BigFraction,以便将d表示为\((k - h) / m\),其中k, m为整数,且\(0 <= h < 1\)
-
cdf
使用[1]中描述的方法计算P(D_n < d),对极端值做出快速决策[2](见上文)。- 参数:
-
d- 统计量 -
n- 样本大小 -
exact- 是否应该使用BigFraction在所有地方精确计算概率,以换取非常慢的执行时间,或者应该在方便的地方使用double以获得速度。在实际应用中几乎永远不要选择true,除非你非常确定;true几乎完全是为了验证目的。 - 返回:
- \(P(D_n < d)\)
- 抛出:
-
MathRuntimeException- 如果算法无法将h转换为BigFraction,以便将d表示为\((k - h) / m\),其中k, m为整数,且\(0 \lt;= h < 1\)。
-
pelzGood
public double pelzGood(double d, int n) 计算\(P(D_n < d)\)的Pelz-Good近似值,如[2]中所述,在类javadoc中。- 参数:
-
d- d-统计量的值([2]中的x) -
n- 样本大小 - 返回:
- \(P(D_n < d)\)
-
ksSum
public double ksSum(double t, double tolerance, int maxIterations) 计算\( 1 + 2 \sum_{i=1}^\infty (-1)^i e^{-2 i^2 t^2} \),当连续部分和彼此之间的差值小于tolerance,或者计算了maxIterations个部分和时停止。如果在maxIterations次迭代之前总和不收敛,则抛出MathIllegalStateException。- 参数:
-
t- 参数 -
tolerance- 部分和的柯西准则 -
maxIterations- 要计算的部分和的最大数量 - 返回:
- 在t处评估的Kolmogorov和
- 抛出:
-
MathIllegalStateException- 如果级数不收敛
-
exactP
public double exactP(double d, int n, int m, boolean strict) 如果strict为true,则计算\(P(D_{n,m} > d)\);否则计算\(P(D_{n,m} \ge d)\),其中\(D_{n,m}\)是2样本Kolmogorov-Smirnov统计量。有关\(D_{n,m}\)的定义,请参见kolmogorovSmirnovStatistic(double[], double[])。返回的概率是精确的,通过展开类javadoc中[4]中呈现的递归函数定义来实现。
- 参数:
-
d- D-统计量的值 -
n- 第一个样本大小 -
m- 第二个样本大小 -
strict- 要计算的概率是否表达为严格不等式 - 返回:
-
随机选择的m-n分区生成\(D_{n,m}\)大于(或大于等于)
d的概率
-
approximateP
public double approximateP(double d, int n, int m) 使用Kolmogorov-Smirnov分布来近似\(P(D_{n,m} > d)\),其中\(D_{n,m}\)是2样本Kolmogorov-Smirnov统计量。有关\(D_{n,m}\)的定义,请参见kolmogorovSmirnovStatistic(double[], double[])。具体来说,返回的是\(1 - k(d \sqrt{mn / (m + n)})\),其中\(k(t) = 1 + 2 \sum_{i=1}^\infty (-1)^i e^{-2 i^2 t^2}\)。有关如何确定总和收敛的详细信息,请参见
ksSum(double, double, int)。此实现将ksSum作为tolerance传递给KS_SUM_CAUCHY_CRITERION,将MAXIMUM_PARTIAL_SUM_COUNT作为maxIterations传递。- 参数:
-
d- D-统计量的值 -
n- 第一个样本大小 -
m- 第二个样本大小 - 返回:
-
随机选择的m-n分区生成\(D_{n,m}\)大于
d的近似概率
-