@ У Карла Бромана есть отличное решение, которое действительно показывает, как векторизация имеет значение.Тем не менее, его можно немного улучшить (около 30%):
Я предпочитаю использовать vapply
- хотя улучшение скорости здесь не заметно, поскольку цикл составляет всего 99 раз.
f <- function(n=1000) {
z <- qnorm(0.95)/sqrt(30)
vapply(1:99/100, function(p) {
# simulate all of the binomials/30 at once
x <- rbinom(n, 30, p)/30
zse <- z*sqrt(x * (1-x))
# coverage
mean(x - zse < p & p < x + zse)
}, numeric(1))
}
system.time( x <- f(50000) ) # 1.17 seconds
Вот версия исходного кода OP с использованием vapply
, и она примерно на 20% быстрее, чем оригинал, но, конечно, все же на несколько медленнее, чем полностью векторизованные решения ...
g <- function(n=1000) {
vapply(seq(.01,.99,by=.01), function(p) {
count = 0L
for (j in seq_len(n)) {
x <- sum(rbinom(30,1,p))/30
# the constant is qnorm(0.95)/sqrt(30)
zse <- 0.30030781175850279*sqrt(x*(1-x))
if( x-zse < p && p < x+zse )
count = count + 1L
}
count/n
}, numeric(1))
}
system.time( x <- g(1000) ) # 1.04 seconds