İki araç arasındaki farkı test etmek için H0 altında bootstrap kullanma: gruplar içinde veya havuzda toplanmış örnek içinde değiştirme


18

İki bağımsız grup içeren bir veri bulduğumu varsayalım:

g1.lengths <- c (112.64, 97.10, 84.18, 106.96, 98.42, 101.66)

g2.lengths <- c (84.44, 82.10, 83.26, 81.02, 81.86, 86.80, 
                     85.84, 97.08, 79.64, 83.32, 91.04, 85.92,
                     73.52, 85.58, 97.70, 89.72, 88.92, 103.72,
                     105.02, 99.48, 89.50, 81.74)

group = rep (c ("g1", "g2"), c (length (g1.lengths), length (g2.lengths)))

lengths = data.frame( lengths = c(g1.lengths, g2.lengths), group)

G1'in 6 gözlemi ve g2'nin 22 olduğu grup başına örneklem büyüklüğünün taraflı olduğu açıktır . Geleneksel ANOVA, kritik değer 0.05'e ayarlandığında grupların farklı araçlara sahip olduğunu göstermektedir (p değeri 0.0044'tür ).

summary (aov (lengths~group, data = lengths))  

Amacım ortalama farkı karşılaştırmak olduğu için, bu dengesiz ve küçük örneklenmiş veriler geleneksel yaklaşımla uygunsuz sonuçlar verebilir. Bu nedenle permütasyon testi ve bootstrap yapmak istiyorum.

İZİN TESTİ

Boş hipotez (H0), grubun araçlarının aynı olduğunu belirtir. Permütasyon testindeki bu varsayım, grupları tek bir örnekte toplayarak haklı çıkar. Bu, iki grup için numunelerin aynı dağılımdan alınmasını sağlar. Toplanan verilerden tekrarlanan örnekleme (veya daha kesin olarak - yeniden karıştırma) ile gözlemler örneklere yeni bir şekilde yeniden tahsis edilir (karıştırılır) ve test istatistiği hesaplanır. Bunu n kez yapmak, H0'ın DOĞRU olduğu varsayımı altında test istatistiklerinin örnekleme dağılımını verecektir. Sonunda, H0 altında p değeri, test istatistiğinin gözlenen değere eşit veya bu değeri aşması olasılığıdır.

s.size.g1 <- length (g1.lengths)
s.size.g2 <- length (g2.lengths)

pool <- lengths$lengths
obs.diff.p <- mean (g1.lengths) - mean (g2.lengths)
iterations <- 10000
sampl.dist.p <- NULL

set.seed (5)
for (i in 1 : iterations) {
        resample <- sample (c(1:length (pool)), length(pool))

        g1.perm = pool[resample][1 : s.size.g1]
        g2.perm = pool[resample][(s.size.g1+1) : length(pool)]
        sampl.dist.p[i] = mean (g1.perm) - mean (g2.perm) 
}
p.permute <- (sum (abs (sampl.dist.p) >= abs(obs.diff.p)) + 1)/ (iterations+1)

Permütasyon testinin bildirilen p değeri 0.0053'tür . Tamam, eğer doğru bir şekilde yapmışsam, permütasyonlar ve parametrik ANOVA neredeyse aynı sonuçları verir.

BOOTSTRAP

Her şeyden önce, örnek boyutları çok küçük olduğunda önyüklemenin yardımcı olamayacağını biliyorum. Bu yazı daha da kötü ve yanıltıcı olabileceğini gösterdi . Ayrıca, ikincisi , hipotez testi ana amaç olduğunda permütasyon testinin genellikle bootstrap'tan daha iyi olduğunu vurgulamıştır . Bununla birlikte, bu büyük yazı bilgisayar yoğun yöntemler arasındaki önemli farklılıkları ele almaktadır. Ancak burada farklı bir soru sormak istiyorum (inanıyorum).

Önce en yaygın bootstrap yaklaşımını tanıtayım (Bootstrap1: toplanmış örnek içinde yeniden örnekleme ):

s.size.g1 <- length (g1.lengths)
s.size.g2 <- length (g2.lengths)

pool <- lengths$lengths
obs.diff.b1 <- mean (g1.lengths) - mean (g2.lengths)
iterations <- 10000
sampl.dist.b1 <- NULL

set.seed (5)
for (i in 1 : iterations) {
        resample <- sample (c(1:length (pool)), length(pool), replace = TRUE) 
        # "replace = TRUE" is the only difference between bootstrap and permutations

        g1.perm = pool[resample][1 : s.size.g1]
        g2.perm = pool[resample][(s.size.g1+1) : length(pool)]
        sampl.dist.b1[i] = mean (g1.perm) - mean (g2.perm) 
}
p.boot1 <- (sum (abs (sampl.dist.b1) >= obs.diff.b1) + 1)/ (iterations+1)

