我正在开发一个 R 包,它要求我报告每个返回值的百分位排名。但是,我的分布很大(~1000 万个值)。
我目前的做法是生成一个ecdf
函数,将该函数保存到文件中,并在需要时在包中读取它。这是有问题的,因为我保存的文件最终很大(~120mb),并且加载回去需要很长时间:
f = ecdf(rnorm(10000000))
save(f, file='tmp.Rsav')
有没有办法通过近似 R 中的百分位排名来使其更有效?
谢谢
只需在缩减采样的发行版上执行 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
请注意,您可能需要稍微考虑一下缩减采样,因为此处的示例将返回略有偏差的答案,但一般策略应该有效。