什么是游程检验
游程检验:是根据样本标志表现排列所形成的游程的多少进行判断的检验方法,主要用于检验一件事件的发生是否是随机的。游程检验广泛应用于工业产品的质量检验和生物制药检验等领域。随着大数据技术的兴起。游程检验也不断体现着他的作用。
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
部分代码参考自R语言 lawstat包
https://mirrors.tuna.tsinghua.edu.cn/CRAN/