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]
的比例
我找到了这篇文章,并尝试用它来加快速度。但它不起作用。 Speed comparison of sapply with a composite function
任何帮助将不胜感激!
答案 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)
它做你想说的,而你担心的代码没有。