Nadir olay lojistik regresyon önyargısı: hafife alınan p'leri minimal bir örnekle nasıl simüle edebilirim?


19

CrossValidated'ın King ve Zeng (2001) tarafından yapılan nadir olay önyargı düzeltmesinin ne zaman ve nasıl uygulanacağı konusunda birkaç sorusu vardır . Ben farklı bir şey arıyorum: önyargı var minimal simülasyon tabanlı bir gösteri.

Özellikle, Kral ve Zeng devleti

“... nadir olay verilerinde olasılıklardaki yanlılıklar binlerce örneklem büyüklüğü ile büyük ölçüde anlamlı olabilir ve tahmin edilebilir bir yöndedir: tahmini olay olasılıkları çok küçük.”

İşte benim R böyle bir önyargı simüle girişimi:

# FUNCTIONS
do.one.sim = function(p){
    N = length(p)
    # Draw fake data based on probabilities p  
    y = rbinom(N, 1, p)  
    # Extract the fitted probability.
    #    If p is constant, glm does y ~ 1, the intercept-only model.
    #    If p is not constant, assume its smallest value is p[1]:
    glm(y ~ p, family = 'binomial')$fitted[1]
}
mean.of.K.estimates = function(p, K){
    mean(replicate(K, do.one.sim(p) ))
}

# MONTE CARLO
N = 100
p = rep(0.01, N)
reps = 100
# The following line may take about 30 seconds
sim = replicate(reps, mean.of.K.estimates(p, K=100))
# Z-score:
abs(p[1]-mean(sim))/(sd(sim)/sqrt(reps))
# Distribution of average probability estimates:
hist(sim)

Bunu çalıştırdığımda, çok küçük z skorları elde etme eğilimindeyim ve tahminlerin histogramı p = 0.01 gerçeğine odaklanmış durumda.

Neyi kaçırıyorum? Simülasyonum yeterince büyük değil mi (gerçekte çok küçük) önyargıyı gösteriyor mu? Önyargı, bir çeşit ortak değişkenin (kesişimden daha fazla) dahil edilmesini gerektiriyor mu?

Güncelleme 1: King ve Zeng, 12. denkleminde sapması için kabaca bir yaklaşım içermektedir . Kaydeden paydada, ben büyük ölçüde azaltılmış olması ve simülasyon yeniden koştu, ama yine de tahmin olay olasılıkları hiçbir önyargı belirgindir. (Bunu sadece ilham kaynağı olarak kullandım. Yukarıdaki olay değil, tahmini olay olasılıkları ile ilgili olduğunu .)β 0β0NN5β^0

Güncelleme 2: Yorumlardaki bir öneriyi takiben, eşdeğer sonuçlara yol açan regresyona bağımsız bir değişken ekledim:

p.small = 0.01
p.large = 0.2
p = c(rep(p.small, round(N/2) ), rep(p.large, N- round(N/2) ) )
sim = replicate(reps, mean.of.K.estimates(p, K=100))

Açıklama: pKendini bağımsız değişken olarak kullandım , burada pküçük bir değer (0.01) ve daha büyük bir değer (0.2) tekrarları olan bir vektör. Sonunda, simsadece 0.01'e karşılık gelen tahmini olasılıkları saklar ve yanlılık işareti yoktur.p=0.01

Güncelleme 3 (5 Mayıs 2016): Bu, sonuçları belirgin bir şekilde değiştirmez, ancak yeni iç simülasyon işlevim

do.one.sim = function(p){
    N = length(p)
    # Draw fake data based on probabilities p  
    y = rbinom(N, 1, p)
    if(sum(y) == 0){ # then the glm MLE = minus infinity to get p = 0
        return(0)
    }else{
        # Extract the fitted probability.
        #    If p is constant, glm does y ~ 1, the intercept only model.
        #    If p is not constant, assume its smallest value is p[1]:
        return(glm(y ~ p, family = 'binomial')$fitted[1])
    }
}

