Я пытаюсь эффективно внедрить метод блочного бутстрапа, чтобы получить распределение коэффициентов регрессии. Основной контур выглядит следующим образом:
У меня есть набор данных панели, например firm
и year
- индексы. Для каждой итерации бутстрапа я хочу попробовать с заменой n предметов. Из этого образца мне нужно построить новый кадр данных, который представляет собой стек rbind()
всех наблюдений для каждого объекта, отобранного для отбора. С помощью этого нового data.frame я могу запустить регрессию и вытащить коэффициенты. Повторите для кучи итераций, скажем 100.
- Каждая фирма может быть выбрана несколько раз, поэтому мне нужно включать ее данные несколько раз в каждый набор данных итераций.
- Использование подхода цикла и подмножества, как показано ниже, кажется вычислительным обременительным.
- Мои реальные кадры данных, n и # итераций намного больше, чем пример ниже.
Мои мысли изначально состоят в том, чтобы разбить существующий общий кадр данных в список на subject
с помощью команды split()
. Оттуда используйте sample(unique(df1$subject),n,replace=TRUE)
для получения нового списка, а затем, возможно, реализуйте quickdf()
из пакета plyr
для создания нового фрейма данных?
Любые мысли оценены!
Пример медленного кода:
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
...
...