R ile önyükleme kullanarak p-değerini hesaplama


28

Yaklaşık 2 taraflı bootstrapped p değerini hesaplamak için "boot" paketini kullanıyorum, ancak sonuç t.test kullanmanın p değerinden çok uzak. R kodumda ne yanlış yaptığımı çözemiyorum. Birisi lütfen bana bunun için bir ipucu verebilir

time = c(14,18,11,13,18,17,21,9,16,17,14,15,
         12,12,14,13,6,18,14,16,10,7,15,10)
group=c(rep(1:2, each=12))
sleep = data.frame(time, group)

require(boot)
diff = function(d1,i){
    d = d1[i,]
    Mean= tapply(X=d$time, INDEX=d$group, mean)
    Diff = Mean[1]-Mean[2]
    Diff
}

set.seed(1234)
b3 = boot(data = sleep, statistic = diff, R = 5000, strata=sleep$group)

pvalue = mean(abs(b3$t) > abs(b3$t0))
pvalue 

2 taraflı önyükleme p değeri (pvalue) = 0.4804, ancak t.test'in 2 taraflı p değeri 0.04342'dir. Her iki p değeri de 11 kat civarında bir fark var. Bu nasıl olabilir?


b3 $ t0 nasıl geliyor?
Xi'an

1
bu bir colname!
Elvis

2
Yanlış bir değeri hesaplıyorsunuz . Belgelendirme, t 0'ın , gösterimin önerdiği gibi sıfır dağılımının değil gözlenen istatistik olduğunu söylüyor . Boşluğun altındaki örnekleme dağılımının bir tahminini bulmanız gerekiyor. Daha fazla bilgi için cevabımı gör. Düzeltilmiş bir önyargı testi için deneyin . pt0mean(abs(b3$t0) < abs(b3$t-mean(b3$t)))
AdamO

Yanıtlar:


31

Gözlemlenen verilerin ampirik dağılımı altında veri üretmek için önyükleme kullanıyorsunuz. Bu, iki araç arasındaki farka güven aralığı vermek için yararlı olabilir:

> quantile(b3$t,c(0.025,0.975))
     2.5%     97.5% 
0.4166667 5.5833333 

Bir almak için -değeri, null hipotezi altında permütasyon üretmek gerekir. Bu, örneğin şöyle yapılabilir:p

diff2 = function(d1,i){
    d = d1; 
    d$group <- d$group[i];  # randomly re-assign groups
    Mean= tapply(X=d$time, INDEX=d$group, mean)
    Diff = Mean[1]-Mean[2]
    Diff
}

> set.seed(1234)
> b4 = boot(data = sleep, statistic = diff2, R = 5000)
> mean(abs(b4$t) > abs(b4$t0))
[1] 0.046

Bu çözümde, grupların büyüklüğü sabit değildir, ilk gruptaki önyükleme işlemini yaparak bir gruba rastgele bir grup atarsınız. Bana göre yasal görünüyor, ancak daha klasik bir çözüm, her grubun birey sayısını sabitlemektir, bu nedenle önyükleme yerine gruplara izin verirsiniz (bu genellikle grup boyutlarının önceden sabitlendiği deneyin tasarımıyla motive olur. ):

> R <- 10000; d <- sleep
> b5 <- numeric(R); for(i in 1:R) { 
+    d$group <- sample(d$group, length(d$group)); 
+    b5[i] <- mean(d$time[d$group==1])-mean(d$time[d$group==2]); 
+ }
> mean(abs(b5) > 3)
[1] 0.0372

5
Bu teknik olarak bir önyükleme p değeri değil, permütasyon testidir.
AdamO

@AdamO Bu cevapta sunulanın permütasyon testi (ve biraz değiştirilmiş varyantı) olduğuna katılıyorum; Bunun nedeni yeniden örnekleme sırasında grupların toplanmış olmasıdır. Buna karşılık, önyükleme tabanlı bir testte, her bir grubun değerleri yalnızca aynı gruba ait veriler kullanılarak örneklenmelidir. İşte nasıl yapılacağını açıklayan bir cevap: stats.stackexchange.com/a/187630/28666 .
amip, Reinstate Monica’nın

