2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4  След.
 
 Re: Можно ли вычислить " саботажника"
Сообщение04.07.2024, 22:51 


27/08/16
10450
Geen в сообщении #1645072 писал(а):
Я запустил тест 1000 раз и два раза выпало 2 нуля...
Тривиально считается. Вероятность того, что из 1000 тестов не менее двух раз выпадет ровно два нуля, составляет 0.09. Для 1000 тестов количество тестов с двумя нулями - пуассон с параметром $\mu=0.5$.

 Профиль  
                  
 
 Re: Можно ли вычислить " саботажника"
Сообщение04.07.2024, 22:52 
Заслуженный участник
Аватара пользователя


01/09/13
4676
EUgeneUS в сообщении #1645194 писал(а):
А пока тест отверг нулевую гипотезу в 2-х случаях из 1000.

А ведь это с поправкой на множественный тест ;-)

 Профиль  
                  
 
 Re: Можно ли вычислить " саботажника"
Сообщение04.07.2024, 22:54 
Аватара пользователя


11/12/16
14035
уездный город Н
Geen в сообщении #1645196 писал(а):
А ведь это с поправкой на множественный тест ;-)


Так у остальных 998-ми Вы получили p-value ровно единицу :lol:
Посмотрим, что будет без поправки :wink:

 Профиль  
                  
 
 Re: Можно ли вычислить " саботажника"
Сообщение04.07.2024, 22:56 
Заслуженный участник
Аватара пользователя


01/09/13
4676
EUgeneUS в сообщении #1645197 писал(а):
получили p-value ровно единицу

Не p-value, а q-value...

 Профиль  
                  
 
 Re: Можно ли вычислить " саботажника"
Сообщение04.07.2024, 23:10 
Заслуженный участник
Аватара пользователя


01/09/13
4676
EUgeneUS в сообщении #1645194 писал(а):
Посмотрим, что будет с поправкой.

Исправил по Вашему замечанию.
код: [ скачать ] [ спрятать ]
Используется синтаксис Python
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;
p = 1/3;
n = 18;
m = 47;
k = 1000;
nn = floor(log10(n-1))+1;
kn = floor(log10(k-1))+1;
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_true[:10]);
print(qval_euus[:10]);
print(pval_true[:10]);
print(pval_euus[:10]);
 

