単変量ロジスティック回帰のサンプルサイズ計算


11

対象のコホートに手術時に測定された単一の連続変数があり、その後2年後に機能的転帰または障害転帰として分類される研究に必要なサンプルサイズをどのように計算しますか。

その測定が悪い結果を予測できたかどうかを確認したいと思います。ある時点で、連続変数のカットポイントを導出したい場合があります。これを超えると、結果が損なわれる可能性を減らすために介入しようとします。

何か案は?Rの実装。


フォローアップ中にいくつかの脱落を期待していますか?モデルに含める他の共変量はありますか?
CHL

私の親指から中退率を吸い上げましょう-20%。確かに、たとえば年齢、トラウマスコアなど、多くの変数を収集しますが、パワーの計算ではできるだけ単純にしたかったのです。一次モデルについて話し合い、次に、より洗練されたニュアンスを備えた二次モデルについて話し合うと便利だと思うことがよくあります。
ファレル

わかりましたが、通常、予想される%ドロップアウト、共変量の数、および共変量がエラーで測定されているかどうか(たとえば、j.mp / 9fJkhbを参照)が数式を入力します(すべての場合で、サンプルサイズが増加します)。
chl

回答:


7

ロジスティック回帰のサンプルサイズの計算は複雑です。ここではまとめません。この問題に対する合理的にアクセス可能なソリューションは、次の場所にあります。

Hsieh FY。ロジスティック回帰のサンプルサイズテーブル。医学の統計。1989 7月; 8(7):795-802。

Hsieh FY、他 線形およびロジスティック回帰のサンプルサイズ計算の簡単な方法。医学の統計。1998年7月30日; 17(14):1623-34。

Hosmer&LemeshowのApplied Logistic Regressionの最後の章(セクション8.5 pp 339-347)で、計算例を使用した問題に関するアクセス可能な議論を見つけることができます。


7

通常、シミュレーションを実行する方が簡単で高速です。論文は、読み、理解し、最終的に興味のある特殊なケースには適用されないという結論に至るまでに長い時間がかかります。

したがって、私はいくつかの主題を選択し、関心のある共変量をシミュレートし(予想どおりに分布)、仮定した関数形に基づいて良い/悪い結果をシミュレートします(共変量のしきい値効果?非線形性?)検出したい最小の(臨床的に)有意な効果サイズを使用して、分析を通じて結果を実行し、効果がアルファで見つかるかどうかを確認します。これを10,000回再実行し、80%のシミュレーション(または他の必要なパワー)で効果を見つけたかどうかを確認します。被験者の数を調整し、満足する力が得られるまで繰り返します。

これには非常に一般的であるという利点があるため、特定の関数形式や特定の数または共変量の分布に制限されません。ドロップアウトを含めることができます。ランダムに、または共変量や結果に影響されて、上のchlのコメントを参照してください。基本的には、最終サンプルで行う分析を事前にコーディングします。これは、研究デザインに私の考えを集中させるのに役立つ場合があります。そして、それは簡単にRで行われます(ベクトル化!)。


Rでうまくいった事例はありますか?
Farrel、2009

1
@Farrel-これは非常に短いスクリプトです。これは、[0,1]で均一に分散された共変量、共変量の1番目と3番目の四分位数と標準の標準ノイズの間のORが2で、n = 100のパワーが.34になると想定しています。私はこれで遊んで、すべてが私の仮定にどれほど敏感であるかを確認します。nn <-100; set.seed(2010); 検出<-replicate(n = runs、expr = {covariate <-runif(nn);結果<-runif(nn)<1 /(1 + exp(-2 * log(2)* covariate + rnorm(nn))) ); summary(glm(outcome〜covariate、family = "binomial"))$ coefficients ["covariate"、 "Pr(> | z |)"] <.05})cat( "Power:"、sum(detections) / runs、 "\ n")
ステファンコラサ

1
あなたはpastie(としてあなたのコードを添付することができpastebin.com)または要旨(gist.github.comあなたのコメントでそれに)あなたはそれがより便利だと感じた場合、およびリンクバック。

@chl:+1、どうもありがとう!ここに要点があります:gist.github.com/607968
ステファンコラサ

すばらしいコードですが、問題があります。私は君ほど賢くない。段階的に分解する必要があります。シミュレーションの数だけ実行されると思いますか?nnとは何ですか?研究の対象者数ですか?次に、共変量の分布を作成し、しきい値に応じてはいまたはいいえを決定させるようにしました。
Farrel、

4

Stephan Kolassaの投稿(コメントとして追加することはできません)に続き、シミュレーション用の代替コードをいくつか用意しました。これは同じ基本構造を使用していますが、少し分解されているため、おそらく少し読みやすくなっています。また、KleinmanとHortonによるロジスティック回帰をシミュレートするコードに基づいています。

