ブロックブートストラップ手法を効率的に実装して、回帰係数の分布を取得しようとしています。主な概要は以下のとおりです。
私はパネル データ セットを持っており、企業と年がインデックスであると言います。ブートストラップの反復ごとに、n 件の被験者を置換してサンプリングしたいと考えています。このサンプルから、サンプリングされた各被験者のすべての観測値のスタックである新しいデータ フレームを構築しrbind()
、回帰を実行して、係数を引き出す必要があります。一連の反復、たとえば 100 回繰り返します。
- 各企業は複数回選択される可能性があるため、各反復のデータ セットにそのデータを複数回含める必要があります。
- 以下のように、ループとサブセットのアプローチを使用すると、計算が面倒に思えます。
- 私の実際のデータ フレーム n では、反復回数が以下の例よりもはるかに大きいことに注意してください。
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
...
...