Bootstrap in R
Bootstrap ist eine Methode zur Inferenz über eine Population unter Verwendung von Beispieldaten.Bradley Efron hat es zuerst in diesem eingeführtpapier im Jahr 1979.Bootstrap basiert auf Sampling mit Ersatz aus Beispieldaten. Diese Technik kann verwendet werden, um den Standardfehler jeder Statistik abzuschätzen und ein Konfidenzintervall (CI) dafür zu erhalten. Bootstrap ist besonders nützlich,wenn CI keine geschlossene oder sehr komplizierte Form hat.
Angenommen, wir haben eine Stichprobe von n Elementen:X = {x1, x2, …, xn} und wir interessieren uns für CI für eine Statistik T = t(X) . Bootstrapframework ist unkompliziert. Wir wiederholen einfach R mal das folgende Schema: Für i-te Wiederholung, Probe mit Ersatz n Elemente aus demverfügbare Probe (einige von ihnen werden mehr als einmal ausgewählt). Rufen Sie thisnew Probe i-te Bootstrap Probe, Xi, und calculatedesired Statistik Ti = t(Xi).
Als Ergebnis erhalten wir R Werte unserer Statistik:T1, T2, …, TR. Wir nennen sie Bootstrap-Realisierungen von T oder eine Bootstrap-Verteilung von T.Basierend darauf können wir CI für T berechnen. Die Einnahme von Perzentilen scheint die einfachste zu sein.
Bootstrap in Aktion
Verwenden wir (noch einmal) den bekannten iris
-Datensatz. Schauen Sie sich ein paar Zeilen an:
Angenommen, wir möchten CIs für Median Sepal.Length
, Median Sepal.Width
und Spearmans Rangkorrelationskoeffizienten zwischen diesen beiden finden. Wir verwenden R
’s boot
Paket und eine Funktion namens… boot
. Um seine Leistung zu nutzen, müssen wir eine Funktion erstellen, die unsere Statistiken aus neu abgetasteten Daten berechnet. Es sollte mindestens zwei Argumente enthalten: einen dataset
und einen Vektor mit indices
Elementen aus einem Dataset, die zum Erstellen eines Bootstrap-Beispiels ausgewählt wurden.
Wenn wir CIs für mehr als eine Statistik gleichzeitig berechnen möchten, muss ourfunction sie als einzelnen Vektor zurückgeben.
In unserem Beispiel könnte es so aussehen:
library(boot)foo <- function(data, indices){ dt<-data c( cor(dt, dt, method='s'), median(dt), median(dt) )}
foo
wählt die gewünschten Elemente (deren Zahlen in indices
gespeichert sind) aus data
aus und berechnet den Korrelationskoeffizienten der ersten beiden Spalten (method='s'
wird verwendet, um den Rangkoeffizienten von Spearman auszuwählen, method='p'
ergibt den Pearson-Koeffizienten) und deren Mediane.
Wir können auch einige zusätzliche Argumente hinzufügen, z. lassen sie benutzer wählen typ odcorrelation koeffizienten:
foo <- function(data, indices, cor.type){ dt<-data c( cor(dt, dt, method=cor.type), median(dt), median(dt) )}
Um dieses Tutorial allgemeiner zu gestalten, verwende ich die letztere Version vonfoo
.
Jetzt können wir die Funktion boot
verwenden. Wir müssen es mit einem Namen oddataset , einer Funktion, die wir gerade erstellt haben, einer Anzahl von Wiederholungen (R
) und zusätzlichen Argumenten unserer Funktion (wie cor.type
) versehen. Unten verwende ich set.seed
für die Reproduzierbarkeit dieses Beispiels.
set.seed(12345)myBootstrap <- boot(iris, foo, R=1000, cor.type='s')
boot
funktion gibt ein Objekt der aufgerufenen Klasse zurück… (ja, du hast recht!)boot
. Es hat zwei interessante Elemente. $t
enthält R-Werte unserer Statistik (en), die von der Bootstrap-Prozedur generiert wurden (Bootstrap-Realisierungen oft):
$t0
enthält Werte unserer Statistik(en) im Original, vollständig, Datensatz:
myBootstrap$t0## -0.1667777 5.8000000 3.0000000
Drucken boot
Objekt an die Konsole gibt einige weitere Informationen:
original
ist das gleiche wie $t0
. bias
ist eine Differenz zwischen dem Mittelwert der Bootstrap-Realisierungen (die von $t
), die als Bootstrap-Schätzung von T bezeichnet werden, und dem Wert im ursprünglichen Datensatz (der von $t0
).
colMeans(myBootstrap$t)-myBootstrap$t0## 0.002546391 -0.013350000 0.007900000
std. error
ist ein Standardfehler der Bootstrap-Schätzung, der gleich Iststandardabweichung von Bootstrap-Realisierungen.
apply(myBootstrap$t,2,sd)## 0.07573983 0.10295571 0.02726414
Verschiedene Arten von Bootstrap CIs
Bevor wir mit CI beginnen, lohnt es sich immer, einen Blick auf dieverteilung von Bootstrap-Realisierungen. Wir können die Funktion plot
verwenden, wobeiindex
angibt, welche der in foo
berechneten Statistiken wir anzeigen möchten. Hier ist index=1
ein Spearman-Korrelationskoeffizient zwischensepallänge und -breite, index=2
ist eine mittlere Od-Sepallänge undindex=3
ist eine mittlere Od-Sepalbreite.
plot(myBootstrap, index=1)
Die Verteilung der Bootstrap-Korrelationskoeffizienten scheint ziemlichnormal. Lass uns CI dafür finden. Wir können boot.ci
verwenden. Der Standardwert ist 95 Prozent CIs, kann aber mit dem Parameter conf
geändert werden.
boot.ci
bietet 5 Arten von Bootstrap-CIs. Einer von ihnen, studentizedinterval, ist einzigartig. Es benötigt eine Schätzung der Bootstrap-Varianz. Wir stellen es nicht zur Verfügung, daher gibt R
eine Warnung aus:bootstrap variances needed for studentized intervals
. Varianzschätzungen können mit Bootstrap der zweiten Ebene oder (einfacher) Mitjackknife-Technik erhalten werden. Dies geht irgendwie über den Rahmen dieses Tutorials hinaus,also konzentrieren wir uns auf die verbleibenden vier Arten von Bootstrap-CIs.
Wenn wir sie nicht alle sehen wollen, können wir relevante im Argument type
auswählen. Mögliche Werte sind norm
, basic
, stud
, perc
, bca
ora Vektor von diesen.
Die Funktion boot.ci
erstellt ein Objekt der Klasse… (ja, Sie haben es erraten!)bootci
. Seine Elemente werden genau wie Typen von CI aufgerufen, die im Argument type
verwendet werden. $norm
ist ein 3-Element-Vektor, der Konfidenzlevel und CI-Grenzen enthält.
boot.ci(myBootstrap, index=1, type='norm')$norm## conf ## 0.95 -0.3177714 -0.02087672
$basic
, $stud
, $perc
und $bca
sind 5-Element-Vektoren, die auch Perzentile enthalten, die zur Berechnung von CI verwendet werden (wir werden später darauf zurückkommen):
boot.ci(myBootstrap, index=1, type='basic')$basic## conf ## 0.95 975.98 25.03 -0.3211981 -0.03285178
Ein bisschen Notation (Sorry!)
Um ein Gefühl dafür zu bekommen, was verschiedene Arten von CI sind, müssen wir einführeneine Notation. Also, lass:
- t⋆ sei die Bootstrap−Schätzung (Mittelwert der Bootstraprealisierungen),
- t0 sei ein Wert unserer Statistik im ursprünglichen Datensatz,
- se⋆ sei ein Standardfehler der Bootstrap-Schätzung,
- b sei eine Verzerrung der Bootstrap-Schätzungb = t⋆ – t0
- α ein Konfidenzniveau sein, typischerweise α = 0,95,
- za ein $ 1- \ frac \alpha 2 $ -Quantil der Standardnormalverteilung sein,
- θα ein α-Perzentil der Verteilung von Bootstraprealisierungen sein.
Perzentil-CI
Mit der obigen Notation ist Perzentil-CI:
dies erfordert also nur relevante Perzentile. Nichts weiter.
Normales KI
Ein typisches Wald-KI wäre:
aber im Bootstrap-Fall sollten wir es für Bias korrigieren. So wird es:
$$ t_0 – b \pm z_\alpha \cdot se^\star \\ 2t_0 – t^\star \pm z_\alpha \cdot se^\star $$
Basic CI
Perzentil CI wird im Allgemeinen nicht empfohlen, da es schlecht abschneidet, wenn es um Verteilungen mit seltsamem Schwanz geht. Grundlegendes CI (auch genanntpivotales oder empirisches CI) ist dazu viel robuster. Das Rationale dahinter ist, Unterschiede zwischen jeder Bootstrap-Replikation und t0 zu berechnen und Perzentile ihrer Verteilung zu verwenden. Vollständige Details finden Sie z. B. in L. Wassermans All ofStatistics
Die endgültige Formel für das grundlegende CI lautet:
BCa CI
BCa kommt von Bias-korrigiert, beschleunigt. Die Formel dafür ist nicht sehr kompliziert, aber etwas unintuitiv, also werde ich es überspringen.Siehe Artikel von Thomas J. DiCiccio und BradleyEfron, wenn Sie an Details interessiert sind.
Die im Methodennamen erwähnte Beschleunigung erfordert die Verwendung von specificpercentiles von Bootstrap-Realisierungen. Manchmal kann es vorkommen, dassDies wären einige extreme Perzentile, möglicherweise Ausreißer.BCa kann in solchen Fällen instabil sein.
Betrachten wir den BCa-CI für den Median der Blütenblattbreite. Im ursprünglichen Datensatz entspricht dieser Median genau 3.
Wir erhalten BCa CI (2.9, 2.9). Das ist seltsam, aber zum Glück R
warnte uns, dass extreme order statistics used as endpoints
. Mal sehenwas genau hier passiert ist:
plot(myBootstrap, index=3)
Die Verteilung von Bootstrap-Realisierungen ist ungewöhnlich. Eine große Mehrheit von ihnen (über 90%) sind 3s.
table(myBootstrap$t)#### 2.9 2.95 3 3.05 3.1 3.15 3.2## 1 1 908 24 63 1 2
Replikation der Ergebnisse
Manchmal müssen wir Bootstrap-Replikationen neu erstellen. Wenn wir R
dafür verwenden können, ist dies kein Problem. set.seed
Funktion löst das Problem.Das Wiederherstellen von Bootstrap-Replikationen in anderer Software wäre viel mehrkompliziert. Darüber hinaus kann für große R die Neuberechnung in R
ebenfalls keine Option sein (z. B. aus Zeitmangel).
Wir können dieses Problem lösen, indem wir Indizes von Elementen des Originaldataset speichern, das jedes Bootstrap-Sample gebildet hat. Dies ist, was boot.array
Funktion (mit indices=T
Argument) tut.
tableOfIndices<-boot.array(myBootstrap, indices=T)
Jede Zeile ist ein Bootstrap-Beispiel. Z., unsere erste probe enthält thefollowing elemente:
Einstellung indices=F
(ein standard), wir’ll erhalten eine antwort auf die frage „Wieviele mal jedes element von original datensatz erschien in jeder bootstrapsample?“. Zum Beispiel in der ersten Probe: das 1. Element des Datensatzes erschien einmal, das 2. Element erschien überhaupt nicht, das 3. Element erschien einmal, das 4. Zweimal und so weiter.
Eine Tabelle wie diese ermöglicht es uns, die Bootstrap-Realisierung außerhalb von R
neu zu erstellen.Oder in R
selbst, wenn wir set.seed
nicht verwenden und die gesamte Berechnung erneut durchführen möchten.
onceAgain<-apply(tableOfIndices, 1, foo, data=iris, cor.type='s')
Überprüfen wir, ob die Ergebnisse identisch sind:
Ja, das sind sie!
Wenn Sie mehr über maschinelles Lernen in R erfahren möchten, besuchen Sie den Machine Learning Toolbox-Kurs von DataCamp.