类 KolmogorovSmirnovTest

java.lang.Object
org.hipparchus.stat.inference.KolmogorovSmirnovTest

public class KolmogorovSmirnovTest extends Object
Kolmogorov-Smirnov (K-S)检验的实现,用于连续分布的相等性。

K-S检验使用基于样本数据点的经验分布与零假设下期望分布的最大偏差的统计量。对于评估一组样本数据点是否遵循给定分布的单样本检验,检验统计量为 \(D_n=\sup_x |F_n(x)-F(x)|\),其中 \(F\) 是期望分布,\(F_n\) 是 \(n\) 个样本数据点的经验分布。使用基于 [1] 的方法估计 \(D_n\) 的分布,对极端值做出一些快速决策,详见 [2]。

还支持双样本检验,评估两个样本 xy 是否来自相同的基础分布的零假设。在这种情况下,检验统计量为 \(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 并且样本数据包含并列值,则在应用上述算法之前,会向样本数据添加随机抖动以打破并列值。或者,如果数据中已知存在并列值,则可以使用模仿 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-样本默认实现使用的方法也直接暴露出来:

参考文献:

请注意,[1] 中计算 h 的过程存在错误,请参考 MATH-437 了解详情。

  • 字段概要

    字段
    修饰符和类型
    字段
    说明
    protected static final double
    ksSum(double, double, int) 的收敛标准
    protected static final int
    当样本大小的乘积超过此值时,双样本 K-S 检验使用渐近分布计算 p 值。
    protected static final int
    ksSum(double, double, int) 中部分和的数量上限
    protected static final double
    #pelzGood(double, double, int) 中求和的收敛标准
  • 构造器概要

    构造器
    构造器
    说明
    构造一个 KolmogorovSmirnovTest 实例。
    KolmogorovSmirnovTest(long seed)
    构造一个 KolmogorovSmirnovTest 实例,为 bootstrap(double[], double[], int) 方法使用的 PRNG 提供种子。
  • 方法概要

    修饰符和类型
    方法
    说明
    double
    approximateP(double d, int n, int m)
    使用 Kolmogorov-Smirnov 分布来近似 \(P(D_{n,m} > d)\),其中 \(D_{n,m}\) 是双样本 Kolmogorov-Smirnov 统计量。
    double
    bootstrap(double[] x, double[] y, int iterations)
    计算 bootstrap(x, y, iterations, true)
    double
    bootstrap(double[] x, double[] y, int iterations, boolean strict)
    估计双样本 Kolmogorov-Smirnov 检验的 p 值,评估 xy 是否来自相同的概率分布的零假设。
    double
    cdf(double d, int n)
    使用 [1] 中描述的方法计算 P(D_n < d),对极端值做出快速决策,详见 [2](见上文)。
    double
    cdf(double d, int n, boolean exact)
    使用 [1] 中描述的方法计算 P(D_n < d),对极端值做出快速决策,详见 [2](见上文)。
    double
    cdfExact(double d, int n)
    计算 P(D_n < d)
    double
    exactP(double d, int n, int m, boolean strict)
    如果 stricttrue,则计算 \(P(D_{n,m} > d)\);否则计算 \(P(D_{n,m} \ge d)\),其中 \(D_{n,m}\) 是双样本 Kolmogorov-Smirnov 统计量。
    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 值的经验分布。
    double
    kolmogorovSmirnovStatistic(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 中的每个值上的经验分布。
    double
    kolmogorovSmirnovTest(double[] x, double[] y)
    计算双样本 Kolmogorov-Smirnov 检验p 值,评估 xy 是否来自相同的概率分布的零假设。
    double
    kolmogorovSmirnovTest(double[] x, double[] y, boolean strict)
    计算双样本 Kolmogorov-Smirnov 检验p 值,评估 xy 是否来自相同的概率分布的零假设。
    double
    kolmogorovSmirnovTest(RealDistribution distribution, double[] data)
    计算单样本 Kolmogorov-Smirnov 检验p 值,评估 data 是否符合 distribution 的零假设。
    double
    kolmogorovSmirnovTest(RealDistribution distribution, double[] data, boolean exact)
    计算单样本 Kolmogorov-Smirnov 检验p 值,评估 data 是否符合 distribution 的零假设。
    boolean
    kolmogorovSmirnovTest(RealDistribution distribution, double[] data, double alpha)
    执行 Kolmogorov-Smirnov 检验,评估 data 是否符合 distribution 的零假设。
    double
    ksSum(double t, double tolerance, int maxIterations)
    计算 \( 1 + 2 \sum_{i=1}^\infty (-1)^i e^{-2 i^2 t^2} \),当连续部分和彼此之间的连续部分和在 tolerance 范围内,或者计算了 maxIterations 个部分和时停止。
    double
    pelzGood(double d, int n)
    计算 [2] 中描述的 Pelz-Good 近似值 \(P(D_n < d)\)。

    从类继承的方法 java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • 字段详细资料

    • MAXIMUM_PARTIAL_SUM_COUNT

      protected static final int MAXIMUM_PARTIAL_SUM_COUNT
      ksSum(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

      public double kolmogorovSmirnovTest(RealDistribution distribution, double[] data, boolean exact)
      计算一样本Kolmogorov-Smirnov检验的p值,或观察显著水平,评估data符合distribution的零假设。如果exact为true,则用于计算p值的分布使用扩展精度计算。参见cdfExact(double, int)
      参数:
      distribution - 参考分布
      data - 正在评估的样本
      exact - 是否强制计算p值的精确值
      返回:
      与零假设相关联的p值,即datadistribution的样本
      抛出:
      MathIllegalArgumentException - 如果data的长度不至少为2
      NullArgumentException - 如果data为null
    • kolmogorovSmirnovStatistic

      public double kolmogorovSmirnovStatistic(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中的每个值上的经验分布。
      参数:
      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值,或观察显著水平,评估xy是否来自相同概率分布的零假设。具体来说,返回的是一个估计概率,即从将合并样本随机分成大小为x.lengthy.length的子样本的分区中随机选择的分区与kolmogorovSmirnovStatistic(x, y)相关联的kolmogorovSmirnovStatistic(double[], double[])将严格超过(如果stricttrue)或至少与strict = false一样大的概率。

      如果x.length * y.length < LARGE_SAMPLE_PRODUCT,并且xy中包含的值的组合集包含平局,则在计算\(D_{n,m}\)和p值之前,向xy添加随机抖动以打破平局。抖动在(-minDelta / 2, minDelta / 2)上均匀分布,其中minDelta是组合样本中值之间的最小两两差异。

      如果数据中已知存在平局,则可以使用bootstrap(double[], double[], int, boolean)作为估计p值的替代方法。

      参数:
      x - 第一个样本数据集
      y - 第二个样本数据集
      strict - 是否将要计算的概率表示为严格不等式(对于大样本忽略)
      返回:
      与零假设相关联的p值,即xy表示来自相同分布的样本
      抛出:
      MathIllegalArgumentException - 如果xy的长度不至少为2
      NullArgumentException - 如果xy为null
      另请参阅:
    • kolmogorovSmirnovTest

      public double kolmogorovSmirnovTest(double[] x, double[] y)
      计算二样本Kolmogorov-Smirnov检验的p值,或观察显著水平,评估xy是否来自相同概率分布的零假设。假设用于计算p值的不等式的严格形式。参见kolmogorovSmirnovTest(RealDistribution, double[], boolean)
      参数:
      x - 第一个样本数据集
      y - 第二个样本数据集
      返回:
      与零假设相关联的p值,即xy表示来自相同分布的样本
      抛出:
      MathIllegalArgumentException - 如果xy的长度不至少为2
      NullArgumentException - 如果xy为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 - 第二个样本
      返回:
      用于评估xy表示来自相同基础分布的零假设的检验统计量\(D_{n,m}\)
      抛出:
      MathIllegalArgumentException - 如果xy的长度不至少为2
      NullArgumentException - 如果xy为null
    • kolmogorovSmirnovTest

      public double kolmogorovSmirnovTest(RealDistribution distribution, double[] data)
      计算一样本Kolmogorov-Smirnov检验的p值,或观察显著水平,评估data是否符合distribution的零假设。
      参数:
      distribution - 参考分布
      data - 正在评估的样本
      返回:
      与零假设相关联的p值,即datadistribution的样本
      抛出:
      MathIllegalArgumentException - 如果data的长度不至少为2
      NullArgumentException - 如果data为null
    • kolmogorovSmirnovTest

      public boolean kolmogorovSmirnovTest(RealDistribution distribution, double[] data, double alpha)
      执行Kolmogorov-Smirnov检验,评估data是否符合distribution的零假设。
      参数:
      distribution - 参考分布
      data - 正在评估的样本
      alpha - 测试的显著水平
      返回:
      如果可以以置信度1 - alpha拒绝datadistribution的样本的零假设,则为true
      抛出:
      MathIllegalArgumentException - 如果data的长度不至少为2
      NullArgumentException - 如果data为null
    • bootstrap

      public double bootstrap(double[] x, double[] y, int iterations, boolean strict)
      估计两样本 Kolmogorov-Smirnov 检验的p值,评估xy是否来自相同概率分布的零假设。该方法通过重复从合并样本的经验分布中抽取大小为x.lengthy.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

      public double cdf(double d, int n) throws MathRuntimeException
      使用[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

      public double cdfExact(double d, int n) throws MathRuntimeException
      计算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

      public double cdf(double d, int n, boolean exact) throws MathRuntimeException
      使用[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)
      如果stricttrue,则计算\(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的近似概率