ロジスティック回帰検出力解析のシミュレーション-設計実験


39

この質問は、ロジスティック回帰とSASを使用した電力分析に関して私が尋ねた質問に関する@Greg Snowの回答に対応していますProc GLMPOWER

実験を計画しており、要因ロジスティック回帰で結果を分析する場合、シミュレーション(およびここ)を使用して電力分析を実行するにはどうすればよいですか?

以下に2つの変数がある簡単な例を示します。最初の変数は3つの可能な値{0.03、0.06、0.09}を取り、2番目はダミーのインジケーター{0,1}です。それぞれについて、各組み合わせの応答率を推定します(レスポンダーの数/マーケティングされる人々の数)。さらに、因子の最初の組み合わせは他の因子の3倍(同等と見なすことができます)にしたいと考えています。これは、この最初の組み合わせが試行された真のバージョンだからです。これは、リンクされた質問で言及されたSASコースで与えられたようなセットアップです。

ここに画像の説明を入力してください

結果の分析に使用されるモデルは、主な効果と相互作用を伴うロジスティック回帰です(応答は0または1です)。

mod <- glm(response ~ Var1 + Var2 + I(Var1*Var2))

このモデルで使用するデータセットをシミュレートして電力解析を実行するにはどうすればよいですか?

私はSASを介してこれを実行するとProc GLMPOWER(使用STDDEV =0.05486016 に対応するsqrt(p(1-p))pが示す応答率の加重平均です)。

data exemplar;
  input Var1 $ Var2 $ response weight;
  datalines;
    3 0 0.0025  3
    3 1 0.00395 1
    6 0 0.003   1
    6 1 0.0042  1
    9 0 0.0035  1
    9 1 0.002   1;
run;

proc glmpower data=exemplar;
  weight weight;
  class Var1 Var2;
  model response = Var1 | Var2;
  power
    power=0.8
    ntotal=.
    stddev=0.05486016;
run;

注:GLMPOWERクラス(名義)変数のみを使用するため、上記の3、6、9は文字として扱われ、低、中、高、または他の3つの文字列である可能性があります。実際の分析が行われるとき、Var1は数値を使用し(多項式項Var1 * Var1を含めます)、曲率を考慮します。

SASからの出力は

ここに画像の説明を入力してください

したがって、0.80に等しいパワーと0.05に等しいアルファを使用して、サンプルサイズとして762,112が必要であることがわかります(Var2の主効果を推定するのが最も難しい)。これらをベースラインの組み合わせの3倍(つまり0.375 * 762112)に割り当て、残りは他の5つの組み合わせに等しく等しくなるように割り当てます。


これはRで簡単に行えます。最初の質問:すべてのケースの75%が{var1 = .03、var2 = 0}であり、他のすべてのコンボで25%であり、各1他の各コンボの単位(つまり、37.5%)?2番目の質問、検出したい効果を指定できますか?すなわち、1対0の対数オッズはどうなりますか?var1が.01上昇すると、成功のログオッズはどのように変化しますか?相互作用があるかもしれないと思いますか(もしそうなら、それはどれくらい大きいでしょうか)?(注意、これらのQは答えるのが難しい場合があります。1つの戦略は、各コンボにあると思われる1の割合を指定することです。)
グング-モニカを復活

1番目:ベースラインの場合の重み3は、{var1 = 0.03、var2 = 0}の場合の3倍のケースがあることです。したがって、SASの結果(総サンプルサイズ762,112が主効果var2 = 0を拒否する80%の力を持っている必要があると言うので、必要なサンプルサイズの合計)は、このベースラインケースに37.5%が割り当てられます。
B_Miner

2番目:回答率(これは、試行回数に対する成功数の予想比率)だけです。したがって、Var1 = 0.03およびVar2 = 0で1,000文字を送信すると、0.03(3%)のクレジットカードダイレクトメールオファーの金利オファーに対応し、封筒にステッカーはありません(Var2 = 1はステッカー)、1000 * 0.0025の応答を期待しています。
B_Miner

2番目の続き:相互作用が期待されます-したがって、応答率です。Var1の値に応じて、Var2 = 0の応答率が異なることに注意してください。これらをオッズの対数に変換してから、シミュレートされたデータセットに変換する方法がわかりません。
B_Miner

最後にもう1つ。var2 = 0(つまり、.25%、. 30%、. 35%)の場合、var1の応答率は線形であることに気付きます。これを線形効果または曲線にするつもりでしたか?確率は、その範囲の小さなサブセットに対してかなり線形に見える可能性がありますが、実際には線形にはなり得ないことを知っておく必要があります。ロジスティック回帰は、確率ではなく対数オッズで線形です(このようなことについては、ここでの回答で説明します)。
GUNG -復活モニカ