Açıklama: y aynı sıfır olduğunda MLE mevcut değildir ( hatırlatma için buradaki yorumlar sayesinde ). R, " pozitif yakınsama toleransı " aslında tatmin olduğu için bir uyarı atar . Daha liberal olarak konuşursak, MLE vardır ve eksi sonsuzdur, bu da karşılık gelir ; dolayısıyla işlev güncellemem. Yapmayı düşünebileceğim tek tutarlı şey, simülasyonun y'nin aynı olduğu sıfırları atmasıdır, ancak bu, "tahmini olay olasılıklarının çok küçük olduğu" ilk iddiasına açıkça daha fazla sonuç verecektir.p=0


3
Bunun üzerinde çalıştığınıza sevindim ve başkalarının yorumlarını bekliyoruz. Bir sapma olsa bile, sapma düzeltmesi tahminlerin ortalama kare hatasını yükseltmek için muhtemelen varyansı artırabilir.
Frank Harrell

3
@FrankHarrell, King ve Zeng de “önyargıyı azaltmanın da varyansı azalttığı mutlu durumdayız” diyor.
zkurtz

1
İyi. Önyargı miktarının endişelenecek kadar büyük olup olmadığı hala görülüyor.
Frank Harrell

Sizin için "nadir" nedir? Örneğin, yıllık% 0.001 varsayılan temerrüt oranı kredi AAA notuyla ilişkilendirilir. Bu senin için yeterli mi?
Aksakal

1
@Aksakal, benim en sevdiğim “nadir” seçiminin King ve Zeng'in yazdığı önyargıyı en açık şekilde göstermesidir.
zkurtz

Yanıtlar:


4

Bu ilginç bir soru - bunun daha fazla tartışmayı teşvik etmesi ümidiyle aşağıda gönderdiğim birkaç simülasyon yaptım.

