Warum lehnen Hypothesentests für neu abgetastete Datensätze die Null zu oft ab?

10

tl; dr: Ausgehend von einem unter Null generierten Datensatz habe ich Fälle mit Ersetzung neu abgetastet und einen Hypothesentest für jeden neu abgetasteten Datensatz durchgeführt. Diese Hypothesentests lehnen die Null in mehr als 5% der Fälle ab.

In der folgenden sehr einfachen Simulation generiere ich Datensätze mit und passe jedem ein einfaches OLS-Modell an. Dann generiere ich für jeden Datensatz 1000 neue Datensätze, indem ich Zeilen des ursprünglichen Datensatzes mit Ersetzung neu abtastet (ein Algorithmus, der speziell in Davison & Hinkleys klassischem Text als für die lineare Regression geeignet beschrieben wird). Für jedes davon passe ich das gleiche OLS-Modell an. Letztendlich lehnen etwa 16% der Hypothesentests in den Bootstrap-Beispielen die Null ab , während wir 5% erhalten sollten (wie in den ursprünglichen Datensätzen).XN(0,1)⨿YN(0,1)

Ich vermutete, dass dies etwas mit wiederholten Beobachtungen zu tun hat, die überhöhte Assoziationen verursachen. Zum Vergleich habe ich im folgenden Code zwei andere Ansätze ausprobiert (auskommentiert). In Methode 2 repariere ich und ersetze durch neu abgetastete Residuen aus dem OLS-Modell im Originaldatensatz. In Methode 3 zeichne ich eine zufällige Teilstichprobe ohne Ersatz. Beide Alternativen funktionieren, dh ihre Hypothesentests lehnen die Null in 5% der Fälle ab.Y.XY

Meine Frage: Habe ich Recht, dass wiederholte Beobachtungen der Schuldige sind? Wenn ja, da dies ein Standardansatz für das Bootstrapping ist, wo genau verletzen wir dann die Standard-Bootstrap-Theorie?

Update Nr. 1: Weitere Simulationen

Ich habe versucht , ein noch einfacheres Szenario, ein Intercept-only Regressionsmodell für . Das gleiche Problem tritt auf.Y

# note: simulation takes 5-10 min on my laptop; can reduce boot.reps
#  and n.sims.run if wanted
# set the number of cores: can change this to match your machine
library(doParallel)
registerDoParallel(cores=8)
boot.reps = 1000
n.sims.run = 1000

for ( j in 1:n.sims.run ) {

  # make initial dataset from which to bootstrap
  # generate under null
  d = data.frame( X1 = rnorm( n = 1000 ), Y1 = rnorm( n = 1000 ) )

  # fit OLS to original data
  mod.orig = lm( Y1 ~ X1, data = d )
  bhat = coef( mod.orig )[["X1"]]
  se = coef(summary(mod.orig))["X1",2]
  rej = coef(summary(mod.orig))["X1",4] < 0.05

  # run all bootstrap iterates
  parallel.time = system.time( {
    r = foreach( icount( boot.reps ), .combine=rbind ) %dopar% {

      # Algorithm 6.2: Resample entire cases - FAILS
      # residuals of this model are repeated, so not normal?
      ids = sample( 1:nrow(d), replace=TRUE )
      b = d[ ids, ]

      # # Method 2: Resample just the residuals themselves - WORKS
      # b = data.frame( X1 = d$X1, Y1 = sample(mod.orig$residuals, replace = TRUE) )

      # # Method 3: Subsampling without replacement - WORKS
      # ids = sample( 1:nrow(d), size = 500, replace=FALSE )
      # b = d[ ids, ]

      # save stats from bootstrap sample
      mod = lm( Y1 ~ X1, data = b ) 
      data.frame( bhat = coef( mod )[["X1"]],
                  se = coef(summary(mod))["X1",2],
                  rej = coef(summary(mod))["X1",4] < 0.05 )

    }
  } )[3]


  ###### Results for This Simulation Rep #####
  r = data.frame(r)
  names(r) = c( "bhat.bt", "se.bt", "rej.bt" )

  # return results of each bootstrap iterate
  new.rows = data.frame( bt.iterate = 1:boot.reps,
                         bhat.bt = r$bhat.bt,
                         se.bt = r$se.bt,
                         rej.bt = r$rej.bt )
  # along with results from original sample
  new.rows$bhat = bhat
  new.rows$se = se
  new.rows$rej = rej

  # add row to output file
  if ( j == 1 ) res = new.rows
  else res = rbind( res, new.rows )
  # res should have boot.reps rows per "j" in the for-loop

  # simulation rep counter
  d$sim.rep = j

}  # end loop over j simulation reps



