To brzmi jak symulacja jest w porządku.
Więc symulowałem twoją procedurę w następujący sposób: osób jest dodawanych do badania jeden po drugim, losowo przypisywanych do jednej z grup. Wynik leczenia tej osoby jest wybierany losowo (tzn. Symuluję zerową hipotezę wszystkich zabiegów o zerowym efekcie). Po dodaniu każdej osoby wykonuję test chi kwadrat na tabeli nieprzewidzianych zdarzeń i sprawdzam, czy . Jeśli tak, to (i tylko wtedy) wykonuję dodatkowo testy chi-kwadrat na zredukowanych tabelach kontyngencji aby przetestować każdą grupę względem pozostałych trzech grup zebranych razem. Jeśli jeden z tych czterech kolejnych testów okaże się znaczący (z tym samymN=100044×2p≤α2×2α), a następnie sprawdzam, czy to leczenie działa lepiej czy gorzej niż pozostałe trzy połączone razem. Jeśli gorzej, wyrzucam to leczenie i kontynuuję dodawanie ludzi. Jeśli lepiej, zatrzymam proces. Jeśli wszystkie osób zostanie dodanych bez zwycięskiego leczenia, próba zostanie zakończona (zauważ, że wyniki mojej analizy będą silnie zależeć od ).NN
Teraz możemy uruchomić to wiele razy i dowiedzieć się, w jakim ułamku serii jeden z zabiegów wychodzi jako zwycięzca - byłyby to wyniki fałszywie pozytywne. Jeśli uruchomię go 1000 razy dla nominalnego , otrzymam 282 fałszywie dodatnie, tj . Współczynnik błędu typu II.α=0.050.28
Możemy powtórzyć całą analizę dla kilku nominalnych i zobaczyć, jaki rzeczywisty poziom błędu otrzymujemy: Więc jeśli chcesz utrzymać rzeczywisty poziom błędu, powiedzmy na poziomie , powinieneś wybrać nominalny około - ale oczywiście lepiej jest uruchomić dłuższa symulacja w celu dokładniejszego oszacowania.α
α0.050.010.001error rate∼0.28∼0.06∼0.008
0.05α0.008
Mój szybki i brudny kod w Matlabie znajduje się poniżej. Należy pamiętać, że ten kod jest mózgowy i w ogóle nie zoptymalizowany; wszystko działa w pętli i jest strasznie wolne. Prawdopodobnie można to znacznie przyspieszyć.
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