非参数统计的Python实现——随机游程检验
程序员文章站
2024-02-25 22:22:27
...
概念
随机游程检验是检验一个序列中的数据出现是否与顺序无关的一种方法。值得注意的是,随机游程检验的零假设是数据出现顺序随机,备择假设是数据出现顺序不随机。
实例 & 代码
在试验设计中,经常要关心试验误差 ( experiment error ) 是否与序号无关。假设有 A, B, C 三个葡萄品种,用完全试验设计需要重复测量4次,安排在12个试验田中栽种,共得到12组数据,每个试验田试验结果收成 ( 单位:kg ) 如下表所示。试问按试验田的序号,检查误差分布是否按序号随机?显著性水平为0.05。
(1) B | (2) C | (3) B | (4) B | (5) C | (6) A | (7) A | (8) C | (9) A | (10) B | (11) C | (12) A |
---|---|---|---|---|---|---|---|---|---|---|---|
23 | 24 | 18 | 23 | 19 | 11 | 6 | 22 | 14 | 22 | 27 | 15 |
解答:
首先计算每个品种的均值 mean( A )=11.5 ,mean( B )=21.5 ,mean( C )=23。各试验田实际收成与各自误差成分之间出现顺序为正和负的记录为:
(1) B | (2) C | (3) B | (4) B | (5) C | (6) A | (7) A | (8) C | (9) A | (10) B | (11) C | (12) A |
---|---|---|---|---|---|---|---|---|---|---|---|
+ | + | - | + | - | - | - | - | + | + | + | + |
import numpy as np
import pandas as pd
import scipy.stats as stats
from scipy.special import comb
def run_test(list_2e):
arr=pd.factorize(list_2e)[0]
if (2 in arr) or (1 not in arr):
return '输入的列表不是二分类数据'
count={}
for i in arr:
count[i]=count.get(i,0)+1
n,n0,n1=len(arr),count[0],count[1]
r=1
for i in range(len(arr)-1):
if arr[i+1]!=arr[i]:
r+=1
if r%2==0:
p=2*comb(n1-1,r/2-1)*comb(n0-1,r/2-1)/comb(n,n1)
else:
p=(comb(n1-1,(r-1)/2-1)*comb(n0-1,(r-1)/2)+comb(n1-1,(r-1)/2)*comb(n0-1,(r-1)/2-1))/comb(n,n1)
return {'游程数':r,'p值':p}
run_test(['+','+','-','+','-','-','-','-','+','+','+','+'])
结果如下:
{‘游程数’: 5,‘p值’: 0.121}
由于p值大于0.05,因此认为试验误差分布随机。
上一篇: web设置网页背景为好看炫酷的渐变色样式