##### Analyze results #####

# dataset with only one row per simulation
s = res[ res$bt.iterate == 1, ]

# prob of rejecting within each resample
# should be 0.05
mean(res$rej.bt); mean(s$rej)

Update Nr. 2: Die Antwort

In den Kommentaren und Antworten wurden mehrere Möglichkeiten vorgeschlagen, und ich habe mehr Simulationen durchgeführt, um sie empirisch zu testen. Es stellt sich heraus, dass JWalker richtig ist, dass das Problem darin besteht, dass wir die Bootstrap-Statistiken nach der Schätzung der Originaldaten zentrieren mussten, um die korrekte Stichprobenverteilung unter . Ich denke jedoch auch, dass Whubers Kommentar zur Verletzung der parametrischen Testannahmen ebenfalls richtig ist, obwohl wir in diesem Fall tatsächlich nominelle Fehlalarme erhalten, wenn wir das Problem von JWalker beheben.H0

halber Durchgang
quelle
1
Im Standard-Bootstrap würden Sie nur die Bootstrap-Verteilung des Koeffizienten von X1 berücksichtigen, nicht die zugehörigen p-Werte. Somit ist es kein Problem des Bootstraps. Trotzdem ist Ihre Beobachtung interessant und nicht intuitiv.
Michael M
1
@ MichaelM, das stimmt. Da jedoch die gemeinsame CDF der Daten in den Resamples in n konvergieren sollte und die Anzahl der Bootstraps zu der wahren CDF iteriert, die die Originaldaten generiert hat, würde ich auch nicht erwarten, dass sich die p-Werte unterscheiden.
Halb passieren
Recht. Ich bin mir ziemlich sicher, dass der Effekt darauf zurückzuführen ist, dass Beobachtungen (wie Sie sagten) nicht unabhängig sind und zu optimistische Standardfehler ergeben. In Ihrer Simulation scheint dies die einzige verletzte Annahme des normalen linearen Modells zu sein. Vielleicht können wir sogar den entsprechenden Varianzdeflationsfaktor ableiten.
Michael M
2
Eine Sache, die in Methode 1 klar ist, ist die Verletzung der iid-Fehlerannahme: Beim erneuten Abtasten mit Ersetzen sind die Residuen für einen gegebenen Wert perfekt korreliert und nicht unabhängig! Sie booten also nicht richtig, das ist alles. Als Demonstration, ersetzen Sie sie nach dem Rechnen durch , gehen Sie aber genauso vor wie zuvor. Dadurch werden die Duplikate korrekt behandelt (obwohl eine kleinere Stichprobe erstellt wird). Sie erhalten eine gleichmäßige Verteilung der p-Werte. xidsids <- unique(ids)
whuber
2
@whuber. Aha. Und das würde erklären, warum das Resampling von Residuen mit Ersatz trotz wiederholter Beobachtungen funktioniert: Die Residuen dieses Modells sind wieder unabhängig von X. Wenn Sie dies zu einer Antwort machen möchten, würde ich dies gerne akzeptieren.
Halb passieren

Antworten:

5

