Zwei Methoden zur Verwendung von Bootstraping zum Testen des Unterschieds zwischen zwei Beispielmitteln

8

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.

Lil'Lobster
quelle
Beachten Sie, dass in Ihrem Anruf auf boot_t_BIhre Argumente sind beide rnorm, aber in Ihrem Anruf auf boot_t_Fsie sind runifund rexp.
Jbowman
@jbowman :) großer Tippfehler bei der Erstellung dieser Frage hier ... diese Ergebnisse 0.0507 und 4e-04 sind, wenn ich boot_t_F und boot_t_B für diese 'normalen' Samples verwende
Lil'Lobster
Habe den Text ein wenig angepasst, hoffe ich habe den Sinn behalten.
Conjugateprior
@conjugateprior Es bleibt erhalten :) Vielleicht sollte ich auch folgendes hinzufügen: 'Warum Bootstrapping-Nullhypothese und Bootstrapping-Daten direkt widersprüchliche Ergebnisse im Kontext von p-Werten liefern'.
Lil'Lobster

Antworten:

4

Das Problem ist, dass Ihr Bootstrap boot_t_Bnicht 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:

boot.c <- sample(c(x1,y1), size=length(x), replace=T)
boot.p <- sample(c(x1,y1), size=length(y), replace=T)

Der Grund dafür ist, dass, wenn die Mittelwerte in Ihrer ursprünglichen Formulierung unterschiedlich sind boot.cund boot.ptatsä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:

> set.seed(1678)
> boot_t_B(rnorm(25,0,10), rnorm(25,5,10))
[1] 0.05
> set.seed(1678)
> boot_t_F(rnorm(25,0,10), rnorm(25,5,10))
[1] 0.0507
Jbowman
quelle
1

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.

perm_test <- function(x, y) {

  B <- 10000
  nx <- length(x)
  ny <- length(y)
  N <- nx+ny
  xy <- c(x, y)
  orig <- mean(x) - mean(y)
  res <- numeric(B)

  for (i in 1:B) {
    idx <- sample(N, nx)
    tmpx <- xy[idx]
    tmpy <- xy[-idx]
    res[i] <- mean(tmpx) - mean(tmpy)
  }

  mean(orig > res)

}

Das Ergebnis ähnelt dem "richtigen" Bootstrap oder wird wie von @jbowman vorgeschlagen verwendet :

> set.seed(1678)
> perm_test(rnorm(25,0,10), rnorm(25,5,10))
[1] 0.051
Tim
quelle