2011-05-18 87 views
2
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

任何帮助将不胜感激!

+0

只是一个小小的评论:为什么不在函数外创建'pnorm(z)'?也就是'aa < - pnorm(rnorm(n))'。 – 2011-05-19 01:04:58

+0

@Bernd或'lapply(pnorm(aa),function(z){mean(bb Marek 2011-05-19 11:02:56

回答

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 AA < [I]的比例下降的平均值(X)的%+/- 4之间。误差= 1.29 /开方(N)

7

您可以使用findInterval功能

对于简单随机抽样,99%的保证金:

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。如果您在给findInterval之前可以对pnorm(aa)进行排序,它会更快。

+1

太棒了!我从来没有遇到过findInterval函数。 – 2011-05-19 03:07:55

+3

@Ian什么让我想起http://unknownr.r-forge.r-project.org/。从作者的描述:“你知道R中有多少函数吗?你知道你不知道有多少函数?运行'unk()'来发现你未知的未知数,它速度快,很有趣! – Marek 2011-05-19 08:22:51

+0

太棒了!谢谢,安迪! – NJmonkey 2011-05-20 00:23:47

1

如果只想比例“< AA [I]”,那么你应该确定的数量BB其小于AA的每个值,然后按长度分为:

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

它做什么你说你想要的,而你担心的代码不会。