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.
quelle
boot_t_B
Ihre Argumente sind beidernorm
, aber in Ihrem Anruf aufboot_t_F
sie sindrunif
undrexp
.Antworten:
Das Problem ist, dass Ihr Bootstrap
boot_t_B
nicht korrekt ausgeführt wird. Wenn Sie nicht korrigieren, dass die Mittelwerte gleich sind (dh die Nullhypothese durch erneutes Zentrieren jeder Stichprobe als wahr erzwingen), erzwingen Sie, dass die Nullhypothese durch Stichproben aus den beiden kombinierten Stichproben wahr ist:Der Grund dafür ist, dass, wenn die Mittelwerte in Ihrer ursprünglichen Formulierung unterschiedlich sind
boot.c
undboot.p
tatsächlich Beispiele aus der alternativen Hypothese sind, bei der die alternativen Verteilungen auf die Daten "zentriert" sind. Sie können sich das als Bootstrap-Sampling aus der alternativen Verteilung vorstellen, die höchstwahrscheinlich den Daten entspricht. Nur Sie sind nichtparametrisch, anstatt einen parametrischen Bootstrap zu verwenden. Folglich erhalten Sie keine p-Werte, die natürlich unter der Annahme der Nullhypothese berechnet werden.Wenn Sie es so machen, erhalten Sie:
quelle
Hinzufügen zu @jbowmans Antwort, um eine bessere Vorstellung von der Bootstrap-Prozedur für zu erhaltent -Test Sie können sich einen Permutationstest vorstellen, den Sie in dieser Situation verwenden würden (siehe z. B. eines der Bücher zur Einführung in die Statistik durch Resampling-Methoden von Phillip I. Good oder andere Bücher zu diesem Thema dieses Autors). Für die Durchführung eines Permutationstests würden wir annehmen, dass bei einer Nullverteilung alle Werte zufällig zwischen den Gruppen neu verteilt werden, sodass das Permutationsverfahren darin besteht, Gruppenbezeichnungen zufällig neu zuzuweisen. Sie müssen Proben aus der Rumpfverteilung entnehmen. Dies kann durch Neuzuweisung von Gruppenbezeichnungen oder durch Subtrahieren von Gruppenmitteln erreicht werden, wie von Efron und Tibshirani vorgeschlagen.
Das Ergebnis ähnelt dem "richtigen" Bootstrap oder wird wie von @jbowman vorgeschlagen verwendet :
quelle