Преобразование данных в процентный ранг

У меня есть данные, среднее значение и дисперсия которых изменяются в зависимости от независимой переменной. Как преобразовать зависимую переменную в (оценочные) условные процентные ранги?

Например, скажем, данные выглядят как Z ниже:

library(dplyr)
library(ggplot2)

data.frame(x = runif(1000, 0, 5)) %>%
  mutate(y = sin(x) + rnorm(n())*cos(x)/3) ->
  Z

мы можем построить его с помощью Z %>% ggplot(aes(x,y)) + geom_point(): это похоже на дисперсионную синусоидальную функцию, где дисперсия вокруг этой синусоидальной функции зависит от x. Моя цель — преобразовать каждое значение y в число от 0 до 1, которое представляет его процентный ранг для значений с похожим x. Таким образом, значения, очень близкие к этой синусоидальной функции, должны быть преобразованы примерно в 0,5, а значения ниже этого значения должны быть преобразованы в значения, близкие к 0 (в зависимости от дисперсии вокруг этого x).

Один из быстрых способов сделать это — разделить данные на сегменты, а затем просто вычислить ранг каждого наблюдения в каждом сегменте.

Другой способ (который я считаю предпочтительным) сделать то, что я прошу, — это выполнить квантильную регрессию для ряда различных квантилей (tau):

library(quantreg)
library(splines)

model.fit <- rq(y ~ bs(x, df = 5), tau = (1:9)/10, data = Z)

который можно изобразить следующим образом:

library(tidyr)

data.frame(x = seq(0, 5, len = 100)) %>%
  data.frame(., predict(model.fit, newdata = .), check.names = FALSE) %>%
  gather(Tau, y, -x) %>% 
  ggplot(aes(x,y)) + 
  geom_point(data = Z, size = 0.1) +
  geom_line(aes(color = Tau), size = 1)

Учитывая model.fit, теперь я мог бы использовать оценочные квантили для каждого значения x, чтобы преобразовать каждое значение y в процентный ранг (с помощью approx(...)), но я подозреваю, что пакет quantreg может сделать это проще и лучше. Действительно ли в quantreg есть какая-то функция, которая автоматизирует это?


person banbh    schedule 30.11.2017    source источник
comment
для вычисления рангов percentile см. этот вопрос; базовая функция quantile(); и эту виньетку dplyr для оконных функций.   -  person lefft    schedule 30.11.2017
comment
@left: я согласен. На самом деле то, что вы упомянули, это именно то, что я предлагал, когда сказал, что один из быстрых способов сделать это - разбить данные на группы, а затем просто вычислить ранг каждого наблюдения в каждой группе. Проблема с этим подходом заключается в том, что он заставляет собирать данные. Подход quantreg предпочтительнее (IMO), поскольку он позволяет использовать, скажем, сплайны, а не дискретные ведра.   -  person banbh    schedule 30.11.2017