Заслуженный участник |
|
01/09/13 4690
|
Последний раз редактировалось Geen 04.07.2024, 23:40, всего редактировалось 3 раз(а).
... рекомендации ... .... Если распределение в каждом бине близко к нормальному, то такую рекомендацию можно принять. Но в данном случае это не так. Можете посчитать, сколько раз из 1000 отвергается нулевая гипотеза по условию при тесте с группировкой Код
def freq(arr,n):
res = [0 for _ in range(n+1)];
for _ in arr: res[_] += 1;
return res;
def bonferroni(arr):
arr.sort();
n = len(arr);
res = reversed(list(_*n/(i+1) for i,_ in enumerate(arr)));
cur = inf;
res = [cur:=min(_,cur) for _ in res];
res.reverse();
return res;
bigK = 100;
bigRes = [];
p = 1/3;
n = 18;
m = 47;
k = 1000;
nn = floor(log10(n-1))+1;
kn = floor(log10(k-1))+1;
for _ in range(bigK):
print('-----------------------------------');
res = [[] for _ in range(n+1)];
pval_true = [];
pval_euus = [];
bin = [nchoosek(n,_)*pow(p,_)*pow(1-p,n-_)*m for _ in range(n+1)];
print(bin);
for _ in range(k):
sample = list(sum(random()<p for i in range(n)) for i in range(m));
frq = freq(sample,n);
for i,_ in enumerate(frq):
if _:
res[i].append(_);
chi2_true = sum((frq[i]-bin[i])**2/bin[i] for i in range(n+1));
pval_true.append(gammaincreg(n,chi2_true));
chi2_euus = 0;
cbin = bin.copy();
dir = 0;
tn = 0;
while frq:
cf = 0; cb = 0;
while cf < 5 and frq:
cf += frq.pop(dir);
cb += cbin.pop(dir);
chi2_euus += (cf-cb)**2/cb;
tn += 1;
dir = -1-dir;
pval_euus.append(gammaincreg(tn-1,chi2_euus));
ma = max(max(_ or [0]) for _ in res);
for i,_ in enumerate(res):
frq = freq(_,ma);
#frq.pop(0);
print(('%%%ii'%nn)%i,*[('%%%ii'%kn)%_ if _ else ' '*kn for _ in frq]);
qval_true = bonferroni(pval_true);
qval_euus = bonferroni(pval_euus);
print(qval_euus[:10]);
print(pval_euus[:10]);
bigRes.append(sum(_<0.05 for _ in pval_euus));
print(histf(bigRes));
Результат (включая только вывод последнего цикла)
-----------------------------------
[0.03180205577614669, 0.2862185019853202, 1.2164286334376107, 3.2438096891669606, 6.08214316718805, 8.515000434063268, 9.224583803568539, 7.906786117344461, 5.4359154556743166, 3.0199530309301754, 1.3589788639185787, 0.49417413233402846, 0.1441341219307583, 0.033261720445559605, 0.005939592936707071, 0.0007919457248942759, 7.424491170883835e-05, 4.367347747578727e-06, 1.2131521521052015e-07]
0 30
1 206 40 3 1
2 362 246 75 24 1 1
3 103 191 254 191 109 62 28 13 5 1
4 7 31 84 124 153 187 147 125 74 41 12 9 5
5 5 13 39 75 88 119 155 153 132 94 62 36 13 8 6 2
6 5 7 18 45 80 127 136 157 127 111 79 52 30 16 4 5 1
7 7 20 50 89 124 167 157 130 103 63 48 23 9 6 4
8 19 61 103 158 189 179 116 79 63 17 7 4 2
9 146 217 249 161 99 48 25 8 1 1
10 337 258 97 40 10 2 1
11 289 68 7 1
12 122 7 3
13 33
14 5
15
16
17
18
[2.389621366304163e-05, 0.0004849257548949292, 0.002987786017112267, 0.004160743147966028, 0.004160743147966028, 0.02399345014162508, 0.02399345014162508, 0.02420566796471397, 0.02420566796471397, 0.02690354887326138]
[2.3896213663041628e-08, 9.698515097898584e-07, 8.9633580513368e-06, 1.904709600434731e-05, 2.0803715739830143e-05, 0.0001470063613551422, 0.00016795415099137557, 0.00021379733901034586, 0.00021785101168242572, 0.0002690354887326138]
[[87, 1], [93, 1], [95, 1], [97, 1], [99, 1], [101, 1], [102, 1], [103, 2], [104, 4], [105, 1], [107, 3], [108, 2], [109, 1], [110, 2], [111, 5], [112, 5], [113, 4], [114, 5], [115, 2], [116, 3], [117, 6], [118, 8], [119, 5], [120, 2], [121, 2], [122, 4], [123, 3], [124, 1], [125, 2], [126, 2], [127, 1], [128, 4], [129, 3], [131, 1], [132, 1], [133, 1], [134, 1], [135, 2], [138, 3], [140, 1], [143, 1]]
('true' тесты убрал - совсем безобразные результаты дают, всё-таки) -- 04.07.2024, 23:40 --Сравнить с ожидаемым значением . Очень странного Вы ожидаете, не находите?
|
|