Це звучить як моделювання в порядку.
Тому я моделював вашу процедуру так: людей додаються до випробування по одному, випадковим чином віднесені до однієї з груп. Результат лікування для цієї людини вибирається випадковим чином (тобто я моделюю нульову гіпотезу всіх методів лікування, що мають нульовий ефект). Додавши кожну особу, я виконую тест на квадрат чі в таблиці випадок та перевіряю, чи . Якщо це так, то (і лише тоді) я додатково виконую тести на квадратних чі на зменшених таблицях на випадок на випадок, щоб перевірити кожну групу проти інших трьох груп, об'єднаних разом. Якщо один із цих наступних чотирьох тестів виявиться значущим (з тим самимN=100044×2p≤α2×2α), то я перевіряю, чи це лікування краще чи гірше, ніж інші три об'єднані разом. Якщо ще гірше, я починаю це лікування і продовжую додавати людей. Якщо краще, я припиняю судовий процес. Якщо всіх людей додають без виграшного лікування, випробування закінчено (зауважте, що результати мого аналізу будуть сильно залежати від ).NN
Тепер ми можемо це зробити багато разів і дізнатися, у якій частині пробіжок один з процедур виходить переможцем - це були б помилкові позитиви. Якщо я запускаю його 1000 разів для номінального , я отримую 282 помилкових позитивних результатів, тобто коефіцієнт помилок типу типу II.α=0.050.28
Ми можемо повторити весь цей аналіз для кількох номінальних і побачити, який фактичний показник помилок ми отримуємо: Отже, якщо ви хочете, щоб фактичний показник помилок відбувся, скажімо, на рівні , слід вибрати номінал приблизно - але, звичайно, краще запустити довше моделювання, щоб точніше оцінити це.α
α0.050.010.001error rate∼0.28∼0.06∼0.008
0.05α0.008
Мій швидкий і брудний код у Matlab знаходиться нижче. Зверніть увагу, що цей код загинув мозку і зовсім не оптимізований; все працює в петлях і жахливо повільно. Напевно, це може бути значно прискорене.
function seqAnalysis()
alphas = [0.001 0.01 0.05];
for a = 1:length(alphas)
falsePositives(a) = trials_run(1000, 1000, alphas(a));
end
display(num2str([alphas; falsePositives]))
end
function outcome = trials_run(Nrep, N, alpha)
outcomes = zeros(1,Nrep);
for rep = 1:Nrep
if mod(rep,10) == 0
fprintf('.')
end
outcomes(rep) = trial(N, alpha);
end
fprintf('\n')
outcome = sum(outcomes);
end
function result = trial(N, alpha)
outcomes = zeros(2,4);
result = 0;
winner = [];
%// adding subjects one by one
for subject = 1:N
group = randi(size(outcomes,2));
outcome = randi(2);
outcomes(outcome, group) = outcomes(outcome, group) + 1;
%// if groups are significantly different
if chisqtest(outcomes) < alpha
%// compare each treatment against the rest
for group = 1:size(outcomes,2)
contrast = [outcomes(:, group) ...
sum(outcomes(:, setdiff(1:size(outcomes,2), group)),2)];
%// if significantly different
if chisqtest(contrast) < alpha
%// check if better or worse
if contrast(1,1)/contrast(2,1) < contrast(1,2)/contrast(2,2)
%// kick out this group
outcomes = outcomes(:, setdiff(1:size(outcomes,2), group));
else
%// winner!
winner = group;
end
break
end
end
end
if ~isempty(winner)
result = 1;
break
end
end
end
function p = chisqtest(x)
e = sum(x,2)*sum(x)/sum(x(:));
X2 = (x-e).^2./e;
X2 = sum(X2(:));
df = prod(size(x)-[1 1]);
p = 1-chi2cdf(X2,df);
end