2012-12-18 40 views
3

我有更多或更少看起來像這樣(不知道怎麼粘貼地塊)數據:飛度上下百分線

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百分點?我是否重新發明了輪子,即是否已經有了這個(和一個功能)的統計方法?

回答

7

您可以使用stat_quantile將這些行添加到您的圖中。

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

enter image description here

這使用位數迴歸,專門從quantregrq功能。

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的版本好多了,雖然這可能不是你要求的。