Her şeyden önce, birkaç genel yorum:

  • Alıntı yaptığınız makale nadir olay yanlılığıyla ilgilidir. Daha önce bana açık olmayan şey (yukarıda yapılan yorumlarla ilgili olarak), 10/30 gözlemlerin aksine 10/10000'ünüz olduğu durumlar hakkında özel bir şey olup olmadığıdır. Ancak, bazı simülasyonlardan sonra, orada katılıyorum.

  • Aklımda olan bir sorun (bunu sık sık karşılaştım ve son zamanlarda Ekoloji ve Evrim Metodları hakkında bir makale vardı, referansı bulamadım) küçük verilerde GLM'lerle dejenere vakalar alabilmeniz MLE'nin gerçeğe yakın FAAAR olduğu veya hatta - / + sonsuzluğundaki (sanırım doğrusal olmayan bağlantı nedeniyle) durumlar. Önyargı tahmininde bu vakalara nasıl davranılması gerektiği açık değil, ama simülasyonlarımdan nadir olay önyargısı için anahtar gibi göründüklerini söyleyebilirim. Benim sezgim onları kaldırmak olacaktı, ama sonra ne kadar uzaklaştırılmaları gerektiği belli değil. Önyargı düzeltmesi için akılda tutulması gereken bir şey olabilir.

  • Ayrıca, bu dejenere vakalar sayısal sorunlara neden olmaya eğilimli görünmektedir (bu nedenle glm fonksiyonunda maksimum değeri arttırdım, ancak biri gerçek MLE'yi gerçekten bildirdiğinden emin olmak için epsilonun artmasını da düşünebilir).

Her neyse, burada, düşük bir örneklem büyüklüğü / orta derecede insidans durumu için, bir lojistik regresyonda kesişme, eğim ve tahminler için tahminler ve doğruluk arasındaki farkı hesaplayan bazı kodlar:

set.seed(123)
replicates = 1000
N= 40
slope = 2 # slope (linear scale)
intercept = - 1 # intercept (linear scale)

bias <- matrix(NA, nrow = replicates, ncol = 3)
incidencePredBias <- rep(NA, replicates)

for (i in 1:replicates){
  pred = runif(N,min=-1,max=1) 
  linearResponse = intercept + slope*pred
  data = rbinom(N, 1, plogis(linearResponse))  
  fit <- glm(data ~ pred, family = 'binomial', control = list(maxit = 300))
  bias[i,1:2] = fit$coefficients - c(intercept, slope)
  bias[i,3] = mean(predict(fit,type = "response")) - mean(plogis(linearResponse))
}

par(mfrow = c(1,3))
text = c("Bias intercept", "Bias slope", "Bias prediction")

for (i in 1:3){
  hist(bias[,i], breaks = 100, main = text[i])
  abline(v=mean(bias[,i]), col = "red", lwd = 3)  
}

apply(bias, 2, mean)
apply(bias, 2, sd) / sqrt(replicates)

Ortaya çıkan önyargı ve kesişme, eğim ve tahmin için standart hatalar

-0.120429315  0.296453122 -0.001619793
 0.016105833  0.032835468  0.002040664

Çizilen sonuçlara bakıldığında, tahmin edilen değerlerin varyansıyla karşılaştırıldığında yanlılığın küçük olduğunu göstermesine rağmen, kesişimde hafif bir negatif önyargı ve eğimde hafif bir pozitif önyargı için oldukça iyi kanıtlar olduğu sonucuna varabilirim.

resim açıklamasını buraya girin

Parametreleri nadir olay durumuna ayarlıyorsam

N= 4000
slope = 2 # slope (linear scale)
intercept = - 10 # intercept (linear scale)

Kesişim için daha büyük bir önyargı alıyorum, ama yine de tahminte HİÇBİRİ

   -1.716144e+01  4.271145e-01 -3.793141e-06
    5.039331e-01  4.806615e-01  4.356062e-06

Tahmini değerlerin histogramında, dejenere parametre tahminleri fenomenini görüyoruz (eğer bunları böyle çağırırsak)

resim açıklamasını buraya girin

Kesişim tahminlerinin <20 olduğu tüm satırları kaldıralım

apply(bias[bias[,1] > -20,], 2, mean)
apply(bias[bias[,1] > -20,], 2, sd) / sqrt(length(bias[,1] > -10))

Önyargı azalır ve şekillerde işler biraz daha netleşir - parametre tahminleri normalde dağılmaz. Bunun rapor edilen CI'lerin geçerliliği anlamına geldiğini merak ediyorum.

-0.6694874106  1.9740437782  0.0002079945
1.329322e-01 1.619451e-01 3.242677e-06

resim açıklamasını buraya girin

Kesişimdeki nadir olay yanlılığının nadir olayların, yani nadir, son derece küçük tahminler tarafından yönlendirildiği sonucuna varabilirim. Onları kaldırmak isteyip istemediğimizden emin değil, kesmenin ne olacağından emin değilim.

Bununla birlikte dikkat edilmesi gereken önemli bir nokta, her iki durumda da, yanıt ölçeğindeki tahminlerde herhangi bir önyargı olmadığıdır - bağlantı işlevi bu son derece küçük değerleri emer.


1
Evet, hala ilgileniyorum. Güzel bir tartışma için ve benimkine benzer sonuçlar bulmak için +1 (açık bir tahmin yanlılığı yok). İkimizin de haklı olduğunu varsayarsak, nihayetinde ya önyargı yanlılığıyla ilgili gerçek kaygıyı hak eden koşulların bir karakterizasyonunu (yani, en azından bir örnek) ya da Kral ve Zeng gazetesinde ortaya çıkan zayıflıkların bir açıklamasını görmek isterim önyargı düzeltmelerinin önemini abartmak için.
zkurtz

±20

1

Nadir olayların yanlılığı sadece regresörler olduğunda ortaya çıkar. Burada simüle edilen gibi sadece kesişen bir modelde gerçekleşmez. Ayrıntılar için bu gönderiye bakın: http://statistichorizons.com/linear-vs-logistic#comment-276108


3
Merhaba Paul. Yanıtınızı bağımsız olacak ve harici bir web sitesine erişim gerektirmeyecek şekilde genişletmeniz tercih edilir (örneğin, bir noktada kullanılamayabilir).
Patrick Coulombe

Ayrıca OP'de "güncelleme 2" ye dikkat edin. Yanlılık ayrıca tek bir regresör ile ortaya çıkmadı.
zkurtz

King & Zeng denklemine (16) ve Şekil 7'ye göre, önyargı X regresörlerinin bir fonksiyonudur. X küçükse hiçbir önyargı yoktur, bu güncelleme 2'de OP tarafından dikkate alınan durumdur. X büyük olduğunda yanlılık. Ayrıca King & Zeng'in simülasyonunu kopyalamaya çalışmanızı da öneririm.
Paul von Hippel

King-Zeng gazetesine bir link: gking.harvard.edu/files/0s.pdf
Paul von Hippel

1

Makaledeki Şekil 7, tahminlerdeki yanlılık sorununu en doğrudan ele almaktadır. Figürü tam olarak anlamıyorum (özellikle, "tahmini olay olasılıkları çok küçük" yorumu aşırı basitleştirme gibi görünüyor), ancak Bölüm 6.1'deki simülasyonlarının kısa açıklamalarına dayanarak buna benzer bir şey üretmeyi başardım:

n_grid = 40
x_grid = seq(0, 7, length.out = n_grid)
beta0 = -6
beta1 = 1

inverse_logit = function(x) 1/(1 + exp(-x))

do.one.sim = function(){
    N = 5000
    x = rnorm(N)
    p = inverse_logit(beta0 + beta1*x)
    # Draw fake data based on probabilities p
    y = rbinom(N, 1, p)
    if(sum(y) == 0){ # then the glm MLE = minus infinity to get p = 0
        return(rep(0, n_grid))
    }else{
        # Extract the error
        mod = glm(y ~ x, family = 'binomial')
        truth = inverse_logit(beta0 + beta1*x_grid)
        pred = predict(mod, newdata = data.frame(x = x_grid),
            type = 'response')
        return(pred - truth)
    }
}
mean.of.K.estimates = function(K){
    rowMeans(replicate(K, do.one.sim()))
}

set.seed(1)
bias = replicate(10, mean.of.K.estimates(100))
maxes = as.numeric(apply(bias, 1, max))
mins = as.numeric(apply(bias, 1, min))

par(mfrow = c(3, 1), mar = c(4,4,2,2))
plot(x_grid, rowMeans(bias), type = 'l',
    ylim = c(min(bias), max(bias)),
    xlab = 'x', ylab = 'bias')
lines(x_grid, maxes, lty = 2)
lines(x_grid, mins, lty = 2)
plot(x_grid, dnorm(x_grid), type = 'l',
    xlab = 'x', ylab = 'standard normal density')
plot(x_grid, inverse_logit(beta0 + beta1*x_grid),
    xlab = 'x', ylab = 'true simulation P(Y = 1)',
    type = 'l')

İlk grafik, şekil 7'deki replikasyonum, 10 denemede tüm sonuçları temsil eden kesikli eğrilerin eklenmesi.

Makaleye göre, xburada standart bir normalden çizilen regresyonda bir öngörücü değişken bulunmaktadır. Bu nedenle, ikinci grafikte gösterildiği gibi, x > 3(ilk grafikte en görünür yanlılığın meydana geldiği yerde) için gözlemlerin göreli sıklığı azalmaktadır.

Üçüncü grafik, üretim sürecinde "gerçek" simülasyon olasılıklarını bir fonksiyonu olarak göstermektedir x. Görünüşe göre en büyük önyargı x, nadir olan veya olmayan yerlerde ortaya çıkar .

Birlikte ele alındıklarında, bu OP'nin "nadir olayı" (yani x > 3) " P(Y = 1)çok küçük olan olayla" karıştırarak makalenin merkezi iddiasını tamamen yanlış yorumladığını göstermektedir . Muhtemelen kağıt ikincisi yerine ilkiyle ilgilidir.

resim açıklamasını buraya girin

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.