Этот вопрос привел к созданию нового пакета R:
wrswoR
R выборка по умолчанию без замены с использованием sample.int
, по-видимому, требует квадратичного времени выполнения, например. при использовании весов, полученных из равномерного распределения. Это слишком медленно для больших размеров выборки. Кто-нибудь знает более быструю реализацию , которая могла бы использоваться из R? Два варианта: "Отбраковка с замещением" (см. этот вопрос на stats.sx) и алгоритм Wong and Easton (1980) (с реализацией Python в qaru.site/info/45201/...).
Спасибо Ben Bolker за намек на функцию C, которая вызывается внутри, когда sample.int
вызывается с replace=F
и неравномерными весами: ProbSampleNoReplace
. В самом деле, код показывает две вложенные петли for
(строка 420 ff random.c
).
Здесь приведен код для эмпирического анализа времени выполнения:
library(plyr)
sample.int.test <- function(n, p) {
sample.int(2 * n, n, replace=F, prob=p); NULL }
times <- ldply(
1:7,
function(i) {
n <- 1024 * (2 ** i)
p <- runif(2 * n)
data.frame(
n=n,
user=system.time(sample.int.test(n, p), gcFirst=T)['user.self'])
},
.progress='text'
)
times
library(ggplot2)
ggplot(times, aes(x=n, y=user/n)) + geom_point() + scale_x_log10() +
ylab('Time per unit (s)')
# Output:
n user
1 2048 0.008
2 4096 0.028
3 8192 0.100
4 16384 0.408
5 32768 1.645
6 65536 6.604
7 131072 26.558
РЕДАКТИРОВАТЬ. Благодаря Аруну, указав, что невзвешенная выборка, похоже, не имеет такого снижения производительности.