適応シーケンシャル分析のp値の調整(カイ2乗検定の場合)?


12

私は、どの統計文献が次の問題に関連しているか、そしておそらくそれをどのように解決するかのアイデアを知りたいと思っています。

次の問題を想像してください。

一部の疾患には4つの治療法があります。どちらの治療がより良いかを確認するために、特別な試験を実施します。トライアルでは、被験者がいないことから始め、その後、1つずつ、より多くの被験者がトライアルに入力されます。各患者は、4つの可能な治療法のいずれかにランダムに割り当てられます。治療の最終結果は「健康」または「病気」であり、この結果をすぐに知ることができるとしましょう。つまり、任意の時点で、2 x 4の分割表を作成して、被験者の数がどの治療/最終結果に該当したかを示すことができます。

4つの可能な治療法の間に統計的に異なる治療法があるかどうかを確認するために、いつでも分割表を確認できます(たとえば、カイ2乗検定を使用)。それらのいずれかが他のすべてよりも優れている場合-トライアルを停止し、「勝者」として選択します。いくつかの試験が他の3つすべてよりも悪いことが示された場合、私たちは彼を試験から除外し、将来の患者への投与を停止します。

ただし、ここでの問題は、特定のポイントでテストを実行できること、テスト間に相関関係があること、プロセスの適応性がプロセスを操作することのためにp値どのように調整するかですたとえば、何らかの治療が「悪い」と判明した場合)?


2
Waldは彼の連続確率比検定(SPRT)を考え出し、停止規則(nullに対する証拠を得る必要がある被験者の数)を作成しました。ここで私の説明を参照してください:stats.stackexchange.com/a/16120/401ただし、これは単一の仮説のみをテストします。ただし、カイ2乗検定を提案する場合、それは1つの仮説にすぎません(すべての処理が同等に有効です)。複数のテスト用に私の投稿の「プライマリ」p値を調整し、いくつかのテストを実行できるようです。一連の治療の変化をどのように取り入れるかについてもっと考えなければならないでしょう。
チャーリー

1
複数のパラメータを扱う「グループシーケンシャル分析」と呼ばれるバリエーションがあることに注意したいだけです。「臨床統計:臨床試験の紹介、生存分析、および縦断的データ分析」は、さまざまな情報源に従って役立つことがありますが、個人的に読んでください。
ステフェン

1
この質問の面白さを強調することはできません。それはまた、AB-テスト(同じタスクが、エラーコストは途方もなく低い)に関する多くの疑問にお答えします解決
ステファン

1
JennisonとTurnbullによる「Group Sequential Methods with Applications to Clinical Trials」という本は、このような多くの逐次試験デザインをカバーしています。4処理設計がカバーされているかどうかは覚えていません(ただし、これは3つのダミー変数を備えたロジスティック回帰モデルにすぎません)。これは素晴らしい本であり、このような問題に興味がある場合は読む価値があります。(そして、@ steffen、A / B検定(すなわち、単純な二項問題)本でカバーされています。)
カールオベハフハンマー

回答:


2

逐次臨床試験のこの分野は、文献で実質的に調査されています。著名な研究者の中には、スコット・エマーソン、トム・フレミング、デビッド・デメッツ、スティーブン・セン、スチュアート・ポコックなどがいます。

「alpha-spending-rule」を指定することは可能です。この用語の起源は、頻繁な(非フィシェリアン)テストの性質にあり、偽陽性の結果のリスクを高める各アクションは、テストを正しいサイズに維持するために必然的に力を減らす必要があります。ただし、このようなテストの大部分では、調査の情報範囲に基づいて「停止ルール」を事前に指定する必要があります。(注意点として、nullがfalseの場合、情報が多いほどパワーが大きくなります)。

p

見る

[1] www.rctdesign.org/


+1。シミュレーションを使用して、推奨手順のタイプIIエラー率を計算する別の回答を投稿しました。これにより、テストのサイズが正しいように、名目上のアルファを選択できます。どう思う?
アメーバは、モニカを復活させる

1

これは、シミュレーションが正常に行われているように聞こえます。

N=100044×2pα2×2一緒にプールされた他の3つのグループに対して各グループをテストするための分割表。これらのさらに4つのテストのいずれかが重要な場合(同じα)、次に、この治療が一緒にプールされた他の3つよりも良いか悪いかを確認します。さらに悪い場合、私はこの治療を追い出し、人々を追加し続けます。よければ、試用を停止します。私は落ちるN 人々は勝つ治療なしで追加され、試験は終了します(私の分析の結果は、 N)。

これで何回も実行でき、実行の何分の一で治療の1つが勝者として出てきます。これらは誤検知です。名目上1000回実行した場合α=0.05、私は282の誤検知を取得します、すなわち 0.28 タイプIIエラー率。

この分析全体を複数の名義に対して繰り返すことができます α 実際のエラー率を確認します。

αエラー率0.050.280.010.060.0010.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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.