Lojistik regresyon gücü analizinin simülasyonu - tasarlanan deneyler


39

Bu soru bir açısından @Greg Kar tarafından verilen bir cevap tepki olarak söz ben lojistik regresyon ve SAS ile güç analizi ile ilgili sorulan Proc GLMPOWER.

Bir deney tasarlıyorsam ve sonuçları bir faktöriyel lojistik regresyonda analiz edersem, bir güç analizi yapmak için simülasyonu (ve burada ) nasıl kullanabilirim ?

İki değişkenin olduğu basit bir örnek, ilk üç olası değeri {0.03, 0.06, 0.09} alır ve ikincisi yapay bir göstergedir {0,1}. Her biri için, her kombinasyon için yanıt oranını tahmin ediyoruz (yanıt verenlerin sayısı / pazarlanan kişi sayısı). Dahası, ilk faktörlerin birçoğunun diğerlerinin 3 katı (eşit olarak kabul edilebilir) olmasını istiyoruz çünkü bu ilk kombinasyon bizim denenmiş ve gerçek versiyonumuz. Bu, bağlantılı soruda belirtilen SAS kursunda verilen gibi bir kurulumdur.

görüntü tanımını buraya girin

Sonuçları analiz etmek için kullanılacak model, ana etkileri ve etkileşimi olan lojistik bir regresyon olacaktır (yanıt 0 veya 1'dir).

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

Güç analizi yapmak için bu modelle kullanılacak bir veri setini nasıl simüle edebilirim?

Bunu SAS ile çalıştırdığımda Proc GLMPOWER( p'nin gösterilen yanıtlama oranlarının ağırlıklı ortalaması olduğu STDDEV =0.05486016 anlamına gelir sqrt(p(1-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;

Not: GLMPOWERsadece sınıf (nominal) değişkenleri kullanacak, bu nedenle yukarıdaki 3, 6, 9 karakter olarak değerlendirilir ve düşük, orta ve yüksek veya diğer üç karakter olabilir. Gerçek analiz yapıldığında, Var1 sayısal olarak kullanılacaktır (ve herhangi bir eğriliği hesaba katan bir polinom terimi Var1 * Var1 içerecektir).

SAS’tan çıktı

görüntü tanımını buraya girin

Böylece, örnek büyüklüğümüzün (Var2 ana etkisinin tahmin edilmesi en zor olan) 762,112'ye ihtiyaç duyduğumuzu görüyoruz ki, 0,80 ve alfa 0,05'e eşit. Bunları 3 kez taban çizgisi kombinasyonu (yani 0,375 * 762112) olduğu ve kalanın da diğer 5 kombinasyona eşit olarak düştüğü şekilde tahsis edeceğiz.


Bunu R'de yapmak kolaydır. 1. soru: Tüm vakaların% 75'inin {var1 = .03, var2 = 0} & diğer tüm taraklar için% 25 olmasını ve her biri için 3 birim olmamasını istediğiniz doğru mu? diğer kombinasyonların her birinde birim (yani% 37,5)? 2. soru, tespit etmek istediğiniz etkileri belirleyebilir misiniz? Yani, 1 ile 0 arasındaki kayıt oranları ne olur? Var1, 01'e kadar yükselirse, başarı günlükleri nasıl değişmeli? Bir etkileşim olabileceğini düşünüyor musunuz (öyleyse, bu ne kadar büyük)? (NB, bu Q'ların cevaplandırması zor olabilir, 1 strateji, her bir kombinasyonda olabileceğini düşündüğünüz
gung -

1: Temel durum için 3'ün ağırlığı, {var1 = 0.03, var2 = 0} olan 3 vakadan daha fazla olmasıdır. Bu nedenle, SAS'ın (ana etkiyi% 80 reddetme gücüne sahip olmak için toplam 762.112 toplam örneklem büyüklüğüne ihtiyaç duyduğumuzu söylüyor; bu nedenle ihtiyaç duyduğumuz toplam örneklem büyüklüğü budur) bu temel durum için% 37.5 tahsis edilecektir.
B_Miner

2: Elimizdeki tek şey cevap oranları (deneme sayısındaki başarı sayısının beklenen oranıdır). Bu nedenle, Var1 = 0.03 ve Var2 = 0 ile 1000 harf gönderirsek, bu, 0.03 (% 3) kredi kartıyla doğrudan posta teklifindeki faiz teklifine tekabül eder ve zarfın üzerinde etiket içermez (Var2 = 1 olduğu anlamına gelir). Bir etiket), 1000 * 0.0025 yanıt bekliyoruz.
B_Miner

2. devam: Bir etkileşim bekliyoruz - bu yüzden cevap oranları. Var1'in değerine bağlı olarak Var2 = 0 için farklı bir yanıt oranı olduğunu unutmayın. Bunları günlük oranlarına ve ardından simüle edilmiş bir veri setine nasıl çevireceğimi bilmiyorum.
B_Miner

Yine de son bir şey. Var2 = 0 olduğunda yanıt oranlarının var1 için doğrusal olduğunu fark ettim (yani,% .25,% .30,% 35). Bunun doğrusal bir etki mi yoksa eğrisel mi olacağını düşündün? Olasılıkların, menzilindeki küçük alt kümeler için oldukça doğrusal görünebileceğini bilmelisiniz, ancak gerçekte doğrusal olamazlar. Lojistik regresyon, olasılıkta değil, log oranlarında doğrusaldır (cevabımdaki gibi şeyleri burada tartışıyorum ).
gung - Monica'yı yeniden yerleştirme

Yanıtlar:


43

Ön Bilgiler:

  • NESα

    • Nα=.05
    • N
  • @ GregSnow'un mükemmel yayınına ek olarak , CV üzerinde simülasyon tabanlı güç analizleri için gerçekten harika bir rehber burada bulunabilir: İstatistiksel gücün hesaplanması . Temel fikirleri özetlemek için:

    1. tespit edebilmek istediğiniz etkiyi çözmek
    2. Bu olası dünyadan N veri üretmek
    3. bu sahte veriler üzerinde yapmayı düşündüğünüz analizi yapın
    4. seçtiğiniz alfaya göre sonuçların 'anlamlı' olup olmadığını saklayın
    5. BN
    6. N
  • ppBpB

  • R'de verilen 'başarı' olasılığına sahip ikili veri oluşturmanın birincil yolu ? Rbinom'dur.

    • Örneğin, olasılıklı p olan 10 Bernoulli denemesinden elde edilen başarı sayısını elde etmek için, kod şöyle olacaktır rbinom(n=10, size=1, prob=p)(muhtemelen sonucu depolamak için bir değişkene atamak isteyeceksiniz).
    • bu verileri ayrıca ? runif , örneğin,ifelse(runif(1)<=p, 1, 0)
    • Sonuçların gizli bir Gauss değişkeni tarafından yönlendirildiğine inanıyorsanız, gizli değişkeninizi ? rnorm ile eş değişkenlerinizin bir işlevi olarak oluşturabilir ve ardından bunları kodunuzdakilerle olasılıklara dönüştürebilir ve bunları pnorm()kullanabilirsiniz rbinom().
  • var12var1var2var12var2

  • Her ne kadar farklı bir soru bağlamında yazılsa da, buradaki cevabım: logit ve probit modeller arasındaki fark bu model türleri hakkında birçok temel bilgiye sahiptir.
  • Farklı türü vardır gibi Tip I hata oranları birden hipotezler (örneğin vardır başına aksine hata oranı , Familywise hata oranı , & başına ailenin hata oranı ), bu yüzden güç * orada farklı türde (örneğin içindir a tek etkili, önceden belirlenmiş için, herhangi bir etki ve için, tüm etkileri ). Ayrıca, belirli bir etki kombinasyonunu tespit etme gücü veya bir bütün olarak modelin eş zamanlı testinin gücü için de arama yapabilirsiniz. SAS kodunu açıklamana göre tahminime göre bu sonuncusu. Ancak, durumunuzla ilgili tanımınızdan, etkileşim etkilerini minimumda tespit etmek istediğinizi farz ediyorum.

  • İktidarla ilgili meseleler hakkında düşünmenin farklı bir yolu için, buradaki cevaba bakınız: Örneklem büyüklüğünü haklı çıkarma bağlamında korelasyonları tahmin etmede genel kesinliği nasıl rapor edersiniz.

R'de lojistik regresyon için basit post-hoc güç:

Diyelim ki kabul ettiğiniz cevap oranları, dünyadaki gerçek durumu ve 10.000 mektup gönderdiğinizi. Bu etkileri tespit etmenin gücü nedir? ("Komik olarak etkin" kodunu yazdığım için ünlü olduğumu unutmayın, aşağıdakiler verimlilik için optimize edilmiş olmaktan ziyade takip edilmesi kolay olmalı, aslında oldukça yavaş.)

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

Bu nedenle, 10.000 harften bu yanıt oranlarını tespit etmek için% 80 güç (herhangi bir türde) gerçekten elde edilemiyor. (SAS kodunun, bu yaklaşımlar arasındaki keskin uyuşmazlığı açıklayabilmek için ne yaptığından yeterince emin değilim, ancak bu kod kavramsal olarak basit - eğer yavaşsa - ve kontrol etmek için biraz zaman harcadım ve bunları düşünüyorum. sonuçlar makul.)

Lojistik regresyon için simülasyon temelli a priori gücü:

NNNN

NN

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

var12significant

N


Gung - WOW böyle ayrıntılı ve düşünceli bir cevap için çok teşekkür ederim! Benim yazarken ve kodunuzla oynarken, ikinci dereceden terimler sorun gibi görünüyor - en az% 80 güç, modelde düşünülmeden çok daha küçük bir örneklem boyutuyla elde ediliyor.
B_Miner

1
Bu harika, @B_Miner, yapmak istediğiniz türden bir şey. Dahası, simülasyon temelli yaklaşımın sadece sayıyı yayan analitik yazılımlardan daha üstün olduğunu düşünüyorum nedeni (R'nin de pwrpaketi var). Bu yaklaşım size, ne olacağını umduğunuzu, bununla nasıl başa çıkacağınızı vb. Hakkında çok daha net bir şekilde düşünme (ve / veya düşüncenizi iyileştirme) olanağı sunar. Benzer şekilde, eğer belirtilen oranlarınız doğruysa, b / c doğrusal değillerdir ve tek başına etkileşim, eğrisel ilişkileri yakalamanıza izin vermez.
gung - Monica'yı yeniden kurun

Bence poly, R'nin yeni kullanıcılarına ham değerlerin karesi azaltma stratejisinin daha hataya açık stratejisini göstermek yerine , kullanımını kanıtlamalısınız . Bence tam model olarak gösterilmeliydi glm(responses~ poly(var1, 2) * var2, family=binomial(link="logit"). Hem yorumlamada istatistiksel hataya daha az eğilimli hem de çok daha kompakt olurdu. Bu durumda, sadece genel bir formda göründüğünüzde önemli olmayabilir, ancak bireysel terimlere bakmaya istekli olabilecek daha az karmaşık kullanıcıları kolayca yanlış yönlendirebilir.
DW 'da

@DWin, burada CV'yi göstermek için R kullandığım zaman, bunu R olmayan bir şekilde yapıyorum. Fikir, R / tanıdık olmayan kişiler için olabildiğince şeffaf olmaktır. Örneğin, vectorized olasılıkları kullanmıyorum, döngüler kullanıyorum =, vb. poly()R sınıfı değilse , sınıfın ne olduğu hakkında daha az bilgi sahibi olun .
gung - Monica’yı eski

17

@ Gung'in cevabı anlamak için mükemmeldir. İşte kullanacağım yaklaşım:

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

Bu fonksiyon v2'nin genel etkisini test eder, modeller diğer test türlerine bakmak için değiştirilebilir. Fonksiyon olarak yazmayı seviyorum, böylece farklı bir şeyi test etmek istediğimde sadece fonksiyon argümanlarını değiştirebiliyorum. Ayrıca bir ilerleme çubuğu ekleyebilir veya işleri hızlandırmak için paralel paketi kullanabilirsiniz.

Burada sadece 100 kopya yaptım, genellikle yaklaşık örnek büyüklüğünü bulmak için o seviyeden başlarım, sonra doğru top parkında olduğumda (% 20 gücünüz varken 10.000 yineleme için zaman harcamanıza gerek kalmaz) itterasyonlara başladım.


Teşekkürler Greg! Aynı yaklaşımı merak ediyordum (ne yaptığınızı doğru anlıyorsam). Onaylamak için: Bir veri seti mi oluşturuyorsunuz (aslında, ancak kaba kuvvet yerine ağırlıklar ile yapıyorsanız, cevap için çok büyük olan Var1 ve Var2 ve sonra 1 ve 0 değerlerinin bireysel kayıtlarını oluşturun) , lojistik bir regresyonun yerleştirilmesi ve sonra bu katsayıların simülasyonda önerilen modelden örnek almak için kullanılması Görünüşe göre bu, katsayıları bulmak için genel bir yol - daha sonra buna bağlı olduğum sıradan regresyon gücü konusundaki cevabınız gibi.
B_Miner

İlk model, kullanılacak katsayıları almak için ağırlıklar kullanır, ancak simülasyonda nsatırları olan bir veri çerçevesi oluşturuyor . İşlevde ağırlıklar yapmak daha verimli olabilir.
Greg Snow,

Kullanılan katsayıları elde etmek amacıyla, başlangıçta (çok iyi tahminler almayı büyük kılan) verileri kullandığınız doğru mu?
B_Miner

Evet, büyük olan şey, ağırlığın oranının bir tamsayı verdiği zamanlarıdır.
Greg Snow,

2
@B_Miner, bir makale planlıyorum, tam bir kitap için yeterli olup olmadığını bilmiyorum. Ancak teşvik için teşekkürler.
Greg Snow,
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.