大数据时代的“小数据”系列2 随机游程检验

什么是游程检验

游程检验:是根据样本标志表现排列所形成的游程的多少进行判断的检验方法,主要用于检验一件事件的发生是否是随机的。游程检验广泛应用于工业产品的质量检验和生物制药检验等领域。随着大数据技术的兴起。游程检验也不断体现着他的作用。

scala实现随机游程检验


import breeze.stats.distributions._
import math._

  /**
    * RunsTest
    * @param serise
   **/
   def runsTest(serise: Seq[Int], alternative: String = hypothesis.twosided) = {

    if (serise.distinct.length > 2) {
      println("the serise need 0-1 destribution")
    } else {
      // 计算序列长度
      val slen = serise.length
      // 计算游程数
      var runsTimes = 1
      for (i <- 0 until slen - 1) {
        if (serise(i) != serise(i + 1)) runsTimes += 1 else runsTimes
      }

      val m = serise.filter(_ == 1).size
      val n = serise.filter(_ == 0).size
      val E = 1 + 2 * n * m / (n + m)
      val s2 = (2 * n * m * (2 * n * m - n - m)) / (math.pow(n + m, 2) * (n + m - 1))

      // 构建检验统计量(大样本条件下的服从正态分布)
      val statistic = (runsTimes - E) / math.sqrt(s2)

      val norm = new Gaussian(0, 1)

      // 计算正态分布的分布函数值
      def pnorm(statistic: Double) = {
        norm.probability(Double.NegativeInfinity, statistic)
      }

      // 求不同假设条件下的p值
      val pvalue: Double = if (alternative == "positive.correlated") {
        //     "Runs Test - Positive Correlated"
        pnorm(statistic)

      } else if (alternative == "negative.correlated") {
        //   "Runs Test - Negative Correlated"
        1 - pnorm(statistic)

      } else {
        //   "Runs Test - Two sided"
        2 * min(pnorm(statistic), 1 - pnorm(statistic))

      }
      // 返回检验统计量和p值
      (statistic, pvalue)
    }

  }

我们来看一个例子(这个例子不是很贴切,但是可以说明问题):假设抛一枚硬币,出现正面我们记为1,反面记为0,在反复抛了10次之后我们得出如下结果:(1,0,1,1,0,0,1,1,1,0)
我们想要通过结果判断该硬币是否是公平的,此时我们就可以应用游程检验的方法。首先呢我们建立假设:
H0:抛硬币的结果是随机的(即硬币是公平的)
H1:抛硬币的结果是非随机的(即硬币是不公平的)

val run = Array(1,0,1,1,0,0,1,1,1,0)
val value = runsTest(run)
println(value)

(0.7024393586862705,0.48240520716622526)

检验的结果 p-value =0.48 >0.05*,我们可以认为没有充分的证据拒绝原假设,所以认为该硬币是公平的
那么如果抛硬币的结果为(0, 1, 0, 1, 0, 1, 0, 1, 0, 1)呢?
明显,这样的结果不是随机的,它已经具有周期性了。我们还是用上面的方法做检验:

val run = Array(0, 1, 0, 1, 0, 1, 0, 1, 0, 1)
val value = runsTest(run)
println(value)
(2.6832815729997477,0.007290358091535776)

p-value < 0.05 ,所以呢我们拒绝原假设。可以认为这枚硬币是有问题的(也可能是抛硬币的人有问题哦)
*关于p-value 选定的显著性水平通常情况下都选为0.05,当然也可以根据实际需求做相应调整

R语言实现随机游程检验

游程检验用R语言实现可以参考 吴喜之老师的《非参数统计》
也可以参考以下博文

https://blog.csdn.net/Yunru_Yang/article/details/62040455

参考资料

《非参数统计》第四版 吴喜之 赵博娟

https://blog.csdn.net/Yunru_Yang/article/details/62040455
部分代码参考自R语言 lawstat包
https://mirrors.tuna.tsinghua.edu.cn/CRAN/

猜你喜欢

转载自blog.csdn.net/k_wzzc/article/details/81916212