当我给出明显等效的输入时,我试图理解这两个平滑函数的不同行为。我的理解是locpoly
只需要一个固定的带宽参数,而locfit
也可以在其平滑参数中包含一个变化的部分(最近邻居分数," nn
&# 34)。我想在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
有一个更小的&#34;有效的&#34;这里的带宽,即使假设的带宽参数对每个带宽都相同。
这些功能有何不同?
答案 0 :(得分:1)
这两个参数都代表平滑,但是它们以两种不同的方式实现。
locpoly的 bandwidth 参数相对于此处x轴的比例。例如,如果将线x <- runif(n, 0, 1)
更改为x <- runif(n, 0, 10)
,尽管您仍然拥有相同的点数(100),您会发现绿色的locpoly线变得更加弯曲。 >
locfit的 smoothing 参数h与比例尺无关,而是基于一部分数据。值0.05表示最接近该位置的数据的5%用于拟合曲线。因此,更改比例不会改变线条。
这也解释了注释中的观察结果,即将h的值更改为0.1会使两者看起来几乎相同。这是有道理的,因为如果我们有100个点从0到1均匀分布,那么我们可以预期0.05的带宽将包含大约10%的数据。
我的消息来源包括documentation for the locfit package和documentation for the locpoly function。
答案 1 :(得分: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)
来自 h
的参数 locfit
似乎是半窗口宽度。 locpoly
的 bandwidth
显然在做其他事情。
KernSmooth 的文档非常含糊,但从源代码(here 和 here)来看,看起来带宽是正常密度函数的标准偏差。希望他们引用的内核平滑一书中对此进行了解释。