Bu şekilde yapılan bootstrap'in P değeri 0.005'tir . Bu makul ve parametrik ANOVA ve permütasyon testi ile neredeyse aynı görünse bile, bu önyüklemede H0'ı sadece sonraki örnekleri aldığımız örnekleri bir araya getirdiğimiz temelinde haklı çıkarmak uygun mudur?

Farklı bilimsel makalelerde bulduğum farklı yaklaşım. Özellikle, araştırmacıların önyükleme öncesinde H0 ile buluşmak için verileri değiştirdiğini gördüm. Etrafa baktığımda , CV'de çok ilginç bir yazı buldum, burada @ jan.s , amacın iki yolu karşılaştırmak olduğu sorudaki bootstrap'ın olağandışı sonuçlarını açıkladı. Ancak bu yazıda, veriler önyüklemeden önce değiştirildiğinde önyüklemenin nasıl gerçekleştirileceği ele alınmaz. Önyükleme öncesinde verilerin değiştirildiği yaklaşım şöyle:

  1. H0, iki grubun ortalamalarının aynı olduğunu belirtir
  2. Bireysel gözlemleri toplanan örneklemin ortalamasından çıkarırsak H0 doğru olur

Bu durumda, verilerin modifikasyonu grupların ortalamalarını ve dolayısıyla farkını etkilemeli, ancak gruplar içindeki (ve gruplar arasındaki) farklılığı etkilememelidir.

  1. Değiştirilmiş veriler, her grupta ayrı ayrı örneklemenin gerçekleştirildiği uyarılarla, daha fazla önyükleme için temel olacaktır .
  2. G1 ve g2'nin bootstrapped ortalaması arasındaki fark hesaplanır ve gruplar arasında gözlenen (değiştirilmemiş) fark ile karşılaştırılır.
  3. Gözlenen değerin yineleme sayısına bölünmesiyle eşit veya daha fazla aşırı değerlerin oranı p değeri verecektir.

Kod (Bootstrap2: H0'ın DOĞRU olduğu modifikasyondan sonra gruplar içinde yeniden örnekleme ):

s.size.g1 <- length (g1.lengths)
s.size.g2 <- length (g2.lengths)

pool <- lengths$lengths
obs.diff.b2 <- mean (g1.lengths) - mean (g2.lengths)

# make H0 to be true (no difference between means of two groups)
H0 <- pool - mean (pool)

# g1 from H0 
g1.H0 <- H0[1:s.size.g1] 

# g2 from H0
g2.H0 <- H0[(s.size.g1+1):length(pool)]

iterations <- 10000
sampl.dist.b2 <- NULL

set.seed (5)
for (i in 1 : iterations) {
        # Sample with replacement in g1
        g1.boot = sample (g1.H0, replace = T)

        # Sample with replacement in g2
        g2.boot = sample (g2.H0, replace = T)

        # bootstrapped difference
        sampl.dist.b2[i] <- mean (g1.boot) - mean (g2.boot)  
}
p.boot2 <- (sum (abs (sampl.dist.b2) >= obs.diff.b2) + 1)/ (iterations+1)

Bu şekilde gerçekleştirilen bootstrap, önceki testlere kıyasla çok farklı olan 0.514 p değeri verecektir . Bunun @ jan.s'nin açıklamasıyla uğraşması gerektiğine inanıyorum , ama anahtarın nerede olduğunu anlayamıyorum ...


1
İlginç bir sorun ve güzel sundu. Önyükleme örneğinin, yalnızca orijinal örneğin popülasyonu çok iyi temsil etmemesi daha olası olduğu için örnek boyutu çok küçük olduğunda sorun yaşar. Önyükleyicinin çalışması için örnek boyutunun çok büyük olması gerekmez. 6 ve 22 örnek boyutlarınız o kadar da kötü olmayabilir. Efron'un bir makalesinde (1983), bootstrap, her bir eğitim örnek boyutunun 10'dan küçük olduğu 2 sınıfla sınıflandırma problemlerinde lineer ayrımcı fonksiyonlar için hata oranlarını tahmin etmek için bir CV formu ile karşılaştırılmıştır. 2007).
Michael R.Chernick

2
Kitabımda ayrıca önyüklemenin başarısız olduğu bir bölüm var ve küçük örnek boyutu sorunu hakkında bir tartışma içeriyor.
Michael R.Chernick