回答:


43

事前準備:

  • G * Powerマニュアルで説明されているように、解決する対象に応じて、いくつかの異なるタイプの電力分析があります。(つまり、、エフェクトサイズ、、およびpowerは相互に関連して存在します。これらの3つを指定すると、4番目の問題を解くことができます。) E S αNESα

    • 説明では、およびpower = 80%で指定した応答率をキャプチャする適切なを知りたいと考えています。これはアプリオリの力です。 α = 0.05Nα=.05
    • これは概念的に単純なので、事後の電力(、応答率、およびアルファが与えられた電力を決定)から始めてから、上に移動できます。N
  • @GregSnowの優れた投稿に加えて、CVでのシミュレーションベースの消費電力解析に関する非常に優れたガイドがここにあります:統計的検出力の計算。基本的なアイデアを要約するには:

    1. 検出できるようにしたい効果を把握する
    2. その可能性のある世界からN個のデータを生成する
    3. これらの偽データに対して実施する予定の分析を実行する
    4. 選択したアルファに従って、結果が「有意」であるかどうかを保存します
    5. 何回も()繰り返し、そので(事後)パワーの推定値として% 'significant'を使用しますNBN
    6. 事前の検出力を決定するには、可能な検索して、必要な検出力をもたらす値を見つけます。 N
  • 特定の反復で有意性を見つけるかどうかは、確率(はベキ乗)のベルヌーイ試行の結果として理解できます。回の反復で見つかった割合により、真のを近似できます。より良い近似を得るために、を増やすことができますが、これによりシミュレーションに時間がかかります。 p B p BppBpB

  • Rでは、「成功」の確率でバイナリデータを生成する主な方法は?rbinomです。

    • たとえば、確率pで10回のベルヌーイ試行から成功数を取得するには、コードはになりますrbinom(n=10, size=1, prob=p)(おそらく、結果を変数に割り当てて保存する必要があります)。
    • また、?runifを使用して、このようなデータをよりエレガントに生成することもできますたとえば、ifelse(runif(1)<=p, 1, 0)
    • 結果が潜在的なガウス変数によって媒介されていると思われる場合、?rnormを使用して共変量の関数として潜在変数を生成し、それらをコードpnorm()で確率に変換して使用できrbinom()ます。
  • 「曲率を考慮して、多項式項Var1 * Var1)を含める」と述べています。ここには混乱があります。多項式の項は曲率の説明に役立ちますが、これは相互作用の項です。この方法では役に立ちません。それにもかかわらず、あなたの応答率では、モデルに二乗項と交互作用項の両方を含める必要があります。具体的には、基本的な用語を超えて、モデルに、、およびを含める必要があります。 、V 、R 1 * 、V 、A 、R 2 、V 、R 1 2 * V R 2var12var1var2var12var2

  • 別の質問のコンテキストで書かれていますが、ここでの私の答え:ロジットモデルとプロビットモデルの違いには、これらのタイプのモデルに関する多くの基本情報があります。
  • さまざまな種類があるようにタイプIエラー率は、複数の仮説(例えば、そこにいるときごとのコントラスト誤り率ファミリーワイズエラー率、およびごとの家族エラー率が)、そのパワーの異なる種類のために、例えば(*があるA単一の事前に指定された効果任意の効果、およびすべての効果)。また、効果の特定の組み合わせを検出するパワー、またはモデル全体の同時テストのパワーを求めることもできます。SASコードの説明からの私の推測は、後者を探しているということです。ただし、状況の説明から、相互作用の影響を最小限に検出したいと考えています。

  • パワーに関連する問題について考える別の方法については、ここでの私の回答を参照してください:サンプルサイズを正当化するコンテキスト内で相関を推定する際の一般的な精度を報告する方法。

Rのロジスティック回帰の単純な事後の力:

想定される回答率が世界の真の状況を表し、10,000通の手紙を送ったとしましょう。それらの影響を検出する力は何ですか?(私は「コミカルに非効率的な」コードを書くことで有名ですが、以下は効率のために最適化されるのではなく、簡単に理解できるように意図されていることに注意してください。実際、非常に遅いです。)

set.seed(1)

repetitions = 1000
N = 10000
n = N/8
var1  = c(   .03,    .03,    .03,    .03,    .06,    .06,    .09,   .09)
var2  = c(     0,      0,      0,      1,      0,      1,      0,     1)
rates = c(0.0025, 0.0025, 0.0025, 0.00395, 0.003, 0.0042, 0.0035, 0.002)