Один из типичных результатов (как и ожидалось, стало существенно хуже "для теста"):
код: [ скачать ] [ спрятать ]
Используется синтаксис Text
[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   2
 1     219  32   1
 2     377 212  93  37   4   1
 3     134 209 249 168 113  51  27   7   3   1
 4       9  35  79 130 141 190 132 109  86  37  30  15   4
 5       1   2  16  31  60  94 139 154 135 125  99  65  41  17  13   5   2   1
 6       1   2   8  23  63  74 119 142 141 140 117  62  48  27  18   9   5   1
 7       1   4  30  50  78 130 133 158 131 135  72  35  21  15   4   2       1
 8      24  52 117 188 161 176 123  69  42  27   8   5   1
 9     147 248 193 191 108  44  18   6   4   1   1
10     338 231 108  46   7   2
11     294  85  11   1
12     118  12   1
13      34
14       2
15       3
16
17
18
[0.0, 0.0, 0.0, 1.647080276493533e-50, 4.384365466863698e-50, 8.814699417233117e-35, 1.5946807957175212e-34, 9.489475524470615e-12, 4.087534256661161e-09, 5.995613895415072e-07]
[6.890291968253561e-05, 0.000634862728445439, 0.0054953010528217515, 0.0054953010528217515, 0.013633385613349416, 0.0281260422386174, 0.0281260422386174, 0.05944122196355882, 0.05944122196355882, 0.05976497793356464]    
[0.0, 0.0, 0.0, 6.588321105974132e-53, 2.192182733431849e-52, 5.28881965033987e-37, 1.1162765570022649e-36, 7.591580419576493e-14, 3.678780830995045e-11, 5.995613895415072e-09]
[6.890291968253562e-08, 1.269725456890878e-06, 2.112549143356511e-05, 2.1981204211287005e-05, 6.816692806674708e-05, 0.00018028249553454483, 0.0001968822956703218, 0.0005084917178444854, 0.0005349709976720294, 0.0007535425916394196]
 


-- 04.07.2024, 23:14 --

EUgeneUS
Вы ранее упоминали про "тяжёлые хвосты". Так вот, это хвосты не тяжёлые, а просто их распределение существенно отличается от нормального - поэтому Ваш тест на них и "врёт"...
Для таких перекошенных распределений 5 измерений на "бин" вовсе не достаточно...
И в частности поэтому, полсотни измерений совсем мало.

 Профиль  
                  
 
 Re: Можно ли вычислить " саботажника"
Сообщение04.07.2024, 23:16 
Аватара пользователя


11/12/16
14035
уездный город Н
Geen
Еще просьба.
Можете посчитать, сколько раз из 1000 отвергается нулевая гипотеза по условию $p_value < 0.05$ при тесте с группировкой?

-- 04.07.2024, 23:21 --

Geen в сообщении #1645201 писал(а):
Так вот, это хвосты не тяжёлые, а просто их распределение существенно отличается от нормального - поэтому Ваш тест на них и "врёт"

ОМГ. Нам не важен вид ожидаемого распределения.

Завтра, если будет время, сделаю модель на 1000 кейсов в Excel. Посмотрим, насколько будет различаться с Вашим результатом.

 Профиль  
                  
 
 Re: Можно ли вычислить " саботажника"
Сообщение04.07.2024, 23:22 
Заслуженный участник
Аватара пользователя


01/09/13
4676
EUgeneUS в сообщении #1645203 писал(а):
Можете посчитать, сколько раз из 1000 отвергается нулевая гипотеза по условию $p_value < 0.05$ при тесте с группировкой?

Это случайная величина с большой дисперсией (и распределением, которое я совершенно не знаю как посчитать).... Смысл?

 Профиль  
                  
 
 Re: Можно ли вычислить " саботажника"
Сообщение04.07.2024, 23:30 
Аватара пользователя


11/12/16
14035
уездный город Н
FGJ, минимум 5 ожидаемых отсчетов на бин - это минимальные рекомендации, которые встречал. Но и наиболее частые.
Еще встречал такие:
1. Минимум 5 отсчетов на бин и минимум 100 всего.
2. Минимум 10 остчетов на бин, но для анализа таблиц совместимости $2 \times 2$
3. Минимум 10 отсчетов на бин, но может быть уменьшено до 5 или даже до 3 при количестве степеней свободы в несколько десятков.

-- 04.07.2024, 23:31 --

Geen в сообщении #1645204 писал(а):
Смысл?


Сравнить с ожидаемым значением $50$.

 Профиль  
                  
 
 Re: Можно ли вычислить " саботажника"
Сообщение04.07.2024, 23:35 
Заслуженный участник
Аватара пользователя


01/09/13
4676
EUgeneUS в сообщении #1645205 писал(а):
... рекомендации ...

....
Если распределение в каждом бине близко к нормальному, то такую рекомендацию можно принять. Но в данном случае это не так.

EUgeneUS в сообщении #1645203 писал(а):
Можете посчитать, сколько раз из 1000 отвергается нулевая гипотеза по условию $p_value < 0.05$ при тесте с группировкой

Код
код: [ скачать ] [ спрятать ]
Используется синтаксис Python
        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));
 

