我有或多或少看起来像这样的数据(不知道如何粘贴图):
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 个百分位数?我是在重新发明轮子吗,即是否已经有一个统计方法(和一个函数)?
最佳答案
您可以使用 stat_quantile
将这些线添加到您的绘图中。
p + stat_quantile(quantiles = c(0.05,0.95))
这使用分位数回归,特别是
rq
包中的 quantreg
函数。关于r - 拟合上下百分位线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13925760/