var1    = rep(var1, times=n)
var2    = rep(var2, times=n)
var12   = var1**2
var1x2  = var1 *var2
var12x2 = var12*var2

significant = matrix(nrow=repetitions, ncol=7)

startT = proc.time()[3]
for(i in 1:repetitions){
  responses          = rbinom(n=N, size=1, prob=rates)
  model              = glm(responses~var1+var2+var12+var1x2+var12x2, 
                           family=binomial(link="logit"))
  significant[i,1:5] = (summary(model)$coefficients[2:6,4]<.05)
  significant[i,6]   = sum(significant[i,1:5])
  modelDev           = model$null.deviance-model$deviance
  significant[i,7]   = (1-pchisq(modelDev, 5))<.05
}
endT = proc.time()[3]
endT-startT

sum(significant[,1])/repetitions      # pre-specified effect power for var1
[1] 0.042
sum(significant[,2])/repetitions      # pre-specified effect power for var2
[1] 0.017
sum(significant[,3])/repetitions      # pre-specified effect power for var12
[1] 0.035
sum(significant[,4])/repetitions      # pre-specified effect power for var1X2
[1] 0.019
sum(significant[,5])/repetitions      # pre-specified effect power for var12X2
[1] 0.022
sum(significant[,7])/repetitions      # power for likelihood ratio test of model
[1] 0.168
sum(significant[,6]==5)/repetitions   # all effects power
[1] 0.001
sum(significant[,6]>0)/repetitions    # any effect power
[1] 0.065
sum(significant[,4]&significant[,5])/repetitions   # power for interaction terms
[1] 0.017

したがって、10,000文字では、これらの応答率を検出するための(あらゆる種類の)80%の力は実際には得られないことがわかります。(SASコードがこれらのアプローチ間の厳しい矛盾を説明できるかどうかについては十分に確信が持てませんが、このコードは概念的に簡単です-遅い場合-そして私はそれをチェックするのに少し時間を費やし、これらを考える結果は合理的です。)

ロジスティック回帰のシミュレーションベースのアプリオリパワー:

ここから、考えているパワーのタイプの望ましいレベルをもたらす値を見つけるまで、考えられる単純に検索するという考え方です。理論)。このような小さな効果をキャプチャするために必要な考えると、これをより効率的に行う方法について考える価値があります。私の典型的なアプローチは、単純に総当たりです。つまり、合理的に考慮できる各を評価することです。(ただし、私は通常、狭い範囲のみを考慮し、通常これと比較して非常に小さな作業していることに注意してください。) N N NNNNN

代わりに、ここでの私の戦略は、可能性のあるをまとめて、力の範囲がどのようなものかを把握することでした。したがって、私は500,000のを選択し、コードを再実行しました(同じシードを開始しますが、実行に1時間半かかりました)。結果は次のとおりです。 NNN

sum(significant[,1])/repetitions      # pre-specified effect power for var1
[1] 0.115
sum(significant[,2])/repetitions      # pre-specified effect power for var2
[1] 0.091
sum(significant[,3])/repetitions      # pre-specified effect power for var12
[1] 0.059
sum(significant[,4])/repetitions      # pre-specified effect power for var1X2
[1] 0.606
sum(significant[,5])/repetitions      # pre-specified effect power for var12X2
[1] 0.913
sum(significant[,7])/repetitions      # power for likelihood ratio test of model
[1] 1
sum(significant[,6]==5)/repetitions   # all effects power
[1] 0.005
sum(significant[,6]>0)/repetitions    # any effect power
[1] 0.96
sum(significant[,4]&significant[,5])/repetitions   # power for interaction terms
[1] 0.606

このことから、効果の大きさはかなり異なるため、それらを検出する能力は異なることがわかります。たとえば、効果は特に検出が難しく、50万文字の場合でも時間の6%しか意味がありません。一方、モデル全体は常にヌルモデルよりも大幅に優れていました。他の可能性はその間に配置されます。ほとんどの「データ」は各反復で破棄されますが、十分な調査がまだ可能です。たとえば、マトリックスを使用して、重要な異なる変数の確率間の相関を評価できます。 var12significant

結論として、あなたの状況に伴う複雑さと大きなために、これは私の最初のコメントで疑った/主張したほど単純ではなかったことに注意してください。ただし、ここで述べたことから、これを一般的にどのように行うことができるか、および電力解析に関連する問題については、確かにアイデアを得ることができます。HTH。 N


Gung-このような詳細で思慮深い答えをありがとうございます!独自のコードを作成してコードを操作する場合、二次項が問題のように見えます。モデルで考慮することなく、はるかに小さなサンプルサイズで少なくとも80%の電力が得られるためです。
B_Miner

