Ordinal lojistik regresyon için güç analizi


Yanıtlar:


27

Simülasyon ile temellerin ötesinde güç analizleri yapmayı tercih ederim. Hazır paketlerle, hangi varsayımların yapıldığından asla emin olamıyorum.

Güç simülasyonu, R kullanarak oldukça basittir (ve uygun fiyatlı).

  1. verilerinizin neye benzemesi gerektiğini düşündüğünüze ve verilerinizi nasıl analiz edeceğinize karar verin
  2. belirli bir ilişki ve örnek boyutu için verileri simüle edecek bir işlev veya ifade kümesi yazın ve analizi yapın (farklı değerleri denemeyi kolaylaştırmak için örnek boyutunu ve parametrelerini bağımsız değişkenler haline getirebileceğiniz bir işlev tercih edilir). İşlev veya kod, p değerini veya diğer test istatistiklerini döndürmelidir.
  3. replicateBu kodu birkaç kez yukarıdan çalıştırmak için işlevi kullanın (ne kadar sürdüğüne dair bir fikir edinmek ve doğru genel alanı elde etmek için genellikle yaklaşık 100 kez başlıyorum, sonra 1000 ve bazen 10.000 veya 100.000'e kadar kullanacağım son değerler). Sıfır hipotezini reddettiğinizin oranı güçtür.
  4. başka bir koşul kümesi için yukarıdaki işlemleri tekrarlayın.

Sıralı regresyon ile basit bir örnek:

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
+1, bu çok sağlam, evrensel bir yaklaşım. Sık kullandım. Başka bir özellik önermek istiyorum: Düşündüğünüz maksimum için veri üretebilir , ardından 1 n'i arka arkaya kadar düzenli aralıklarla (örn., N = 100) yerleştirerek bu verilerin oranlarına model ekleyebilirsiniz 120, 140, 160, 180 ve 200). Oluşturulan her veri kümesinden bir p değeri kaydetmek yerine, bir p değeri satırı kaydedebilirsiniz . Her bir sütunun ortalamasının alınması, gücün w / olarak nasıl değiştiğine dair hızlı ve kirli bir his verir ve hızlı bir şekilde uygun bir değere odaklanmanıza yardımcı olur. N NN-N-N-
gung - Monica'yı eski durumuna döndürün

2
@gung: yorumunuz anlamlı, R'deki kişilerin daha az deneyim kazanması için kodlarınızı eklemeyi düşünür müsünüz? teşekkürler

1
Buna tekrar bakıyorum ve birkaç sorum var: 1) X 1:10'da neden üniforma? 2) Bunu 1'den fazla bağımsız değişkene nasıl genelleştirirdiniz?
Peter Flom - Monica'yı eski durumuna döndürün

1
@PeterFlom, x bir şey olmalıydı, bu yüzden (keyfi olarak) 0 ile 10 arasında üniforma olmasını seçtim, normal de olabilirdi, gama, vb. En iyisi, gerçek beklediğimiz şeylere benzer bir şey seçmek olurdu. x değişkenine benzeyecek. 1'den fazla öngörücü değişkeni kullanmak için, bunları bağımsız olarak (veya çok değişkenli bir normalden, kopuladan, vb.) Üretin, sonra hepsini eta1 parçasına ekleyin, örn eta1 <- beta0 + beta1*x1 + beta2*x2 + beta3*x3.
Greg Snow

1
@ABC, çoğaltma değil sadece tek bir karar verir, testin ne sıklıkta reddettiğini (gücün tanımı) belirlemek için çoğaltmalara ihtiyacınız vardır. replicateişlevde değil ve değiştirmiyor. İşlev bir yineleme için p değerini (uygun $ istatistiklerinde [5] olan) döndürür, çoğaltma işlevi 1.000 kez (veya belirttiğiniz herhangi bir sayı) çalıştırır ve 1.000 p değerini döndürür, meanişlev daha sonra değerinde null değerini reddeden sınamalar . α=0.05
Greg Snow

3

Snow'un cevabına başka bir şey daha ekleyeceğim (ve bu simülasyon yoluyla herhangi bir güç analizi için geçerlidir) - 1 veya 2 kuyruklu bir test mi arıyorsunuz? G * Power gibi popüler programlar varsayılan olarak 1 kuyruklu testtir ve simülasyonlarınızın bunlarla eşleşip eşleşmediğini görmeye çalışıyorsanız (bunu nasıl yapacağınızı öğrenirken her zaman iyi bir fikir), önce bunu kontrol etmek isteyeceksiniz.

Snow'un 1 kuyruklu bir testi çalıştırmasını sağlamak için, işlev girişlerine "kuyruk" adlı bir parametre ekler ve işlevin kendisine böyle bir şey koyarım:

 #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

1 kuyruklu versiyon temel olarak katsayının pozitif olup olmadığını kontrol eder ve sonra p değerini yarıya indirir.


2

Snow'un mükemmel örneğinin yanı sıra, etkisi olan mevcut bir veri kümesinden yeniden örnekleyerek bir güç simülasyonu yapabileceğinize inanıyorum. Tam olarak bir bootstrap değil, aynı n yerine ancak aynı fikri değiştirerek örneklemiyorsunuz .

İşte bir örnek: Olumlu bir nokta tahminine dönüşen küçük bir kendi kendine deney yaptım, ancak küçük olduğu için sıralı lojistik regresyonda neredeyse istatistiksel olarak anlamlı değildi. Bu nokta tahminiyle, ne kadar büyük bir n'ye ihtiyacım olacak? Çeşitli olası n için , birçok kez bir veri kümesi oluşturdum ve sıralı lojistik regresyonu çalıştırdım ve p- değerinin ne kadar küçük olduğunu gördüm :

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)))
}

Çıktı ile (benim için):

[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

Bu durumda, n = 600'de güç% 32 idi. Çok cesaret verici değil.

(Simülasyon yaklaşımım yanlışsa, lütfen biri bana söyle. Klinik araştırmaları planlamak için güç simülasyonunu tartışan birkaç tıbbi makaleye gidiyorum, ancak kesin uygulamamdan hiç emin değilim.)


0

İlk simülasyona atıfta bulunarak (Snow tarafından önerilen; /stats//a/22410/231675 ):

Simülasyonun daha fazla (özellikle üç) bağımsız değişkenle nasıl görünmesi gerektiğinden hala emin değilim. Hepsini eta1 parçasına eklemem gerektiğini anlıyorum, örneğin eta1 <- beta0 + beta1 * x1 + beta2 * x2 + beta3 * x3 '' (yukarıda belirtildiği gibi). Fakat fonksiyondaki diğer parametrelerin nasıl ayarlanacağını bilmiyorum. Birisi bana bu konuda yardımcı olabilir mi?


1
Bu soruna geri dönen bir bağlantı içeren yeni bir soru sorsaydınız daha iyi yanıt alacağınızı düşünüyorum.
mdewey
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.