【问题标题】:How to calculate for each element in a vector the fraction of elements in another vector that is smaller?如何为向量中的每个元素计算另一个向量中较小的元素的分数?
【发布时间】:2011-08-28 11:34:51
【问题描述】:
n<-100000   
aa<-rnorm(n)
bb<-rnorm(n)
system.time(lapply(aa, function(z){mean(bb<pnorm(z))}))

运行这个小代码需要很长时间。简单地说,我有两个向量aabb。对于aa的每个元素,比如说aa[i],我想要bb &lt; aa[i]的比例

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

任何帮助将不胜感激!

【问题讨论】:

  • 只是一个小评论:为什么不在函数之外创建pnorm(z)?即aa &lt;- pnorm(rnorm(n))
  • @Bernd 或 lapply(pnorm(aa), function(z){mean(bb&lt;z)})

标签: optimization r loops performance


【解决方案1】:

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

【讨论】:

  • 太棒了!我以前从未遇到过 findInterval 函数。
  • @Ian 让我想起了unknownr.r-forge.r-project.org。来自作者的描述:“你知道 base R 中有多少个函数吗?你知道有多少个你不知道?运行unk() 来发现你未知的未知数。它很快而且很有趣!”
【解决方案2】:

我并不是要开玩笑,但这些是 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)

【讨论】:

    【解决方案3】:

    如果你只想要比例'

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

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

    【讨论】:

      猜你喜欢
      • 2019-04-19
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      • 2014-05-21
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      相关资源
      最近更新 更多