順序ロジスティック回帰の検出力分析


回答:


27

私は、シミュレーションによって基本を超えるパワー解析を行うことを好みます。あらかじめ用意されているパッケージでは、どのような仮定が行われているのかよくわかりません。

Rを使用すると、電力のシミュレーションは非常に簡単(手頃な価格)になります。

  1. データがどのように見えるべきか、そしてどのように分析するかを決定する
  2. 特定の関係とサンプルサイズのデータ​​をシミュレートし、分析を行う関数または式のセットを記述します(関数は、サンプルサイズとパラメーターを引数にして、異なる値を簡単に試すことができるという点で望ましいです)。関数またはコードは、p値または他の検定統計量を返す必要があります。
  3. replicate関数を使用して、何度もコードを実行します(通常は約100回で開始し、所要時間を把握し、適切な一般領域を取得します。その後、最大1,000、場合によっては10,000または100,000最終的な値を使用します)。帰無仮説を棄却した回数の割合がべき乗です。
  4. 条件の別のセットに対して上記をやり直します。

順序回帰を使用した簡単な例を次に示します。

library(rms)

tmpfun <- function(n, beta0, beta1, beta2) {
    x <- runif(n, 0, 10)
    eta1 <- beta0 + beta1*x
    eta2 <- eta1 + beta2
    p1 <- exp(eta1)/(1+exp(eta1))
    p2 <- exp(eta2)/(1+exp(eta2))
    tmp <- runif(n)
    y <- (tmp < p1) + (tmp < p2)
    fit <- lrm(y~x)
    fit$stats[5]
}

out <- replicate(1000, tmpfun(100, -1/2, 1/4, 1/4))
mean( out < 0.05 )

6
NNN

2
@gung:あなたのコメントは理にかなっていますが、Rの経験の少ない人もそれから利益を得られるようにコードを追加してもよろしいですか?ありがとう

1
私はこれをもう一度見ていますが、いくつか質問があります:1)xが1:10で均一になるのはなぜですか?2)複数の独立変数に一般化するにはどうしますか?
ピーターフロム-モニカの復職

1
@ PeterFlom、xは何かである必要があったので、0から10の間で均一にするように(任意に)選択しました。また、正常、ガンマなどにすることもできました。 x変数は次のようになります。複数の予測変数を使用するには、それらを独立して(または多変量正規分布、コピュラなどから)生成し、すべてをeta1ピースに含めます(例:)eta1 <- beta0 + beta1*x1 + beta2*x2 + beta3*x3
グレッグスノー

1
replicatemeanα=0.05

3

Snowの答えにもう1つ追加します(これはシミュレーションによる電力解析にも当てはまります)。1つまたは2つのテールのテストを探しているかどうかに注意してください。G * Powerのような一般的なプログラムは、デフォルトで片側検定になります。シミュレーションがそれらと一致するかどうかを確認しようとする場合(これを行う方法を学習するときは常に良い考えです)、まずそれを確認する必要があります。

Snowの片側検定を実行するには、関数の入力に「tail」というパラメーターを追加し、関数自体に次のようなものを追加します。

 #two-tail test
  if (tail==2) fit$stats[5]

  #one-tail test
  if (tail==1){
    if (fit$coefficients[5]>0) {
          fit$stats[5]/2
    } else 1

片側バージョンは、基本的に係数が正であることを確認してから、p値を半分にカットします。


2

Snowの優れた例に加えて、効果のある既存のデータセットからリサンプリングすることで電力シミュレーションを行うこともできると思います。ブートストラップではありません。同じnを交換してサンプリングするわけではないので、同じ考えです。

例は次のとおりです。正のポイント推定値になった小さな自己実験を実行しましたが、それは小さいため、順序ロジスティック回帰では統計的に有意ではありませんでした。そのポイント推定では、どれくらいのnが必要ですか?さまざまな可能性のあるnについて、データセットを何度も生成し、順序ロジスティック回帰を実行して、p値がどれほど小さいかを確認しました。

library(boot)
library(rms)
npt <- read.csv("http://www.gwern.net/docs/nootropics/2013-gwern-noopept.csv")
newNoopeptPower <- function(dt, indices) {
    d <- dt[sample(nrow(dt), n, replace=TRUE), ] # new dataset, possibly larger than the original
    lmodel <- lrm(MP ~ Noopept + Magtein, data = d)
    return(anova(lmodel)[7])
}
alpha <- 0.05
for (n in seq(from = 300, to = 600, by = 30)) {
   bs <- boot(data=npt, statistic=newNoopeptPower, R=10000, parallel="multicore", ncpus=4)
   print(c(n, sum(bs$t<=alpha)/length(bs$t)))
}

出力(私にとって)で:

[1] 300.0000   0.1823
[1] 330.0000   0.1925
[1] 360.0000   0.2083
[1] 390.0000   0.2143
[1] 420.0000   0.2318
[1] 450.0000   0.2462
[1] 480.000   0.258
[1] 510.0000   0.2825
[1] 540.0000   0.2855
[1] 570.0000   0.3184
[1] 600.0000   0.3175

この場合、n = 600で電力は32%でした。あまり励みになりません。

(シミュレーションのアプローチが間違っている場合は、誰かに教えてください。臨床試験を計画するための電力シミュレーションについて議論しているいくつかの医学論文を読みますが、正確な実装についてはまったく確信がありません。)


0

最初のシミュレーションを参照する(Snowが推奨、https//stats.stackexchange.com/a/22410/231675):

さらに多くの(具体的には、3つの)独立変数を使用してシミュレーションがどのように見えるかはまだわかりません。「すべてをeta1ピースに含める必要があることを理解しています。たとえば、eta1 <-beta0 + beta1 * x1 + beta2 * x2 + beta3 * x3 ''(上記のとおり)。しかし、関数の残りのパラメーターを調整する方法はわかりません。誰かがこれを手伝ってくれますか?


1
この質問へのリンクを含む新しい質問をした方が、より良い応答を得られると思います。
mdewey
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.