これは、シミュレーションが正常に行われているように聞こえます。
N= 100044 × 2P ≤ α2 × 2一緒にプールされた他の3つのグループに対して各グループをテストするための分割表。これらのさらに4つのテストのいずれかが重要な場合(同じα)、次に、この治療が一緒にプールされた他の3つよりも良いか悪いかを確認します。さらに悪い場合、私はこの治療を追い出し、人々を追加し続けます。よければ、試用を停止します。私は落ちるN 人々は勝つ治療なしで追加され、試験は終了します(私の分析の結果は、 N)。
これで何回も実行でき、実行の何分の一で治療の1つが勝者として出てきます。これらは誤検知です。名目上1000回実行した場合α = 0.05、私は282の誤検知を取得します、すなわち 0.28 タイプIIエラー率。
この分析全体を複数の名義に対して繰り返すことができます α 実際のエラー率を確認します。
α0.050.010.001エラー率〜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