如何计算 LOESS 的预测区间?

机器算法验证 r 回归 预测区间 黄土
2022-01-27 17:59:12

我有一些数据是我在 R 中使用 LOESS 模型拟合的,给了我这个:

在此处输入图像描述

数据具有一个预测变量和一个响应变量,并且是异方差的。

我还添加了置信区间。问题是区间是线的置信区间,而我对预测区间感兴趣。例如,底部面板比顶部面板更具可变性,但这并未在间隔中捕获。

这个问题有点相关: 从多项式回归中理解置信带,尤其是@AndyW 的答案,但是在他的示例中,他使用了interval="predict"存在于 中的相对简单的论点predict.lm,但 中没有predict.loess

所以我有两个非常相关的问题:

  1. 如何获得 LOESS 的逐点预测区间?
  2. 如何预测将捕获该间隔的值,即生成一堆最终看起来有点像原始数据的随机数?

我可能不需要 LOESS,应该使用其他东西,但我不熟悉我的选择。基本上它应该使用局部回归或多元线性回归拟合线,给我对线的误差估计,此外还有不同解释变量的不同方差,所以我可以预测响应变量 (y) 在某些 x 值处的分布.

1个回答

我不知道如何用原始loess函数做预测带,但是loess.sd中有一个函数可以做到这一点!从文档中几乎逐字记录:msirmsir

library(msir)
data(cars)
# Calculates and plots a 1.96 * SD prediction band, that is,
# a 95% prediction band
l <- loess.sd(cars, nsigma = 1.96)
plot(cars, main = "loess.sd(cars)", col="red", pch=19)
lines(l$x, l$y)
lines(l$x, l$upper, lty=2)
lines(l$x, l$lower, lty=2)

在此处输入图像描述

你的第二个问题有点棘手,因为loess.sd它没有预测函数,但你可以通过线性插值预测的平均值和你得到的标准差loess.sd(使用approx)来破解它。反过来,这些可用于使用具有预测均值和 SD 的正态分布来模拟数据:

# Simulate x data uniformly and y data acording to the loess fit
sim_x <- runif(100, min(cars[,1]), max(cars[,1]))
pred_mean <- approx(l$x, l$y, xout = sim_x)$y
pred_sd <- approx(l$x, l$sd, xout = sim_x)$y
sim_y <- rnorm(100, pred_mean, pred_sd) 

# Plots 95% prediction bands with simulated data 
plot(cars, main = "loess.sd(cars)", col="red", pch=19)
points(sim_x, sim_y, col="blue")
lines(l$x, l$y)
lines(l$x, l$upper, lty=2)
lines(l$x, l$lower, lty=2)

在此处输入图像描述