【问题标题】:computing percentile rank efficently in R在 R 中有效地计算百分位数排名
【发布时间】:2013-12-31 19:41:21
【问题描述】:

我正在开发一个 R 包,它要求我报告每个返回值的百分位等级。但是,我拥有的分布是巨大的(约 1000 万个值)。

我目前的做法是生成一个ecdf 函数,将该函数保存到文件中,并在需要时将其读取到包中。这是有问题的,因为我保存的文件最终很大(~120mb)并且需要很长时间才能重新加载:

f = ecdf(rnorm(10000000))
save(f, file='tmp.Rsav')

有没有办法通过近似 R 中的百分等级来提高效率?

谢谢

【问题讨论】:

    标签: r distribution percentage rank cdf


    【解决方案1】:

    只需在下采样的发行版上执行 ecdf:

    > items <- 100000
    > downsample <- 100 # downsample by a factor of 100
    > data <- rnorm(items)
    > data.down <- sort(data)[(1:(items / downsample)) * downsample] # pick every 100th
    > round(ecdf(data.down)(-5:5), 2)
     [1] 0.00 0.00 0.00 0.02 0.16 0.50 0.84 0.98 1.00 1.00 1.00
    > round(ecdf(data)(-5:5), 2)
     [1] 0.00 0.00 0.00 0.02 0.16 0.50 0.84 0.98 1.00 1.00 1.00
    

    请注意,您可能需要稍微考虑下采样,因为此处的示例将返回稍微有偏差的答案,但一般策略应该有效。

    【讨论】:

    • 这是一个很好的解决方案。我在想可能会生成 1000 个样本并选择给出近似值和实际值之间的最小和平方差的样本?
    • 假设您的主要分布是固定的,您实际上并不需要选择多个样本。下采样越少,就越接近原始分布,但这里的关键是您是从排序分布中采样的,因此每次采样时都应该得到相同的结果。您需要决定的关键是您需要多少精度。这将取决于您的下采样大小。
    • 另外,考虑到抽样,我的意思是你应该确保它是公正的。例如,data.down &lt;- sort(data)[(downsample / 2) + (0:(items / downsample - 1L)) * downsample] 会更好(假设downsample 是偶数)。
    猜你喜欢
    • 2010-11-06
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 2011-12-29
    • 2013-06-20
    • 1970-01-01
    相关资源
    最近更新 更多