Tek bunu iş yapmak için bootstrap düzeltmeye karışık 2. yaklaşımı gerektiğini çizgisi bu biridir: H0 <- pool - mean (pool). Değiştirilmesi gerekiyor H0 <- c(g1.lengths - mean(g1.lengths), g2.lengths - mean(g2.lengths)). Sonra 0.0023 p değerini alırsınız. (Bu, Zenit'in cevabında açıkladığı şeyle aynı şeydir.) Hepsi bu kadar, koddaki basit bir hata. CC @MichaelChernick
amoeba,

bu yöntemlere güç verilebilir mi? Yani gruplar çok büyük olduğunda HERHANGİ bir farkı önemli bir fark olarak tespit edip edemeyecekleri: havuz> 43k.
Alex Alvarez Pérez

Yanıtlar:


17

İşte Efron's ve Tibshirani'nin Bootstrap'a Giriş (Bölüm 220-224) , bölüm 16'sına dayanarak bu konuya değindim. Kısaca, ikinci bootstrap algoritmanız yanlış uygulanmış, ancak genel fikir doğru.

Bootstrap testleri yapılırken, yeniden örnekleme yönteminin sıfır hipotezine karşılık gelen veriler oluşturduğundan emin olunmalıdır. Bu yayını göstermek için R'deki uyku verilerini kullanacağım. Ders kitabı tarafından önerilen araçların farkından ziyade öğrenci test istatistiğini kullandığımı unutmayın.

T-istatistiğinin örnekleme dağılımı hakkında bilgi elde etmek için analitik bir sonuç kullanan klasik t-testi aşağıdaki sonucu verir:

x <- sleep$extra[sleep$group==1] y <- sleep$extra[sleep$group==2]
t.test(x,y)
t = -1.8608, df = 17.776, p-value = 0.07939

n1n2

# pooled sample, assumes equal variance
pooled <- c(x,y)
for (i in 1:10000){
  sample.index <- sample(c(1:length(pooled)),replace=TRUE)
  sample.x <- pooled[sample.index][1:length(x)]
  sample.y <- pooled[sample.index][-c(1:length(y))]
  boot.t[i] <- t.test(sample.x,sample.y)$statistic
}
p.pooled <-  (1 + sum(abs(boot.t) > abs(t.test(x,y)$statistic))) / (10000+1) 
p.pooled
[1] 0.07929207

'H0'H0'H0z¯

x~ben=xben-x¯+z¯
y~ben=yben-y¯+z¯

x~/y~z¯'H0

# sample from H0 separately, no assumption about equal variance
xt <- x - mean(x) + mean(sleep$extra) #
yt <- y - mean(y) + mean(sleep$extra)

boot.t <- c(1:10000)
for (i in 1:10000){
  sample.x <- sample(xt,replace=TRUE)
  sample.y <- sample(yt,replace=TRUE)
  boot.t[i] <- t.test(sample.x,sample.y)$statistic
}
p.h0 <-  (1 + sum(abs(boot.t) > abs(t.test(x,y)$statistic))) / (10000+1)  # 
p.h0
[1] 0.08049195

Bu sefer üç yaklaşım için benzer p değerleri elde ettik. Bu yardımcı olur umarım!


1
nazik olur ve aşağıdakilere neden '1' eklendiğini açıklar (1 + sum(abs(boot.t) > abs(t.test(x,y)$statistic))) / (10000+1)mısınız: böyle bir şey yerine: mean(abs(boot.t) > abs(t.test(x,y)$statistic))Zaman ayırdığınız için teşekkürler.
TG_Montana

+1. H0'den modele örneklemeden modele yapılan bu önyükleme yaklaşımının belirli bir adı var mı?
amip diyor Reinstate Monica

3
H0pvalue=number of times {t>tobs}BB

@ amoeba: Bu prosedürün resmi veya üzerinde anlaşılmış bir adı olup olmadığından emin değilim, ama dağılımlar yerine araçların eşitliği için bir önyükleme testi olarak tanımlanabilir . Tüm prosedürü gösteren sayfa google kitaplarında eksik , ancak motivasyonu sayfa 223'te görünüyor. Bunun başka bir açıklaması bu notlarda, sayfa 13'te bulunabilir ( galton.uchicago.edu/~eichler/stat24600/Handouts/bootstrap. pdf ).
Zenit

(+1) Mükemmel cevap. "Bu algoritmanın [verileri merkezlemeden yeniden örnekleme] neden x ve y dağılımının aynı olup olmadığını sınama nedenini açıklayabilir misiniz? Bu yeniden örnekleme stratejisinin dağıtımların aynı olmasını sağladığını anlıyorum , ama neden aynı olduklarını test ediyor?
Yarım-pass
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.