我正在尝试有效地实现块引导技术来获得回归系数的分布。主要大纲如下。
我有一个面板数据集,并说公司和年份是指数。对于引导程序的每次迭代,我希望对 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
...
...