Как рассчитать для каждого элемента в векторе долю элементов в другом векторе, которая меньше? - PullRequest
2 голосов
/ 19 мая 2011
n<-100000   
aa<-rnorm(n)
bb<-rnorm(n)
system.time(lapply(aa, function(z){mean(bb<pnorm(z))}))

Выполнение этого небольшого кода занимает слишком много времени. Проще говоря, у меня есть два вектора aa и bb. Для каждого элемента aa, скажем aa[i], я хочу пропорцию bb < aa[i]

Я нашел эту статью и попытался использовать ее для ускорения. Но это не работает. Сравнение скоростей Саппи с составной функцией

Любая помощь будет оценена!

Ответы [ 3 ]

7 голосов
/ 19 мая 2011

Вы можете использовать функцию findInterval:

n <- 25000
aa <- rnorm(n)
bb <- rnorm(n)
system.time(q1 <- lapply(aa, function(z){mean(bb<pnorm(z))}))
#   user  system elapsed
# 20.057   2.544  22.807
system.time(q2 <- findInterval(pnorm(aa), sort(bb))/n)
#   user  system elapsed
#  0.020   0.000   0.021
all.equal(as.vector(q1, "numeric"), q2)
# [1] TRUE

Обратите внимание, что findInterval возвращает индексы, поэтому я разделил результат на n. Если вы можете отсортировать pnorm(aa) перед тем, как передать findInterval, это будет еще быстрее.

1 голос
/ 19 мая 2011

Если вам нужна только пропорция '

bbs <- sort(bb)
zz <- findInterval(aa, bbs)
zz <- zz/length(aa)

.Вы говорите, что хотите, в то время как ваш код, я боюсь, нет.

1 голос
/ 19 мая 2011

Я не хочу быть шутливым, но это те проблемы, которые R призван решать без необходимости выполнять каждый отдельный расчет - т. Е. Использовать статистику!

Предполагая, что распределения нормальные ...

aa.new <- sample(aa, 1000)
bb.new <- sample(bb, 1000)

x <- lapply(aa.new, function(z){mean(bb.new<pnorm(z))})
x <- unlist(x)

mean(x)

Вы можете быть на 99% уверены, что доля bb

Для простой случайной выборки, погрешность 99% = 1,29 / sqrt (n)

...