Wenn Sie die Null erneut abtasten, ist der erwartete Wert des Regressionskoeffizienten Null. Wenn Sie einen beobachteten Datensatz erneut abtasten, ist der erwartete Wert der beobachtete Koeffizient für diese Daten. Es ist kein Fehler vom Typ I, wenn P <= 0,05 ist, wenn Sie die beobachteten Daten erneut abtasten. Tatsächlich handelt es sich um einen Fehler vom Typ II, wenn Sie P> 0,05 haben.

Sie können sich ein Bild machen, indem Sie die Korrelation zwischen abs (b) und dem Mittelwert (P) berechnen. Hier ist ein einfacher Code, mit dem Sie replizieren können, was Sie getan haben, und die Korrelation zwischen b und dem Fehler "Typ I" über den Satz von Simulationen berechnen können

boot.reps = 1000
n.sims.run = 10
n <- 1000
b <- matrix(NA, nrow=boot.reps, ncol=n.sims.run)
p <- matrix(NA, nrow=boot.reps, ncol=n.sims.run)
for(sim_j in 1:n.sims.run){
  x <- rnorm(n)
  y <- rnorm(n)
  inc <- 1:n
  for(boot_i in 1:boot.reps){
    fit <- lm(y[inc] ~ x[inc])
    b[boot_i, sim_j] <- abs(coefficients(summary(fit))['x[inc]', 'Estimate'])
    p[boot_i, sim_j] <- coefficients(summary(fit))['x[inc]', 'Pr(>|t|)']
    inc <- sample(1:n, replace=TRUE)
  }
}
# note this is not really a type I error but whatever
type1 <- apply(p, 2, function(x) sum(x <= 0.05))/boot.reps
# correlation between b and "type I"
cor(b[1, ], type1)

Aktualisieren Sie die Antwort von grand_chat ist nicht der Grund, warum die Häufigkeit von P <= 0,05> 0,05 ist. Die Antwort ist sehr einfach und was ich oben gesagt habe - der erwartete Wert des Mittelwerts jedes Resamples ist der ursprüngliche, beobachtete Mittelwert. Dies ist die gesamte Basis des Bootstraps, der entwickelt wurde, um Standardfehler / Konfidenzgrenzen für einen beobachteten Mittelwert und nicht als Hypothesentest zu generieren. Da die Erwartung nicht Null ist, ist der "Typ I-Fehler" natürlich größer als Alpha. Und deshalb wird es eine Korrelation zwischen der Größe des Koeffizienten (wie weit von Null entfernt) und der Größe der Abweichung des "Typ I-Fehlers" von Alpha geben.

JWalker
quelle
Mmmmm. Wir sollten also die Hypothesentests mit , nicht mit dem ursprünglichen . Das macht Sinn und steht im Einklang mit der vorhandenen Literatur. Ich muss das versuchen. H 0 : β = 0H0:β=β^H0:β=0
Halb passieren
H0:β=βˆ testet auf Äquivalenz und erfordert einen anderen Ansatz für das Studiendesign. wird verwendet, wenn es wichtig ist, sicherzustellen, dass Ihre beobachteten Unterschiede kein Zufall sind. Äquivalenz, wenn Sie sicherstellen möchten, dass Ihre Vorhersage richtig ist. Leider wird es oft als Einheitsgröße angesehen, aber es hängt von den Risiken in Ihrer Situation ab. Es ist typisch, in der frühen Forschungsphase zu verwenden, um Egel herauszufiltern, wenn Sie nicht genug wissen, um eine alternative Hypothese zu definieren. Wenn mehr bekannt ist, kann es sinnvoll sein, auf die Prüfung der Richtigkeit Ihres Wissens umzusteigen. H0:β=0H0:β=0
ReneBt
2

Wenn Sie ein Beispiel mit einem Ersatz aus Ihrem ursprünglichen normalen Beispiel verwenden, ist das resultierende Bootstrap-Beispiel nicht normal . Die gemeinsame Verteilung der Bootstrap-Stichprobe folgt einer knorrigen Mischungsverteilung, die sehr wahrscheinlich doppelte Datensätze enthält, während doppelte Werte die Wahrscheinlichkeit Null haben, wenn Sie iid-Stichproben aus einer Normalverteilung entnehmen.