1
それは素晴らしい、@ B_Miner、あなたがしたいことの一種です。さらに、シミュレーションベースのアプローチが、数を吐き出すだけの分析ソフトウェアより優れていると思う理由です(Rはこれもpwrパッケージに持っています)。このアプローチにより、何が起こるか、どうやって対処するかなどについて、より明確に考える(および/または思考を洗練する)機会が与えられます。同様に、想定レートが正しい場合、b / cは線形ではなく、相互作用だけでは曲線関係をキャプチャできません。
GUNG -復活モニカ

polyRの新規ユーザーに生の値を二乗するよりエラーが発生しやすい戦略を示すのではなく、使用のデモを行うべきだと思います。完全なモデルはとして提起されるべきだったと思いますglm(responses~ poly(var1, 2) * var2, family=binomial(link="logit")。解釈の統計エラーが少なくなり、はるかにコンパクトになります。全体的な適合性のみを見ている場合、この正確な例では重要ではないかもしれませんが、個々の用語を見てみたいと思われるあまり洗練されていないユーザーを簡単に誤解させる可能性があります。
-DWin

@DWin、ここでCVでRを使用して説明するとき、非常に非Rの方法でそれを行います。Rに馴染みのない人には、可能な限り透明にすることが考えられます。たとえば、ベクトル化された可能性を使用していない、ループを使用している=、などです。クラスであり、poly()Rユーザーでない場合は何であるかをあまり知らない。
GUNG -復活モニカ

17

@Gungの答えは理解に最適です。私が使用するアプローチは次のとおりです。

mydat <- data.frame( v1 = rep( c(3,6,9), each=2 ),
    v2 = rep( 0:1, 3 ), 
    resp=c(0.0025, 0.00395, 0.003, 0.0042, 0.0035, 0.002) )

fit0 <- glm( resp ~ poly(v1, 2, raw=TRUE)*v2, data=mydat,
    weight=rep(100000,6), family=binomial)
b0 <- coef(fit0)


simfunc <- function( beta=b0, n=10000 ) {
    w <- sample(1:6, n, replace=TRUE, prob=c(3, rep(1,5)))
    mydat2 <- mydat[w, 1:2]
    eta <- with(mydat2,  cbind( 1, v1, 
                v1^2, v2,
                v1*v2,
                v1^2*v2 ) %*% beta )
    p <- exp(eta)/(1+exp(eta))
    mydat2$resp <- rbinom(n, 1, p)

    fit1 <- glm( resp ~ poly(v1, 2)*v2, data=mydat2,
        family=binomial)
    fit2 <- update(fit1, .~ poly(v1,2) )
    anova(fit1,fit2, test='Chisq')[2,5]
}

out <- replicate(100, simfunc(b0, 10000))
mean( out <= 0.05 )
hist(out)
abline(v=0.05, col='lightgrey')

この関数は、v2の全体的な効果をテストします。モデルを変更して、他のタイプのテストを見ることができます。関数として書くのが好きなので、何か違うものをテストしたいときは、関数の引数を変更するだけです。進行状況バーを追加するか、並列パッケージを使用して速度を上げることもできます。

ここでは、100回の複製を行いました。通常、そのレベルから始めて、おおよそのサンプルサイズを見つけてから、適切なボールパークにいるときに口論を増やします(パワーが20%の場合、10,000回の反復で時間を無駄にする必要はありません)。


グレッグ、ありがとう!私はこの同じアプローチについて疑問に思っていました(あなたがしたことを正しく理解している場合)。確認するには:「mydat」に基づいて非常に大きいデータセットを作成していますか(実際には、Var1とVar2の値と、応答の1と0の値の個別のレコードを作成する総当たりの代わりに重みを使用して作成しています) 、ロジスティック回帰をフィッティングし、それらの係数を使用してシミュレーションで提案されたモデルからサンプリングしますか?これは係数を思いつくための一般的な方法のようです-それはちょうど私がリンクした順序回帰力についてのあなたの応答のようです。
B_Miner

初期モデルは重みを使用して使用する係数を取得しますが、シミュレーションではn行を持つデータフレームを作成します。関数で重みを付ける方が効率的かもしれません。
グレッグスノー

使用されている係数を取得する目的で、最初にデータを使用して(非常に適切な推定値を取得するために大きくする)ことは正しいですか?
B_Miner

はい、まあ大きなのは、割合と重みの積が整数になることです。
グレッグスノー

2
@B_Miner、私は記事を計画していますが、一冊の本が十分であるかどうかはわかりません。しかし、励ましに感謝します。
グレッグスノー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.