@ amoeba Bağlandığınız cevabın aynı zamanda sadece yeniden örneklemeyi içerdiği sürece önyükleme ile ilgili bir permütasyon testi olduğunu düşünüyorum. Rapor etmek gayet iyi, ancak raporlamak için kullanılan iki yöntem var. Parametrik olmayan bir önyükleme, teknik olarak boş bir hipotez altında veri üretemez. P-değerlerinin önyükleme dağılımından nasıl üretildiğinin bir kısmı için cevabımı görün .
AdamO

@AdamO Bir terminoloji meselesi sanırım, ancak bağlantılı cevabında açıklanan prosedürün "permütasyon" testi olarak nasıl adlandırılabileceğini göremiyorum çünkü orada hiçbir şeye izin verilmiyor: her grup için yeniden örneklenen değerler oradaki veriler kullanılarak üretiliyor sadece grup.
amip, Reinstate Monica’nın

1
Elvis, cevabındaki ilk kod parçasının da permütasyon testi olduğunu düşünüyorum. Yeniden örneklediğinizde, grupları bir araya getirirsiniz! Permütasyon testini tanımlayan budur.
amip diyor Reinstate Monica,

25

Elvis'in cevabı permütasyonlara dayanıyor ama bence orijinal önyükleme yaklaşımında neyin yanlış olduğunu netleştirmiyor. Sadece önyükleme tabanlı bir çözümü tartışmama izin verin.

Orijinal simülasyonunuzun en önemli sorunu, önyüklemenin her zaman size test istatistiklerinin DOĞRU dağılımını sağlamasıdır. Bununla birlikte, p-değerini hesaplarken, test istatistiğinin elde edilen değerini H0 altında ALTIN, yani gerçek dağılımla karşılaştırmak zorunda değilsiniz!

[Açıklığa kavuşturalım. Örneğin, klasik t-testinin T test istatistiğinin H0 altında klasik "merkezi" t-dağılımına ve genel olarak merkez dışı bir dağılıma sahip olduğu bilinmektedir. Bununla birlikte, herkes, T'nin gözlenen değerinin klasik "merkezi" t-dağılımıyla karşılaştırıldığı gerçeğine aşinadır; yani, biri T ile karşılaştırmayı yapmak için gerçek [cenaze dışı] t-dağılımını elde etmeye çalışmaz.

P-değeri 0.4804 çok büyüktür, çünkü test istatistiği Ortalama [1] -Mean [2] 'nin gözlemlenen değeri "t0" değeri bootstrapped numunenin "t" ortasına çok yakındır. Doğaldır ve tipik olarak her zaman böyledir [yani H0'in geçerliliğinden bağımsız olarak], çünkü bootstrapped örnek "t", Ortalama [1] -Mean [2] 'nin ACTUAL dağılımına öykünür. Ancak, yukarıda belirtildiği gibi [ve ayrıca Elvis], gerçekte ihtiyacınız olan şey Ortalama [1] -Mean [2] H0 ALTINDA dağıtımıdır. Açıktır ki

1) H0 altında, Ortalama [1] -Mean [2] 'nin dağılımı 0 civarında olacak.

2) şekli H0'ın geçerliliğine bağlı değildir.

Bu iki nokta, Ortalama [1] -Mean [2] 'nin H0 altında dağılımının, önyüklenen "t" numunesi tarafından SHIFTED 0 ile ortalanacak şekilde taklit edilebileceği anlamına gelir.

b3.under.H0 <- b3$t - mean(b3$t)

ve karşılık gelen p değeri:

mean(abs(b3.under.H0) > abs(b3$t0))

Bu size 0.0232 "çok güzel" bir değer verir. :-)

