Преобразование данных в процентный ранг
У меня есть данные, чье среднее значение и дисперсия изменяется в зависимости от независимой переменной. Как преобразовать зависимую переменную в (оценочный) процентный рейтинг?
Например, скажем, данные выглядят как 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
который автоматизирует это?