R - locfit()与locpoly()的局部线性回归

时间:2015-02-02 16:16:51

标签: r regression smoothing

当我给出明显等效的输入时,我试图理解这两个平滑函数的不同行为。我的理解是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)

制作此情节:

plot of smoothers

locpoly给出平滑的绿线,locfit给出摇摆的蓝线。很明显,locfit有一个更小的&#34;有效的&#34;这里的带宽,即使假设的带宽参数对每个带宽都相同。

这些功能有何不同?

2 个答案:

答案 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 packagedocumentation 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)

enter image description here

来自 h 的参数 locfit 似乎是半窗口宽度。 locpolybandwidth 显然在做其他事情。

KernSmooth 的文档非常含糊,但从源代码(herehere)来看,看起来带宽是正常密度函数的标准偏差。希望他们引用的内核平滑一书中对此进行了解释。