Как пересчитать и переделать n раз с помощью векторизации? - PullRequest
0 голосов
/ 30 октября 2018

Вот моя версия цикла for resample и remodel,

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
}

Я пытался избежать для петли,

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. Вот набор данных бабочка .

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 голосов
/ 30 октября 2018

(при условии 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...