İ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:
- H0, iki grubun ortalamalarının aynı olduğunu belirtir
- 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.
- Değiştirilmiş veriler, her grupta ayrı ayrı örneklemenin gerçekleştirildiği uyarılarla, daha fazla önyükleme için temel olacaktır .
- 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.
- 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 ...
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