nnはサンプルの数値です。共変量は継続的に正規分布し、0とsd 1を意味するように標準化する必要があります。これを生成するためにrnorm(nn)を使用します。オッズ比を選択し、それをodds.ratioに保存します。切片の数も選択します。この数の選択は、サンプルのどの部分が「イベント」を経験するかを決定します(例:0.1、0.4、0.5)。適切な比率になるまで、この数値をいじる必要があります。次のコードでは、サンプルサイズが950、ORが1.5で比率が0.1になります。

nn <- 950
runs <- 10000
intercept <- log(9)
odds.ratio <- 1.5
beta <- log(odds.ratio)
proportion  <-  replicate(
              n = runs,
              expr = {
                  xtest <- rnorm(nn)
                  linpred <- intercept + (xtest * beta)
                  prob <- exp(linpred)/(1 + exp(linpred))
                  runis <- runif(length(xtest),0,1)
                  ytest <- ifelse(runis < prob,1,0)
                  prop <- length(which(ytest <= 0.5))/length(ytest)
                  }
            )
summary(proportion)

summary(割合)は割合が0.1であることを確認します

次に、同じ変数を使用して、10000回の実行でパワーが計算されます。

result <-  replicate(
              n = runs,
              expr = {
                  xtest <- rnorm(nn)
                  linpred <- intercept + (xtest * beta)
                  prob <- exp(linpred)/(1 + exp(linpred))
                  runis <- runif(length(xtest),0,1)
                  ytest <- ifelse(runis < prob,1,0)
                  summary(model <- glm(ytest ~ xtest,  family = "binomial"))$coefficients[2,4] < .05
                  }
            )
print(sum(result)/runs)

このコードは正しいと思います-1998年にHsiehで提供された例(表2)と照合しましたが、そこに示されている3つの例と一致しているようです。私はまた、HosmerとLemeshowのp 342-343の例に対して、0.75の検出力(HosmerとLemeshowでの0.8と比較)に対してテストしました。したがって、状況によっては、このアプローチは力を過小評価している可能性があります。ただし、このオンライン計算機で同じ例を実行したところ、HosmerとLemeshowの結果ではなく、私と同じであることがわかりました。

これが事実である理由を誰かが教えてくれるなら、私は知りたいです。


よろしければ2つの質問があります。1)プロポーション関数は切片を正確にするためだけのものですか?2)ytestを使用する背後にあるロジックは何ですか(確率をランダムユニドローと比較)。
B_Miner

@B_Miner 1)逆の方法-正しい比率を得るには、切片を正しく設定する必要があります-期待通りの比率になるまで切片を調整します。2)ytestの論理は、二分法の0または1の結果を得る必要があるということです。そのため、均一な分布の各サンプルを確率(確率)と比較して、2値の結果を取得します。「runis」は、ランダムな一様分布から抽出する必要はありません。二項分布または他の分布がデータにとってより意味のある場合があります。これがお役に立てば幸いです(返信が遅れて申し訳ありません)。
Andrew

3

θ=10:θ=0

実際、あなたの研究は逐次的に行われるように思えます。その場合、それを実験の明示的な部分にすることはお金になるかもしれません。多くの場合、順次サンプリングは、固定サンプルサイズの実験よりも効率的です[平均で必要な観測が少ない]。

farrel:コメントに返信してこれを追加します。

サンプルサイズを取得するには、通常、ある種の精度基準(CIの長さなど)またはデータに対して実行されるテストの指定された代替手段での検出力を指定します。あなたはこれらの基準の両方に言及したようです。原則として、何も問題はありません。2つのサンプルサイズ計算を実行するだけです。1つは目的の推定精度を達成するためであり、もう1つは上記の代替方法で目的の検出力を得るためです。次に、2つのサンプルサイズのうち大きい方が必要です。[ところで、80%の出力と言う以外に、実行する予定のテスト、または80%の出力が必要な代替案について言及していないようです。]

逐次分析を使用する場合:被験者が同時に研究に登録されている場合、サンプルサイズを固定することは理にかなっています。ただし、対象者が少ない場合は、必要な人数が登録されるまでに1〜2年かかる場合があります。したがって、裁判は3年または4年(またはそれ以上)続く可能性があります。その場合、順次スキームはそれよりも早く停止する可能性を提供します-探している効果が試験の早い段階で統計的に有意になる場合。


基準は、良い結果と悪い結果の確率が10%異なることになります。または、それがロジスティック回帰であるため、オッズ比= 2です。alpha= 0.05、power = 80%、連続変数のプールされた分散はまだわかりませんが、標準偏差が7mmHgであると仮定します。逐次分析は適切ですが、最終結果は測定が行われてから2年です。
ファレル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.