эффективное вычисление процентиля в R

Я разрабатываю пакет R, который требует, чтобы я сообщал процентные ранги для каждого из возвращаемых значений. Однако дистрибутив у меня огромен (~ 10 миллионов значений).

В настоящее время я делаю это путем создания функции ecdf, сохранения этой функции в файл и чтения ее в пакете при необходимости. Это проблематично, потому что файл, который я сохраняю, оказывается огромным (~ 120 МБ) и загружается слишком долго:

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

Есть ли способ сделать это более эффективным, возможно, каким-то образом приблизив процентильный ранг в R?

Спасибо


person Omar Wagih    schedule 31.12.2013    source источник


Ответы (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

Обратите внимание, что вы, вероятно, захотите немного подумать о понижении частоты дискретизации, так как приведенный здесь пример будет возвращать слегка предвзятые ответы, но общая стратегия должна работать.

person BrodieG    schedule 31.12.2013
comment
Это отличное решение. Я думаю, может быть, сгенерировать 1000 образцов и выбрать образец, который дает наименьшую квадратную разницу суммы между аппроксимированным и фактическим? - person Omar Wagih; 01.01.2014
comment
Предполагая, что ваш основной дистрибутив фиксирован, вам не нужно выбирать несколько образцов. Чем меньше вы понижаете выборку, тем ближе вы будете к исходному распределению, но ключ здесь в том, что вы делаете выборку из отсортированного распределения, поэтому каждый раз, когда вы делаете выборку, вы должны получать одно и то же. Ключевым моментом, который вам нужно решить, является то, какая точность вам нужна. Это будет функцией вашего размера пониженной выборки. - person BrodieG; 01.01.2014
comment
Кроме того, говоря о выборке, я действительно имел в виду, что вы должны убедиться, что она беспристрастна. Например, data.down <- sort(data)[(downsample / 2) + (0:(items / downsample - 1L)) * downsample] будет работать лучше (при условии, что downsample четно). - person BrodieG; 01.01.2014