Wenn Ihre ursprüngliche Stichprobe beispielsweise zwei Beobachtungen aus einer univariaten Normalverteilung enthält, besteht eine Bootstrap-Stichprobe mit Ersetzung zur Hälfte aus der ursprünglichen Stichprobe und zur Hälfte aus einem der ursprünglichen Werte, die dupliziert wurden. Es ist klar, dass die Stichprobenvarianz des Bootstrap-Beispiels im Durchschnitt geringer ist als die des Originals - tatsächlich ist es die Hälfte des Originals.

Die Hauptfolge ist, dass die Schlussfolgerung, die Sie basierend auf der normalen Theorie machen, die falschen Werte zurückgibt, wenn sie auf das Bootstrap-Beispiel angewendet wird. Insbesondere liefert die normale Theorie antikonservative Entscheidungsregeln, da Ihre Bootstrap-Stichprobe aufgrund des Vorhandenseins von Duplikaten Statistiken erzeugt, deren Nenner kleiner sind als nach der normalen Theorie zu erwarten wäre. Infolgedessen lehnt der normale theoretische Hypothesentest die Nullhypothese mehr als erwartet ab.pt

grand_chat
quelle
Aber wenn dies der Fall ist, hätten wir dann nicht genau das gleiche Problem, wenn wir Residuen mit Ersatz neu abtasten? Tatsächlich lehnt dieser Ansatz jedoch mit nominaler Wahrscheinlichkeit ab.
Half-Pass
Auch ein t-Test mit n = 1000 sollte kein Problem mit nicht normalen Daten haben.
Halb passieren
0

Ich stimme der Antwort von @ JWalker voll und ganz zu.

Es gibt noch einen weiteren Aspekt dieses Problems. Das ist in Ihrem Resampling-Prozess. Sie erwarten, dass der Regressionskoeffizient um Null zentriert ist, da Sie davon ausgehen Xund Yunabhängig sind. Bei Ihrem Resampling tun Sie dies jedoch

ids = sample( 1:nrow(d), replace=TRUE )
  b = d[ ids, ]

Das schafft Korrelation, weil Sie abtasten Xund Yzusammen. Angenommen , die erste Zeile des Datensatzes dlautet (x1, y1): Im neu abgetasteten Datensatz folgt P(Y = y1|X = x1) = 1, wenn Xund Yunabhängig sind, P(Y|X = x1)eine Normalverteilung.

Eine andere Möglichkeit, dies zu beheben, ist die Verwendung

b = data.frame( X1 = rnorm( n = 1000 ), Y1 = rnorm( n = 1000 ) )

Der gleiche Code, den Sie zum Generieren verwenden d, um X und Y unabhängig voneinander zu machen.

Der gleiche Grund erklärt, warum es mit Residual Resampling funktioniert (weil Xes unabhängig vom neuen ist Y).

Tianxia Zhou
quelle
Für eine Weile dachte ich auch, dass die neu abgetasteten Beobachtungen möglicherweise nicht unabhängig sind, aber wenn ich viel mehr darüber nachdenke, denke ich eigentlich nicht, dass dies der Fall ist: stats.stackexchange.com/questions/339237/…
half -pass
Das Problem, das ich oben beschreibe, unterscheidet sich von Ihrem Beitrag. Was Sie angesprochen haben, ist die Unabhängigkeit von x's. Was ich erwähnt habe, ist die Korrelation zwischen Xs und Ys.
Tianxia Zhou
-1

Das größte Problem hierbei ist, dass die Modellergebnisse falsch und daher sehr instabil sind, da das Modell nur dem Rauschen entspricht. Im wahrsten Sinne des Wortes. Y1 ist keine abhängige Variable, da die Probendaten generiert wurden.


