我试图理解这两个平滑函数在给定明显等价的输入时的不同行为。我的理解是,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)产生这个情节:

locpoly给出光滑的绿线,locfit给出摇摇欲坠的蓝线。显然,locfit在这里有一个较小的“有效”带宽,尽管假定的带宽参数对每个参数都具有相同的值。
这些功能有什么不同?
发布于 2018-10-21 21:05:24
这两个参数都代表平滑,但它们有两种不同的方式。
局部多面体的带宽参数与x轴的尺度有关。例如,如果将行x <- runif(n, 0, 1)更改为x <- runif(n, 0, 10),则会看到绿色的locpoly变得更加笨拙,尽管您仍然拥有相同的点数(100)。
局部拟合的平滑参数h与尺度无关,而是基于一定比例的数据。值0.05意味着最接近该位置的数据的5%用于拟合曲线。因此,改变规模不会改变这条线。
这也解释了注释中的观察,即将h的值更改为0.1,使两者看起来几乎相同。这是有意义的,因为如果我们有100点均匀分布在0到1之间,那么0.05的带宽将包含大约10%的数据。
我的消息来源包括locfit包的文档和locpoly的文档。
发布于 2021-02-03 05:55:08
我稍微修改了您的代码,这样我们就可以更清楚地看到实际的窗口宽度:
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)

来自h的参数locfit显示为半窗口宽度。locpoly的bandwidth显然在做其他的事情。
KernSmooth的文档非常模糊,但从源代码(这里和这里)来看,带宽似乎是正常密度函数的标准差。希望这在他们引用的内核平滑书中得到解释。
https://stackoverflow.com/questions/28286638
复制相似问题