Ich erstelle ein Skript zum Erstellen von Bootstrap-Beispielen aus dem cats
Dataset (aus dem -MASS-
Paket).
Nach dem Lehrbuch von Davidson und Hinkley [1] führte ich eine einfache lineare Regression durch und übernahm ein grundlegendes nichtparametrisches Verfahren für das Bootstrapping von iid-Beobachtungen, nämlich das Resampling von Paaren .
Das Originalmuster hat folgende Form:
Bwt Hwt
2.0 7.0
2.1 7.2
...
1.9 6.8
Durch ein univariates lineares Modell wollen wir das Herdgewicht von Katzen durch ihr Gehirngewicht erklären.
Der Code lautet:
library(MASS)
library(boot)
##################
# CATS MODEL #
##################
cats.lm <- glm(Hwt ~ Bwt, data=cats)
cats.diag <- glm.diag.plots(cats.lm, ret=T)
#######################
# CASE resampling #
#######################
cats.fit <- function(data) coef(glm(data$Hwt ~ data$Bwt))
statistic.coef <- function(data, i) cats.fit(data[i,])
bootl <- boot(data=cats, statistic=statistic.coef, R=999)
Angenommen, es gibt jetzt eine Clustervariable cluster = 1, 2,..., 24
(zum Beispiel gehört jede Katze zu einem bestimmten Wurf). Nehmen wir zur Vereinfachung an, dass die Daten ausgewogen sind: Wir haben 6 Beobachtungen für jeden Cluster. Daher besteht jeder der 24 Würfe aus 6 Katzen (dh n_cluster = 6
und n = 144
).
Es ist möglich, eine gefälschte cluster
Variable zu erstellen durch:
q <- rep(1:24, times=6)
cluster <- sample(q)
c.data <- cbind(cats, cluster)
Ich habe zwei verwandte Fragen:
Wie simuliere ich Proben gemäß der (gruppierten) Datensatzstruktur? Das heißt, wie kann ein Resample auf Clusterebene durchgeführt werden? Ich möchte die Cluster mit Ersetzung abtasten und die Beobachtungen innerhalb jedes ausgewählten Clusters wie im Originaldatensatz festlegen (dh Stichproben mit Ersetzung der Cluster und ohne Ersetzung der Beobachtungen innerhalb jedes Clusters).
Dies ist die von Davidson vorgeschlagene Strategie (S. 100). Angenommen, wir ziehen B = 100
Proben. Jeder von ihnen sollte aus 24 möglicherweise wiederkehrenden Clustern (z. B. cluster = 3, 3, 1, 4, 12, 11, 12, 5, 6, 8, 17, 19, 10, 9, 7, 7, 16, 18, 24, 23, 11, 15, 20, 1
) bestehen, und jeder Cluster sollte die gleichen 6 Beobachtungen des ursprünglichen Datensatzes enthalten. Wie geht das R
? (entweder mit oder ohne -boot-
Paket.) Haben Sie alternative Vorschläge für das weitere Vorgehen?
Die zweite Frage betrifft das anfängliche Regressionsmodell. Angenommen, ich verwende ein Modell mit festen Effekten und Abschnitten auf Clusterebene. Ändert es das angewandte Resampling-Verfahren ?
[1] Davidson, AC, Hinkley, DV (1997). Bootstrap-Methoden und ihre Anwendungen . Cambridge University Press.
quelle
Ich habe versucht, das Problem selbst zu lösen, und den folgenden Code erstellt.
Obwohl es funktioniert, könnte es wahrscheinlich in Bezug auf die Geschwindigkeit verbessert werden. Wenn möglich, hätte ich es auch vorgezogen, einen Weg für die Verwendung des
-boot-
Pakets zu finden, da es ermöglicht, automatisch eine Reihe von Bootstrap-Konfidenzintervallen durchboot.ci
...Der Einfachheit halber besteht der Ausgangsdatensatz aus 18 Katzen (die "Beobachtungen auf niedrigerer Ebene"), die in 6 Laboratorien (der Clustervariablen) verschachtelt sind. Der Datensatz ist ausgeglichen (
n_cluster = 3
für jeden Cluster). Wir haben einen Regressor, der dasx
erklärty
.Der gefälschte Datensatz und die Matrix, in der die Ergebnisse gespeichert werden, sind:
Bei jeder der
B
Iterationen werden in der folgenden Schleife 6 Cluster mit Ersatz abgetastet, die jeweils aus 3 Katzen bestehen, die ohne Ersatz entnommen wurden (dh die interne Zusammensetzung der Cluster bleibt unverändert). Die Schätzungen des Regressorkoeffizienten und seines Standardfehlers werden in der zuvor erstellten Matrix gespeichert:Hoffe das hilft, Lando
quelle
replicate
. Als Bonus wird dasb.sample
Array automatisch für Sie zurückgegeben. Bei all dem Zusammenführen hier ist es mit ziemlicher Sicherheit besser, wenn Sie verwendendata.table
und neu abtastenkey
. Ich kann eine Antwort beisteuern, wenn ich an einen Computer komme ... Frage: Warum verfolgen Sie die Standardfehler der Koeffizienten?quantile(b.sample[,2], c(.025, .975))
Hier ist eine viel einfachere (und zweifellos schnellere) Möglichkeit, das Bootstrapping mit
data.table
(auf @ lando.carlissians Daten) durchzuführen:quelle
Ich musste dies vor kurzem tun und verwendet
dplyr
. Die Lösung ist nicht so elegant wie beidata.table
, aber:Das
inner_join
wiederholt sich jede Zeile einen bestimmten Wert hat ,x
dercluster
durch die Anzahl der Zeiten , diex
in erscheintcluster_sample
.quelle
Hallo, eine sehr einfache Lösung basierend auf Split und Lapply, kein spezielles Paket außer "Boot", Beispiel mit einer Schätzung des ICC basierend auf dem Nagakawa-Verfahren:
DRITTE: Bootstrap-Ausführung
quelle