Bearbeiten Sie als Antwort auf die Kommentare. Lassen Sie mich noch einmal versuchen, mein Denken zu erklären.

Bei einem OLS besteht die allgemeine Absicht darin, die zugrunde liegenden Beziehungen in den Daten zu ermitteln und zu quantifizieren. Bei realen Daten kennen wir diese normalerweise nicht genau.

Dies ist jedoch eine künstliche Testsituation. Wir kennen den EXACT-Datengenerierungsmechanismus, der genau dort im Code des OP steht

X1 = rnorm (n = 1000), Y1 = rnorm (n = 1000)

Wenn wir das in der bekannten Form einer OLS-Regression ausdrücken, dh

Y1 = Achsenabschnitt + Beta1 * X1 + Fehler
, der zu
Y1 = Mittelwert (X1) + 0 (X1) + Fehler wird

In meinen Augen ist dies ein Modell, das in linearer FORM ausgedrückt wird, aber es ist eigentlich KEINE lineare Beziehung / Modell, da es keine Steigung gibt. Beta1 = 0,000000.

Wenn wir die 1000 zufälligen Datenpunkte erzeugen, sieht das Streudiagramm wie das klassische kreisförmige Schrotflintenspray aus. Es könnte eine gewisse Korrelation zwischen X1 und Y1 in der spezifischen Stichprobe von 1000 zufälligen Punkten geben, die generiert wurden, aber wenn ja, ist dies ein zufälliger Zufall. Wenn der OLS eine Korrelation findet, dh die Nullhypothese ablehnt, dass es keine Steigung gibt, da wir definitiv wissen, dass es wirklich keine Beziehung zwischen diesen beiden Variablen gibt, hat der OLS buchstäblich ein Muster in der Fehlerkomponente gefunden. Ich charakterisierte das als "passend zum Geräusch" und "falsch".

Darüber hinaus ist eine der Standardannahmen / -anforderungen eines OLS, dass (+/-) "das lineare Regressionsmodell" linear in Parametern "ist. Angesichts der Daten gehe ich davon aus, dass wir diese Annahme nicht erfüllen. Daher sind die zugrunde liegenden Teststatistiken für die Signifikanz ungenau. Ich bin der Ansicht, dass die Verletzung der Linearitätsannahme die direkte Ursache für die nicht intuitiven Ergebnisse des Bootstraps ist.

Als ich dieses Problem zum ersten Mal las, versank es nicht darin, dass das OP beabsichtigte, unter der Null [Hypothese] zu testen.

Aber würden die gleichen nicht intuitiven Ergebnisse eintreten, wenn der Datensatz generiert worden wäre als

X1 = rnorm (n = 1000), Y1 = X1 * .4 + rnorm (n = 1000)?

Doug Dame
quelle
4
Ich denke, diese Antwort ist in jeder Hinsicht falsch. Die Ergebnisse sind weder "falsch" - es sei denn, Sie halten OLS für ein schlechtes Verfahren - noch sind sie "instabiler", als dies aus der Fehlervarianz vorhergesagt werden würde. ist definitiv eine abhängige Variable: Es gibt nirgendwo in der Theorie eine Anforderung, dass einen kausalen Zusammenhang mit den anderen Variablen hat. In der Tat ist die Nullhypothese, die herkömmlicherweise von jeder Regressionssoftware getestet wird, dass es keine Abhängigkeit gibt - genau wie hier simuliert. Y 1Y1Y1
whuber
(-1) aus den gleichen Gründen, die @whuber gegeben hat.
Half-Pass
1
Antwort auf die letzte Frage in Ihrer Bearbeitung: Ja, definitiv. Probieren Sie es selbst mit einer Simulation. (Aber seien Sie vorsichtig bei der Interpretation, denn Sie müssen überlegen, was die Null ist und wie der tatsächliche Stand der Dinge ist.)
whuber