Bloquear bootstrap de la lista de temas

Estoy tratando de implementar de manera eficiente una técnica de arranque de bloques para obtener la distribución de los coeficientes de regresión. El esquema principal es el siguiente.

Tengo un conjunto de datos de panel, y digo firme y año son los índices. Para cada iteración del bootstrap, deseo muestrear n temas con reemplazo. De este ejemplo, necesito construir un nuevo marco de datos que sea unrbind() Apile todas las observaciones para cada sujeto muestreado, ejecute la regresión y extraiga los coeficientes. Repita para un montón de iteraciones, digamos 100.

Cada firma puede seleccionarse potencialmente varias veces, por lo que debo incluir sus datos varias veces en el conjunto de datos de cada iteración.Usar un enfoque de bucle y subconjunto, como a continuación, parece computacionalmente engorroso.Tenga en cuenta que para mi marco de datos real, n, y las iteraciones de números son mucho más grandes que en el siguiente ejemplo.

Mis pensamientos inicialmente son dividir el marco de datos existente en una lista por tema utilizando elsplit() mando. A partir de ahí, utilizar.

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

para obtener la nueva lista, entonces tal vez implementarquickdf desde elplyr Paquete para construir un nuevo marco de datos.

Ejemplo de código lento:

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
...
...

Respuestas a la pregunta(5)

Su respuesta a la pregunta