Подобрать верхнюю и нижнюю линии процентилей

У меня есть данные, которые примерно так выглядят (не умею вставлять графики):

library(reshape2)
library(ggplot2)

df <- cbind(runif(2000,0,1000), rep(0,n=2000))
for (i in 1:nrow(df)) {
  df[i,2] <- runif(1, df[i,1], (10000-2*df[i,1])) 
}
colnames(df) <- c("x","y")
df.1 <- melt(data.frame(df), id="x")

p <- ggplot(df.1, aes(x=x, y=value))
p <- p + geom_point()
p <- p + geom_smooth()
p

Вместо показанной плавной линии мне нужна одна прямая линия на нижних 5% и одна прямая на верхних 95%. Проблема в том, что у меня миллионы точек, поэтому я полагаю, что data.table - хороший путь вперед:

library(data.table)
dt <- data.table(df)
dt[,xbin:=0]
for (i in 0:100) {
  x1 <- i*100
  x2 <- (i+1)*100
  dt[x>=x1 & x<x2, xbin:=x2]
}
setkey(dt,xbin)
result1.dt <- dt[,list(ymin=min(y), ymax=max(y)), by=key(dt)]
result1.df <- data.frame(result1.dt)

p <- p + geom_line(data=result1.df, aes(x=xbin, y=ymin))
p <- p + geom_line(data=result1.df, aes(x=xbin, y=ymax))
p

Линии еще не прямые, но теперь исправить это несложно.

Как я могу с data.table получить 5-й и 95-й процентили вместо min и max? Придумываю ли я велосипед заново, т.е. существует ли уже статистический метод для этого (и функция)?


person Chris    schedule 18.12.2012    source источник


Ответы (2)


Вы можете использовать stat_quantile, чтобы добавить эти строки к вашему графику.

p + stat_quantile(quantiles = c(0.05,0.95))

введите описание изображения здесь

При этом используется квантильная регрессия, в частности функция rq из пакета quantreg.

person mnel    schedule 18.12.2012

p <- p + geom_line(aes(x=c(0,1000), y= quantile(df[,"y"], prob=0.05) ) )
p+geom_line(aes(x=c(0,1000), y= quantile(df[,"y"], prob=0.95) ) )

Комментарий: мне гораздо больше нравится версия @mnel, хотя, возможно, это не то, о чем вы просили.

person IRTFM    schedule 18.12.2012