Ich möchte eine Hypothese mit einem Bootstrap testen (zwei Beispiel-Student-T-Tests). In Efron und Tibshirani 1993, S. 224, gibt es dafür einen expliziten Code: Subtrahieren Sie für jede Beobachtung den Gruppenmittelwert und addieren Sie den Gesamtmittelwert, wobei der Gesamtmittelwert der Mittelwert der kombinierten Stichproben ist. Sie behaupten, wir sollten Distributionen unter der Nullhypothese booten, und das ist der Grund, warum wir dies tun sollten.
Ich habe jedoch auch gelernt, dass es möglich ist, direkt von den Beispielen zu booten, ohne sie zu ändern. Ich habe beide Methoden ausprobiert: Efrons Schritte (unter Verwendung der Funktion boot_t_F
) und auch ohne die Beobachtungen zu transformieren (unter Verwendung der Funktion boot_t_B
).
Die resultierenden Bootstrap-p-Werte (als Anteil der Bootstrap-Teststatistiken, die die ursprüngliche Teststatistik überschreiten) sollten genau gleich sein, sind es aber nicht.
Warum ist das?
Meine zwei Funktionen sind unten:
boot_t_B<-function(x,y){
print(t.test(x, y, var.equal=TRUE)) #original test statistics
t.est<-abs(t.test(x, y, var.equal=TRUE)$statistic) #Student's t-test
grand_mean<-mean(c(x,y), na.rm=T) #global mean
x1<-x #-mean(x, na.rm=T)+grand_mean it's not subtracted/added here
y1<-y #-mean(y, na.rm=T)+grand_mean
B <- 10000 #number of bootstrap samples
t.vect <- vector(length=B) #vector for bootstrapped t-statistics
for(i in 1:B){
boot.c <- sample(x1, size=length(x), replace=T)
boot.p <- sample(y1, size=length(y), replace=T)
t.vect[i] <- t.test(boot.c, boot.p, var.equal=TRUE)$statistic
}
return(mean(t.vect>t.est)) #bootstrapped p-value
}
boot_t_F<-function(x,y){
print(t.test(x, y, var.equal=TRUE)) #original test statistics
t.est<-abs(t.test(x, y, var.equal=TRUE)$statistic) #Student's t-test
grand_mean<-mean(c(x,y), na.rm=T) #global mean
x1<-x-mean(x, na.rm=T)+grand_mean
y1<-y-mean(y, na.rm=T)+grand_mean
B <- 10000 #number of bootstrap samples
t.vect <- vector(length=B) #vector for bootstrapped test-statistics
for(i in 1:B){
boot.c <- sample(x1, size=length(x), replace=T)
boot.p <- sample(y1, size=length(y), replace=T)
t.vect[i] <- t.test(boot.c, boot.p, var.equal=TRUE)$statistic
}
return(mean(t.vect>t.est)) #bootstrapped p-value
}
set.seed(1678)
boot_t_B(rnorm(25,0,10), rnorm(25,5,10))
[1] 4e-04
set.seed(1678)
boot_t_F(rnorm(25,0,10), rnorm(25,5,10))
[1] 0.0507
Hinweis: Ich habe die (normale) Verteilung der Stichproben zufällig ausgewählt.
boot_t_B
Ihre Argumente sind beidernorm
, aber in Ihrem Anruf aufboot_t_F
sie sindrunif
undrexp
.