如何通过向量化重采样和重构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)
这是我进行重采样和改造的 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)