Результат (включая только вывод последнего цикла)
код: [ скачать ] [ спрятать ]
Используется синтаксис Text
-----------------------------------
[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 --

EUgeneUS в сообщении #1645205 писал(а):
Сравнить с ожидаемым значением $50$.

Очень странного Вы ожидаете, не находите?

 Профиль  
                  
 
 Re: Можно ли вычислить " саботажника"
Сообщение05.07.2024, 00:02 
Аватара пользователя


11/12/16
14035
уездный город Н
Geen
Код:
                               while cf < 5 and frq:
                                        cf += frq.pop(dir);
                                        cb += cbin.pop(dir);
                                chi2_euus += (cf-cb)**2/cb;


Тут еще ошибка. Цикл должен быть по cb, а не по cf.
Контролируется, чтобы знаменатель не был маленьким.

-- 05.07.2024, 00:57 --

Кстати, хорошо бы проверить, какое разбиение получается.
А то меня гложут смутные сомнения, что в крайнем бине ожидаемое значение отнюдь не 5 получается.

 Профиль  
                  
 
 Re: Можно ли вычислить " саботажника"
Сообщение05.07.2024, 08:44 
Аватара пользователя


11/12/16
14035
уездный город Н
Geen в сообщении #1645206 писал(а):
Очень странного Вы ожидаете, не находите?


Нормального я хочу. P-value так и работает.
1. Строится распределение некой статистики в предположении о верности нулевой гипотезы.
2. Отбрасывается N%-й квантиль.
3. По сути задание критичного уровня P-value - это задание вероятности ошибки первого рода.

Так как обычно эксперимент один, то говорят об уверенности, а не о вероятности. Но у Вас то, как я понял $100 \cdot 1000$ экспериментов.

Видно, что вероятность ошибки первого рода примерно в два раза больше, чем ожидаемое.
Это не есть хорошо. В чем причина, ошибки в коде, или действительно малая выборка - пока не могу сказать.

 Профиль  
                  
 
 Re: Можно ли вычислить " саботажника"
Сообщение05.07.2024, 10:11 
Аватара пользователя


11/12/16
14035
уездный город Н
Geen
EUgeneUS в сообщении #1645203 писал(а):
Завтра, если будет время, сделаю модель на 1000 кейсов в Excel. Посмотрим, насколько будет различаться с Вашим результатом.


Сделал.
Вот результаты типового запуска:
Минимум p-value: $5,69 \cdot 10^{-5}$
Количество, где $\text{p-value} < 0.05$: 46
Количество, где $\text{p-value} < 0.01$: 12

Вот еще:
Минимум p-value: $0.00352$
Количество, где $\text{p-value} < 0.05$: 43
Количество, где $\text{p-value} < 0.01$: 4

И еще
Минимум p-value: $4.66 \cdot 10^{-5}$
Количество, где $\text{p-value} < 0.05$: 53
Количество, где $\text{p-value} < 0.01$: 12

Как видим, отлично работает.
А) никаких $10^{-62}$ нет
Б) количество ошибок первого рода - в полном соответствии с теорией.

Ищите ошибки у себя. На (еще) одну, пока не исправленную, указал выше. Может быть есть ещё.

-- 05.07.2024, 10:39 --

А вот результаты, если не делать группировку

Минимум p-value: $3.14 \cdot 10^{-259}$ :mrgreen:
Количество, где $\text{p-value} < 0.05$: 92
Количество, где $\text{p-value} < 0.01$: 66

Тут, конечно, так себе работает.

 Профиль  
                  
 
 Re: Применимость статистических тестов к задаче про саботажника
Сообщение05.07.2024, 22:04 
Заслуженный участник
Аватара пользователя


01/09/13
4676
EUgeneUS в сообщении #1645207 писал(а):
Тут еще ошибка. Цикл должен быть по cb, а не по cf.

Да как скажете - это только ухудшит "показатели теста".
EUgeneUS в сообщении #1645227 писал(а):
Ищите ошибки у себя.

Это да, у Вас я их поискать при всём желании не смогу - кроме отдельных цифр и заверений про правильность Вашего пути Вы ничего не предложили....

 Профиль  
                  
 
 Re: Применимость статистических тестов к задаче про саботажника
Сообщение05.07.2024, 22:50 
Аватара пользователя


11/12/16
14035
уездный город Н
Geen в сообщении #1645307 писал(а):
Это да, у Вас я их поискать при всём желании не смогу - кроме отдельных цифр и заверений про правильность Вашего пути Вы ничего не предложили....

:facepalm: :mrgreen:

1. Вы тут откровенную ерунду написали, мол, я ничего не предложил. Так я и не собирался предлагать.
Я использовал ровно то, что описано в литературе по теме. Ссылку давал.
2. Я Вам по шагам расписал, как, что и с помощью чего делал.
3. Код Вам не предоставил по одной причине - там нет кода. Даже VB.

Вы решили устроить себе закат Солнца вручную на Питоне, ну так разбирайтесь со своим кодом и багами в нем - почему Солнце не закатывается.
Я Вам уже на две ошибки указал, при том, что совершенно не знаю Питон.

 Профиль  
                  
 
 Re: Применимость статистических тестов к задаче про саботажника
Сообщение05.07.2024, 23:23 
Заслуженный участник
Аватара пользователя


01/09/13
4676
EUgeneUS в сообщении #1645309 писал(а):
Я Вам уже на две ошибки указал

Не две, а одну.
EUgeneUS в сообщении #1645309 писал(а):
Я использовал ровно то, что описано в литературе по теме

Реализацию этого "использования" проверить нет возможности....

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 46 ]  На страницу Пред.  1, 2, 3, 4  След.

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group