适合上下百分位线

时间:2012-12-18 03:20:00

标签: r ggplot2 data.table

我的数据或多或少看起来像这样(不知道如何粘贴图表):

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

线条还不直,但是从这里解决它是微不足道的。

而不是min和max,我如何使用data.table获得第5和第95百分位数?我是否重新发明轮子,即是否已有统计方法(和函数)?

2 个答案:

答案 0 :(得分:7)

您可以使用stat_quantile将这些线条添加到地块中。

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

enter image description here

这使用分位数回归,特别是rq包中的quantreg函数。

答案 1 :(得分:4)

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的版本,虽然它可能不是你要求的。