要添加到已经存在的答案,该波段表示平均值的置信区间,但从您的问题中,您显然正在寻找预测区间。预测区间是一个范围,如果您绘制一个新点,该点理论上将包含在 X% 的时间范围内(您可以在其中设置 X 的水平)。
library(ggplot2)
set.seed(5)
x <- rnorm(100)
y <- 0.5*x + rt(100,1)
MyD <- data.frame(cbind(x,y))
我们可以生成与您在初始问题中显示的相同类型的图,其置信区间围绕平滑黄土回归线的平均值(默认为 95% 置信区间)。
ConfiMean <- ggplot(data = MyD, aes(x,y)) + geom_point() + geom_smooth()
ConfiMean
对于预测区间的快速而肮脏的示例,这里我使用带有平滑样条的线性回归生成预测区间(因此它不一定是直线)。对于样本数据,它做得很好,对于 100 个点,只有 4 个在范围之外(我在预测函数上指定了 90% 的间隔)。
#Now getting prediction intervals from lm using smoothing splines
library(splines)
MyMod <- lm(y ~ ns(x,4), MyD)
MyPreds <- data.frame(predict(MyMod, interval="predict", level = 0.90))
PredInt <- ggplot(data = MyD, aes(x,y)) + geom_point() +
geom_ribbon(data=MyPreds, aes(x=x,ymin=lwr, ymax=upr), alpha=0.5)
PredInt
(注意:实际置信区间更平滑,因为原始答案中有代码错字)
现在还有一些注意事项。我同意 Ladislav 的观点,即您应该考虑时间序列预测方法,因为您从 2007 年的某个时间开始就有一个常规序列,并且从您的情节中可以清楚地看出,如果您仔细观察,则存在季节性(将这些点连接起来会更清楚)。为此,我建议查看预测包中的forecast.stl函数,您可以在其中选择一个季节性窗口,它使用黄土提供了对季节性和趋势的稳健分解。我提到稳健的方法是因为您的数据有一些明显的峰值。
更一般地,对于非时间序列数据,如果您的数据偶尔出现异常值,我会考虑其他稳健的方法。我不知道如何直接使用 Loess 生成预测区间,但您可以考虑分位数回归(取决于预测区间需要有多极端)。否则,如果您只想适应潜在的非线性,您可以考虑样条曲线以允许函数在 x 上变化。