LOESS(局部估计散点图平滑)和 LOWESS(局部加权散点图平滑)有什么区别?从维基百科我只能看到 LOESS 是 LOWESS 的概括。它们的参数是否略有不同?
LOESS和LOWESS的区别
lowess 和 loess 是 William Cleveland 创建的算法和软件程序。lowess 用于向散点图添加平滑曲线,即用于单变量平滑。loess 用于将光滑表面拟合到多元数据。
两种算法都使用局部加权多项式回归,通常具有鲁棒性迭代。局部回归是一种用于拟合平滑曲线的统计方法,无需事先假设曲线的形状或形式。
Cleveland 的方法有很多实现,但最著名和最常用的可能是 R 中的实现。R 核心 stats 包包含lowess和loess函数,两者都非常接近 Cleveland 的原始代码,但具有 R 接口。
低度
lowess 由 Cleveland (1979) 作为数学算法出版,由 Cleveland (1981) 作为 Fortran 软件程序出版。Lowess 平滑在 1988 年(Becker 等人,1988 年)作为新S 语言中的一个函数被包含在内时变得流行起来,后来又在 R 中。原始的 Fortran 程序(日期为 1985 年)仍然可以从 Netlib 获得(https://www .netlib.org/go/lowess)。R stats 函数基于 Fortran 程序到 C 的翻译,是 R 中最早的函数之一。
R 中的lowess函数旨在为绘图添加平滑曲线,因此输出只是有序 x 坐标和平滑 y 值的列表。这种风格的输出很容易输入到 R 中的绘图函数中:
x <- 1:1000
y <- rnorm(1000)
plot(x, y)
l <- lowess(x, y)
lines(l)
lowess 方法包括计算一系列局部线性回归,每个局部回归限制在一个 x 值窗口中。平滑度是通过使用重叠窗口并根据每个回归中的点与窗口锚点的距离逐渐降低权重(三立方加权)来实现的。
为了节省运行时间和内存,局部加权回归仅在有限数量的锚 x 值上计算,通常是 100-200 个不同的点。锚点至少是delta分开的,其中delta是算法的参数输入。
平滑量由重叠窗口的跨度决定,定义为点总数的比例。跨度越大,曲线越平滑。F在 Fortran 代码和fR statslowess函数中调用 span 参数。
对于每个锚点,对相邻点的窗口执行加权线性回归。相邻点由最小的最近邻集组成,其中至少包含所有点的跨度比例。每个局部回归都会为该锚点生成一个拟合值。然后通过锚点之间的线性插值获得其他 x 值的拟合值。
对于第一次迭代,局部线性回归使用三立方距离权重。随后的迭代通过鲁棒权重来倍增距离权重。残差大于中值绝对残差 6 倍的点的权重为零,否则将 Tukey 的二权函数应用于残差以获得稳健权重。更多的迭代产生更大的鲁棒性。Cleveland 最初建议进行 2 次稳健迭代。R statslowess函数中的默认值为 3。
黄土
黄土由 Cleveland & Devlin (1988) 作为数学模型、Cleveland & Grosse (1991) 作为 Fortran 例程以及 Cleveland, Grosse & Shyu (1992) 作为 S 函数出版。Netlib 存储库仍然包含 Cleveland & Grosse 从 1990 年开始的 Fortran 版本 ( http://www.netlib.org/a/loess ) 以及 Cleveland, Grosse & Shyu 从 1992 年开始的 Fortran 和 C 版本 ( http://www.netlib. org/a/dloess)。有关扩展文档,请参阅closes.pdf。Brian Ripley 教授于 1998 年将 Cleveland, Grosse & Shyu 的代码移植到 R。R 函数最初是 Ripley 教授的 modreg CRAN 包的一部分, 并于 2003 年合并到 stats 包中。
R 中的loess函数旨在表现得与 R 中的其他回归拟合函数类似,例如lm和glm。它接受一个模型公式:
fit.lo <- loess(y ~ x1 + x2)
和可选的先验权重并输出拟合模型对象,该对象可以输入到标准 R 通用函数,如、summary、fitted等。输出可能需要一些后处理,但是在它可以输入到绘图函数之前,如. 结果以原始数据顺序输出,而不是按任何 x 变量排序。residualspredictlines
原则上,loess它是对局部加权单变量回归的直接推广,lowess它被局部加权多元回归简单地取代。然而,实现更复杂,并且更难避免在多变量设置中消耗内存。
比较lowess和loess
当只有一个 x 变量且没有先验权重时,R 函数lowess和loess原则上是等价的,因此可以对它们进行直接比较。
loess有几个lowess不具备的能力:
它接受指定模型的公式而不是 x 和 y 矩阵
该模型可以包括多个预测变量、因素和交互作用。
它接受先前的权重。
它将估计拟合曲线隐含的“等效参数数量”。
另一方面,loess它比成功时慢得多lowess,有时甚至会失败lowess,因此这两个程序都保存在 R 中。
这两个程序的默认设置非常不同。这是一个示例,我在其中强制lowess执行loess完全相同的数值计算:
> set.seed(2020617)
> x <- 1:1000
> y <- rnorm(1000)
> out.lowess <- lowess(x, y, f=0.3, iter=3, delta=0)
> out.loess <- loess(y~x, span=0.3, degree=1,
+ family="symmetric", iterations=4,
+ surface="direct")
这两个函数的平滑值与机器精度相同:
> out.lowess$y[1:5]
[1] 0.04257433 0.04239860 0.04222676 0.04205882 0.04189474
> fitted(out.loess)[1:5]
[1] 0.04257433 0.04239860 0.04222676 0.04205882 0.04189474
> all.equal(out.lowess$y, fitted(out.loess))
[1] TRUE
这里需要注意的事项:
f是span论据lowessloess默认情况下进行二次(度数=2)局部回归而不是线性(度数=1)除非您指定
family="symmetric",否则 loess 将通过最小二乘拟合曲线,即根本不会进行任何稳健性迭代。lowess 和 loess 计算迭代次数不同:
iterin lowess 表示鲁棒性迭代次数;iterationsin loess 表示包括最小二乘拟合在内的总迭代次数,即迭代次数=iter+1我通过在每个唯一的 x 值处执行局部回归来设置
delta=0并surface="direct"强制这两个函数避免插值。
大型数据集
唯一不可能loess完全lowess一致的方面是他们对大型数据集的处理。当 x 和 y 很长时,例如数千个观测值的 10s,精确地进行局部回归计算是不切实际且不必要的,而是通常在非常接近的观测值之间进行插值。此插值由 的delta参数lowess和 的cell和surface参数控制loess。
当存在大量观测lowess值时,将那些距离小于一定距离的 x 值组合在一起。虽然原则上基于距离对观察进行分组是最好的方法,但这种方法在loess设计用于处理的多元 x 空间中是不切实际的。因此,loess而是根据单元格上的观察次数而不是距离将观察分组在一起。由于这种微小的差异,lowess并且loess对于大型数据集几乎总是会给出略有不同的数值结果。lowess原则上更准确,但差异通常很小。
lowess和之间的差异loess变得显着的地方在于速度和内存使用情况。
lowess即使对于数百万个点的非常大的数据集,也能保持快速和高效。例如,在我的笔记本电脑上lowess,一百万个点需要 3 秒,默认跨度:
> x <- rnorm(1e6)
> y <- rnorm(1e6)
> system.time(l <- lowess(x, y))
user system elapsed
3.00 0.02 3.01
如果跨度减小,则只有半秒:
> system.time(l <- lowess(x, y, f=0.1))
user system elapsed
0.53 0.00 0.54
如此大的数据集是不切实际的loess。
其他健壮的实现
limma Bioconductor 包的weightedLowess功能
提供了一个低的实现,并增加了接受先前权重的能力。
提供了原始 Fortran 代码的新颖 C 翻译,并尝试保留原始算法设计的尽可能多的特征,同时概括“跨度”的概念以考虑先验权重。weightedLowess
原则上,locfit.robustlocfit CRAN 包具有相同的功能,weightedLowess但在实践中给出不同且(对我而言)不太准确的结果。不幸的是,locfit 很长时间没有被原作者维护,并且包含错误。例如,任何将iter参数设置为的尝试都会locfit.robust导致错误。
loessFitlimma 包的功能为( wrapper for) lowess、weightedLowess和.locfitloess
SAS PROC LOESS提供了一个黄土的实现,具有通过最小化 AICC 标准来估计跨度的额外能力。
其他非鲁棒的实现
下面将局部回归扩展到更一般的上下文,但省略了原始算法的鲁棒化步骤。
gam CRAN 包提供了在广义线性模型拟合中包含低曲线的能力。
locfit CRAN 包的locfit.raw和locfit函数将黄土的思想扩展到广义线性模型和密度估计(Loader,1999)。
Stata的
lowess功能提供了单变量lowess的实现。它似乎没有实现鲁棒迭代,也没有使用插值,这意味着必须在每个 x 值处拟合局部回归。
Stata的
lpoly功能提供了一种灵活的方法来对 loess 算法选择不同的权重进行多元局部加权多项式平滑。
参考
克利夫兰,WS(1979)。稳健的局部加权回归和平滑散点图。 美国统计协会杂志74(368), 829-836。
克利夫兰,WS(1981)。LOWESS:通过稳健的局部加权回归平滑散点图的程序。美国统计学家35(1), 54。
Becker, RA, Chambers, JM 和 Wilks, AR (1988)。 新的 S 语言:数据分析和图形的编程环境。Wadsworth & Brooks/Cole,太平洋丛林。
克利夫兰,WS 和 Devlin,SJ(1988 年)。局部加权回归:一种通过局部拟合进行回归分析的方法。美国统计协会杂志83(403), 596-610。
克利夫兰,WS 和格罗斯,EH(1991 年)。局部回归的计算方法。统计与计算1, 47–62。
Cleveland, WS, Grosse, E. 和 Shyu, WM (1992)。局部回归模型。第 8 章:S 中的统计模型,由 JM Chambers 和 TJ Hastie,Chapman & Hall/CRC,Boca Raton 编辑。
克利夫兰 WS 和 Loader C. (1996)。局部回归平滑:原理和方法。在:Härdle W., Schimek MG (eds) 统计理论和平滑计算方面。物理出版社,海德堡。
装载机,C.(1999 年)。 局部回归和似然。斯普林格,纽约。
我认为区分方法及其在软件中的实现很重要。与第一个的主要区别在于,lowess 只允许一个预测变量,而 loess 可用于将多元数据平滑成一种表面。它还为您提供置信区间。在这些意义上,黄土是一种概括。通过在每个点周围使用 tricube 加权来平滑,loess 还添加了一个可选的鲁棒化选项,该选项使用双权重加权重新加权残差。
现在进行实施。在某些软件中,lowess 使用线性多项式,而 loess 使用二次多项式(尽管您可以更改它)。算法使用的默认值和快捷方式通常完全不同,因此很难让单变量输出完全匹配。另一方面,我不知道两者之间的选择会产生实质性差异的案例。