Yukarıda belirtilen "2)" noktasının test istatistiklerinin "çeviri eşdeğeri" olarak adlandırıldığını ve genel olarak tutmak zorunda olmadıklarını not edeyim! Bazı test istatistikleri için, önyüklenen "t" önyüklemesinin kaydırılması size, HO altındaki test istatistiklerinin dağılımının geçerli bir tahminini vermez. Bu tartışmaya ve özellikle de P. Dalgaard'ın cevabına bir göz atın: http://tolstoy.newcastle.edu.au/R/e6/help/09/04/11096.html

Test probleminiz, test istatistiğinin mükemmel bir simetrik dağılımını sağlar, ancak test istatistiğinin eğrilmiş önyükleme dağılımı durumunda İKİ TARAFLI p değerleri elde etmede bazı sorunlar olduğunu unutmayın. Yine yukarıdaki bağlantıyı okuyun.

[Ve nihayet, sizin durumunuzdaki "saf" permütasyon testini kullanırdım; yani Elvis'in ikinci yarısı cevaplıyor. :-)]


17

Önyükleme CI'lerini ve p değerlerini hesaplamanın çok sayıda yolu vardır. Asıl mesele bootstrap'ın boş bir hipotez altında veri üretmesinin imkansız olmasıdır. Permütasyon testi, buna dayanarak uygulanabilir bir örneklemedir. Uygun bir önyükleme kullanmak için, test istatistiklerinin örnekleme dağılımı hakkında bazı varsayımlarda bulunmalısınız.

Testin değişmezliğinin eksikliği ile ilgili bir yorum: tamamen boş olanlar için% 95 CI bulmak mümkün ancak tam tersi ap> 0.05 veya tam tersi. Daha iyi bir anlaşmaya varmak için, boştaki altındaki önyükleme örneklerinin hesaplanması aşağıdaki gibi yapılmalıdır .β0*=β^-β^* ziyade β0*=β^*-β^. Diğer bir deyişle, yoğunluk bootstrap örneğinde sağa eğik ise, yoğunluğun boşta bırakılmış olması gerekir. Bunun gibi analitik olmayan (örn. Yeniden örnekleme) solüsyonlarla CI'lerin testlerini tersine çevirmek gerçekten mümkün değildir.

normal önyükleme

Bir yaklaşım normal bir önyüklemedir Eğer, önyükleme dağılımın ortalama ve standart sapma almak orijinal önyükleme numunede tahmin noktasında sıfır dağılımı normal yüzdelik dağılımı değişen ve kullanılarak boş altında örnekleme dağılımını hesaplar . Bu, önyükleme dağılımı normal olduğunda makul bir yaklaşımdır, görsel muayene burada genellikle yeterlidir. Bu yaklaşımı kullanan sonuçlar genellikle, heteroseksensellik ve / veya sonlu örnek varyans varsayımlarına karşı dayanıklı olan sağlam veya sandviç esaslı hata tahminine çok yakındır. Normal bir test istatistiğinin varsayımı, tartışacağım bir sonraki bootstrap testindeki varsayımların daha güçlü bir durumudur.

yüzdelik önyükleme

Diğer bir yaklaşım, yüzde önyüklemesinden bahsettiğimizde çoğumuzun düşündüğümüzü düşündüğü yüzdelik önyüklemedir. Burada, parametrenin bootstrapped dağılımı, alternatif hipotez altında numunenin ampirik bir dağılımını tahmin eder. Bu dağılım normal olmayabilir. % 95 CI, ampirik miktarları alarak kolayca hesaplanır. Ancak önemli bir varsayım, böyle bir dağılımın çok önemli olduğudur . Bunun anlamı, eğer temel parametre değişirse, dağılımın şekli sadece bir sabit tarafından kaydırılır ve ölçeğin mutlaka değişmesi gerekmez. Bu güçlü bir varsayım! Eğer böyle olursa, "boş hipotez altında istatistiğin dağılımı" nı (DSNH veyaF0*) bootstrap dağılımını tahminlerden çıkararak, ardından DSNH’nin yüzde kaçının tahmininizden daha "aşırı" olduğunu hesaplayarak 2xmin(F0*(β^),1-F0*(β^))

Studentized önyükleme

Hesaplamak için en kolay önyükleme çözümü pdeğerleri bir öğrenci bootstrap kullanmaktır. Her önyükleme yinelemesinde, istatistiği ve standart hatasını hesaplayın ve öğrencinin istatistiğini döndürün. Bu, cis ve p değerlerini çok kolay hesaplamak için kullanılabilecek hipotez için önyüklenmiş bir öğrenci dağılımı sağlar. Bu aynı zamanda önyargılı düzeltmeli hızlandırılmış önyüklemenin arkasındaki sezginin de altını çiziyor. T-dağılımı sıfırın altında daha kolay kayar, çünkü dıştaki sonuçlar karşılık gelen yüksek değişkenlikleriyle düşük ağırlıklı olur.

Programlama örneği

Örnek olarak, cityverileri bootstrap paketinde kullanacağım . Önyükleme güven aralıkları bu kodla hesaplanır:

ratio <- function(d, w) sum(d$x * w)/sum(d$u * w)
city.boot <- boot(city, ratio, R = 999, stype = "w", sim = "ordinary")
boot.ci(city.boot, conf = c(0.90, 0.95),
        type = c("norm", "basic", "perc", "bca"))

ve bu çıktıyı üretmek:

BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
Based on 999 bootstrap replicates

CALL : 
boot.ci(boot.out = city.boot, conf = c(0.9, 0.95), type = c("norm", 
    "basic", "perc", "bca"))

Intervals : 
Level      Normal              Basic         
90%   ( 1.111,  1.837 )   ( 1.030,  1.750 )   
95%   ( 1.042,  1.906 )   ( 0.895,  1.790 )  

Level     Percentile            BCa          
90%   ( 1.291,  2.011 )   ( 1.292,  2.023 )   
95%   ( 1.251,  2.146 )   ( 1.255,  2.155 )  
Calculations and Intervals on Original Scale

Normal önyükleme için% 95 CI hesaplanarak elde edilir:

with(city.boot, 2*t0 - mean(t) + qnorm(c(0.025, 0.975)) %o% sqrt(var(t)[1,1]))

Böylece p değeri elde edilir:

> with(city.boot, pnorm(abs((2*t0 - mean(t) - 1) / sqrt(var(t)[1,1])), lower.tail=F)*2)
[1] 0.0315

Hangi% 95 normal CI'nin 1 değerinin boş değer içermediğini kabul eder.

Yüzde CI elde edilir (bağlanma metotlarına bağlı olarak bazı farklılıklarla):

quantile(city.boot$t, c(0.025, 0.975))

Ve yüzdelik önyükleme için p değeri:

cvs <- quantile(city.boot$t0 - city.boot$t + 1, c(0.025, 0.975))
mean(city.boot$t > cvs[1] & city.boot$t < cvs[2])

Gives a p of 0.035 which also agrees with the confidence interval in terms of the exclusion of 1 from the value. We cannot in general observe that, while the width of the percentile CI is nearly as wide as the normal CI and that the percentile CI is further from the null that the percentile CI should provide lower p-values. This is because the shape of the sampling distribution underlying the CI for the percentile method is non-normal.


It's a very interesting answer @AdamO, but could you provide with some examples? On R, you can use function boot.ci and use argument "type" to choose a studentized CI (you can also choose a BCA CI). However, how can you calculate p-values? Are you using the estimate or the test statistic? I had a similar question which reply would be greatly appreciated.
Kevin Zarca

1
+1 for clear explanation of the benefits of the studentized bootstrap.
eric_kernfeld

@KevinOunet I gave two examples of replicating p-values from CIs in the boot package. Does this help?
AdamO

1
Thank you @AdamO, that helps indeed! Could you provide a last example for studentized bootstrap?
Kevin Zarca
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.