这听起来像是在进行模拟。
因此,我对您的过程进行了如下模拟:将人一个一地添加到试验中,并随机分配给组之一。对该患者的治疗结果是随机选择的(即,我正在模拟所有效果为零的治疗的无效假设)。添加每个人后,我对列联表进行卡方检验,并检查。如果是这样,那么(并且只有这样),我还要对减少的列联表进行卡方检验,以将每个组与其他三个合并在一起的组进行测试。如果这四项测试中的一项显着(具有相同的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