2011-05-18 92 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) 

它做什麼你說你想要的,而你擔心的代碼不會。

相關問題