ดูเหมือนว่าการจำลองจะเป็นไปตามลำดับ
ดังนั้นฉันจึงจำลองขั้นตอนของคุณดังนี้:คนถูกเพิ่มเข้าไปในการทดลองแบบหนึ่งต่อหนึ่งโดยสุ่มให้กับหนึ่งในกลุ่ม ผลลัพธ์ของการรักษาสำหรับบุคคลนี้ถูกสุ่มเลือก (เช่นฉันกำลังจำลองสมมุติฐานว่างของการรักษาทั้งหมดที่ไม่มีผลกระทบ) หลังจากเพิ่มแต่ละคนผมดำเนินการทดสอบไคสแควร์ในตารางฉุกเฉินและตรวจสอบว่า\ ถ้าเป็นเช่นนั้น (และจากนั้นเท่านั้น) ฉันทำการทดสอบไคสแควร์เพิ่มเติมในตารางฉุกเฉินที่ลดลงเพื่อทดสอบแต่ละกลุ่มกับอีกสามกลุ่มที่รวมกัน หากหนึ่งในสี่การทดสอบต่อไปนี้ออกมาอย่างมีนัยสำคัญ (ด้วยเดียวกันN=100044×2p≤α2×2α) จากนั้นฉันจะตรวจสอบว่าการรักษานี้ทำงานได้ดีขึ้นหรือแย่ลงกว่าอีกสามการรวมกัน ถ้าแย่กว่านั้นฉันก็เตะทรีทเม้นต์นี้และเพิ่มคนต่อไป ถ้าดีกว่าฉันหยุดการทดลอง หากมีการเพิ่มคนคนทั้งหมดโดยไม่ได้รับการรักษาใด ๆ การทดลองก็จบลง (โปรดทราบว่าผลการวิเคราะห์ของฉันจะขึ้นอยู่กับ ) อย่างยิ่งNN
ตอนนี้เราสามารถเรียกใช้หลาย ๆ ครั้งและค้นหาว่าส่วนใดของการบำบัดส่วนหนึ่งที่ออกมาในฐานะผู้ชนะ - สิ่งเหล่านี้จะเป็นผลบวกที่ผิดพลาด หากฉันเรียกใช้ 1,000 ครั้งสำหรับค่าเล็กน้อยฉันจะได้รับผลบวกปลอม 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