如何计算向量中每个元素的另一个向量中较小的元素的分数?

时间:2011-05-18 23:49:47

标签: optimization r loops performance

n<-100000   
aa<-rnorm(n)
bb<-rnorm(n)
system.time(lapply(aa, function(z){mean(bb<pnorm(z))}))

运行这个小代码需要很长时间。简而言之,我有两个向量aabb。对于aa的每个元素,比如aa[i],我想要bb < aa[i]的比例

我找到了这篇文章,并尝试用它来加快速度。但它不起作用。 Speed comparison of sapply with a composite function

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:7)

您可以使用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 :(得分:1)

我并不是说要滑稽,但这些是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&lt; bb&lt; aa [i]落在平均值(x)的+/- 4%之间。

对于简单的随机抽样,99%的误差幅度= 1.29 / sqrt(n)

答案 2 :(得分:1)

如果您只想要比例'&lt; aa [i]'然后你应该确定bb的数量小于aa的每个值然后除以长度:

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

它做你想说的,而你担心的代码没有。