R中的本地线性回归--locfit() vs locpoly()

27

我正在尝试理解这两个平滑函数在给定表面上等价的输入时的不同行为。我的理解是,locpoly 只接受一个固定的带宽参数,而 locfit 还可以在其平滑参数中包含一个变化部分(最近邻分数 "nn")。我认为将 locfit 中的这个变化部分设置为零应该会使 "h" 组件的行为就像 locpoly 中使用的固定带宽,但事实并非如此。

一个可行的例子:

library(KernSmooth)
library(locfit)
set.seed(314)

n <- 100
x <- runif(n, 0, 1)
eps <- rnorm(n, 0, 1)
y <- sin(2 * pi * x) + eps

plot(x, y)
lines(locpoly(x, y, bandwidth=0.05, degree=1), col=3)
lines(locfit(y ~ lp(x, nn=0, h=0.05, deg=1)), col=4)

生成这个图:

smoothers绘图

locpoly 给出了平滑的绿色线,而 locfit 给出了波动的蓝色线。显然,即使假定带宽参数对于每个函数都具有相同的值,locfit 在这里具有更小的“有效”带宽。

这两个函数有什么不同之处?


1
当带宽hlines(locfit(y ~ lp(x, nn=0, h=0.05, deg=1)), col=4)中被更改为0.10时,两个平滑函数几乎相同。 - KenHBS
2
你看到这个讨论了吗? - Eric Fail
2个回答

2
这两个参数都表示平滑,但它们以两种不同的方式实现。 locpoly的带宽参数相对于x轴的比例尺而言。例如,如果将行 x <- runif(n, 0, 1) 更改为 x <- runif(n, 0, 10),您会看到即使点数仍然相同(100),绿色的locpoly线条也会变得更加波动。 locfit的平滑参数h与比例无关,而是基于数据的一部分。值0.05表示使用最接近该位置的5%数据来拟合曲线。因此,改变比例尺不会改变线条。
这也解释了评论中提到的将h的值更改为0.1使得两者看起来几乎相同的观察结果。这很有道理,因为如果我们在从0到1均匀分布的100个点上进行操作,则带宽为0.05将包含约10%的数据。
我的资料包括locfit软件包的文档locpoly函数的文档

当x比例尺改变时,两条线的平滑度都会改变。locfit::lp的文档也与这个答案相矛盾。 - wmay

0

我稍微修改了你的代码,这样我们就可以更清楚地看到实际窗口宽度:

library(KernSmooth)
library(locfit)
x <- seq(.1, .9, length.out = 80)
y <- rep(0:1, each = 40)
plot(x, y)
lines(locpoly(x, y, bandwidth=0.1, degree=1), col=3)
lines(locfit(y ~ lp(x, nn=0, h=0.1, deg=1)), col=4)

enter image description here

locfit 中的参数 h 看起来是半窗宽度。而 locpoly带宽 显然在做其他事情。

KernSmooth 的文档非常模棱两可,但根据源代码(这里这里)的判断,它看起来像是正态密度函数的标准差。希望在他们引用的《核平滑》一书中有解释。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接