这听起来像一个模拟是为了。
所以我模拟了你的程序如下:人被一个接一个地添加到试验中,随机分配到组中的一个。这个人的治疗结果是随机选择的(即我正在模拟所有具有零效应的治疗的零假设)。列联表执行卡方检验并检查是否。如果是,那么(并且仅在那时)我另外对减少的列联表执行卡方检验,以测试每个组与其他三个合并在一起的组。如果这四个测试中的一个结果显着(具有相同的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