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).
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.
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.
# 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.
quelle
ids
ids <- unique(ids)
Antworten:
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
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.
quelle
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.p t
quelle
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
X
undY
unabhängig sind. Bei Ihrem Resampling tun Sie dies jedochDas schafft Korrelation, weil Sie abtasten
X
undY
zusammen. Angenommen , die erste Zeile des Datensatzesd
lautet(x1, y1)
: Im neu abgetasteten Datensatz folgtP(Y = y1|X = x1) = 1
, wennX
undY
unabhängig sind,P(Y|X = x1)
eine Normalverteilung.Eine andere Möglichkeit, dies zu beheben, ist die Verwendung
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
X
es unabhängig vom neuen istY
).quelle
x's
. Was ich erwähnt habe, ist die Korrelation zwischenX
s undY
s.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
Wenn wir das in der bekannten Form einer OLS-Regression ausdrücken, dh
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
quelle