如何通过向量化重采样和重构n次?

How to resample and remodel n times by vectorization?

这是我进行重采样和改造的 for 循环版本,

B <- 999
n <- nrow(butterfly)
estMat <- matrix(NA, B+1, 2)
estMat[B+1,] <- model$coef

for (i in 1:B) {
resample <- butterfly[sample(1:n, n, replace = TRUE),]
re.model <- lm(Hk ~ inv.alt, resample)
estMat[i,] <- re.model$coef
}

我试图避免 for 循环,

B <- 999
n <- nrow(butterfly)

resample <- replicate(B, butterfly[sample(1:n, replace = TRUE),], simplify = FALSE)
re.model <- lapply(resample, lm, formula = Hk ~ inv.alt)
re.model.coef <- sapply(re.model,coef)
estMat <- cbind(re.model.coef, model$coef)

它有效但没有提高效率。有什么方法可以进行矢量化吗?


抱歉,对 Whosebug 不是很熟悉。这是数据集 butterfly.

colony  alt precip  max.temp    min.temp    Hk
pd+ss   0.5 58  97  16  98
sb  0.8 20  92  32  36
wsb 0.57    28  98  26  72
jrc+jrh 0.55    28  98  26  67
sj  0.38    15  99  28  82
cr  0.93    21  99  28  72
mi  0.48    24  101 27  65
uo+lo   0.63    10  101 27  1
dp  1.5 19  99  23  40
pz  1.75    22  101 27  39
mc  2   58  100 18  9
hh  4.2 36  95  13  19
if  2.5 34  102 16  42
af  2   21  105 20  37
sl  6.5 40  83  0   16
gh  7.85    42  84  5   4
ep  8.95    57  79  -7  1
gl  10.5    50  81  -12 4

(假设 butterfly$inv.alt <- 1/butterfly$alt

你得到错误是因为 resample 不是重采样的列表 data.frames,你可以通过以下方式获得:

resample <- replicate(B, butterfly[sample(1:n, replace = TRUE),], simplify = FALSE)

以下应该有效:

re.model <- lapply(resample, lm, formula = Hk ~ inv.alt)

要从模型列表中提取系数,re.model$coef 确实有效。系数的正确路径是:re.model[[1]]$coef, re.model[[2]]$coef, ....你可以用下面的代码得到它们:

re.model.coef <- sapply(re.model, coef)

然后你可以将它与观察到的系数结合起来:

estMat <- cbind(re.model.coef, model$coef)

其实可以全部放到replicate:

re.model.coef <- replicate(B, {
    bf.rs <- butterfly[sample(1:n, replace = TRUE),]
    coef(lm(formula = Hk ~ inv.alt, data = bf.rs))
})
estMat <- cbind(re.model.coef, model$coef)