如何通过向量化对n次进行重采样和重塑?

时间:2018-10-30 00:13:54

标签: r regression vectorization bootstrapping lm

这是我进行重采样和重塑的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)

虽然有效,但并未提高效率。我可以进行矢量化吗?


抱歉,对StackOverflow不太熟悉。这是数据集 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

1 个答案:

答案 0 :(得分:0)

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

由于resample不是重新采样的data.frame的列表,您可以通过以下方式获得错误:

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]]$coefre.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)