Blockiere Bootstrap von der Betreffliste

Ich versuche, eine Block-Bootstrap-Technik effizient zu implementieren, um die Verteilung der Regressionskoeffizienten zu erhalten. Der Hauptüberblick ist wie folgt.

Ich habe einen Panel-Datensatz und sage, Firma und Jahr sind die Indizes. Für jede Iteration des Bootstraps möchte ich n Probanden mit Ersatz testen. Aus diesem Beispiel muss ein neuer Datenrahmen erstellt werden, der einrbind() stapeln Sie alle Beobachtungen für jedes untersuchte Subjekt, führen Sie die Regression durch und ziehen Sie die Koeffizienten heraus. Wiederholen Sie diesen Vorgang für eine Reihe von Iterationen, z. B. 100.

Jede Firma kann möglicherweise mehrmals ausgewählt werden, sodass ich sie mehrmals in den Datensatz jeder Iteration aufnehmen muss.Die Verwendung eines Loop- und Subset-Ansatzes wie unten scheint rechenintensiv zu sein.Beachten Sie, dass für meinen realen Datenrahmen n und die Anzahl der Iterationen viel größer sind als im folgenden Beispiel.

Meine Überlegungen sind zunächst, den vorhandenen Datenrahmen anhand des Themas in eine Liste zu unterteilensplit() Befehl. Von dort verwenden

sample(unique(df1$subject),n,replace=TRUE)

um die neue liste zu bekommen, dann vielleicht umsetzenquickdf von demplyr Paket zum Erstellen eines neuen Datenrahmens.

Beispiel langsamer Code:

require(plm)
data("Grunfeld", package="plm")

firms = unique(Grunfeld$firm)
n = 10
iterations = 100
mybootresults=list()

for(j in 1:iterations){

  v = sample(length(firms),n,replace=TRUE)
  newdata = NULL

  for(i in 1:n){
    newdata = rbind(newdata,subset(Grunfeld, firm == v[i]))
  }

  reg1 = lm(value ~ inv + capital, data = newdata)
  mybootresults[[j]] = coefficients(reg1)

}

mybootresults = as.data.frame(t(matrix(unlist(mybootresults),ncol=iterations)))
names(mybootresults) = names(reg1$coefficients)
mybootresults

  (Intercept)      inv    capital
1    373.8591 6.981309 -0.9801547
2    370.6743 6.633642 -1.4526338
3    528.8436 6.960226 -1.1597901
4    331.6979 6.239426 -1.0349230
5    507.7339 8.924227 -2.8661479
...
...

Antworten auf die Frage(5)

Ihre Antwort auf die Frage