从多项式回归中了解置信带

机器算法验证 r 回归 数据可视化 异常值
2022-01-20 20:15:48

我试图理解我在下图中看到的结果。通常,我倾向于使用 Excel 并获得线性回归线,但在下面的情况下,我使用 R,并使用以下命令获得多项式回归:

ggplot(visual1, aes(ISSUE_DATE,COUNTED)) + geom_point() + geom_smooth()

所以我的问题归结为:

  1. 蓝色回归线周围的灰色区域(箭头 #1)是什么?这是多项式回归的标准差吗?

  2. 我可以说灰色区域(箭头#2)之外的任何东西都是“异常值”,而灰色区域(箭头#3)内的任何东西都在标准偏差之内吗?

在此处输入图像描述

3个回答

灰色带是回归线的置信带。我对 ggplot2 不够熟悉,无法确定它是 1 SE 置信带还是 95% 置信带,但我相信它是前者编辑:显然它是 95% CI)。置信带表示回归线的不确定性。从某种意义上说,您可以认为真正的回归线与该带的顶部一样高,与底部一样低,或者在带内以不同的方式摆动。(请注意,此解释旨在直观,在技术上并不正确,但完全正确的解释对于大多数人来说很难理解。)

您应该使用置信带来帮助您理解/思考回归线。您不应该使用它来考虑原始数据点。请记住,回归线代表 $X$ 中每个点的 $Y$ 的平均值(如果您需要更全面地理解这一点,它可能会帮助您在这里阅读我的答案:条件高斯分布背后的直觉是什么?)。另一方面,您当然不希望每个观察到的数据点都等于条件均值。换句话说,您不应使用置信带来评估数据点是否为异常值。


编辑:此注释是主要问题的外围,但旨在澄清 OP 的一点。

多项式回归不是非线性回归,即使你得到的看起来不像一条直线。术语“线性”在数学上下文中具有非常特殊的含义,具体来说,您正在估计的参数——β——都是系数。多项式回归仅意味着您的协变量是 $X$、$X^2$、$X^3$ 等,也就是说,它们彼此之间具有非线性关系,但您的 beta 仍然是系数,因此它仍然是一个线性模型。例如,如果您的 beta 是指数,那么您将拥有一个非线性模型。

总之,一条线看起来是否笔直与模型是否是线性的无关。当您拟合多项式模型时(例如,使用 $X$ 和 $X^2$),模型并不“知道”这一点,例如,$X_2$ 实际上只是 $X_1$ 的平方。它“认为”这些只是两个变量(尽管它可能会认识到存在一些多重共线性)。因此,实际上它是在三维空间中拟合(直线/平面)回归平面,而不是(弯曲)回归线在二维空间中。这对我们来说是没有用的,事实上,因为$X^2$ 是$X$ 的完美函数,所以很难看到。因此,我们不必费心以这种方式思考它,我们的绘图实际上是在 $(X,\Y)$ 平面上的二维投影。尽管如此,在适当的空间中,这条线实际上在某种意义上是“直的”。

从数学的角度来看,如果您尝试估计的参数是系数,则模型是线性的。为了进一步澄清,考虑标准(OLS)线性回归模型和以两种不同形式呈现的简单逻辑回归模型之间的比较:
$$ Y = \beta_0 + \beta_1X + \varepsilon $$ $$ \ln\left( \frac{\pi(Y)}{1 - \pi(Y)}\right) = \beta_0 + \beta_1X $$ $$ \pi(Y) = \frac{\exp(\beta_0 + \beta_1X)} {1 + \exp(\beta_0 + \beta_1X)} $$ 最上面的模型是 OLS 回归,下面两个是逻辑回归,尽管以不同的方式呈现。在所有三种情况下,当您拟合模型时,您正在估计 $\beta$s。前两个模型是线性的,因为所有的 $\beta$s 都是系数,但底部模型是非线性的(在这种形式下),因为 $\beta$s 是指数。(这可能看起来很奇怪,但逻辑回归是广义线性模型的一个实例,因为它可以重写为线性模型。有关此的更多信息,它可能有助于阅读我的答案:logit 和 probit 模型之间的差异.)

要添加到已经存在的答案,该波段表示平均值的置信区间,但从您的问题中,您显然正在寻找预测区间预测区间是一个范围,如果您绘制一个新点,该点理论上将包含在 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 上变化。

好吧,蓝线是平滑的局部回归span您可以通过参数(从 0 到 1)控制线条的摆动。但是您的示例是“时间序列”,因此请尝试寻找一些更合适的分析方法,而不仅仅是拟合平滑曲线(这应该仅用于揭示可能的趋势)。

根据文档ggplot2(以及下面的评论中的书):stat_smooth是以灰色显示平滑的置信区间。如果要关闭置信区间,请使用se = FALSE。