【问题标题】:Local linear regression in R -- locfit() vs locpoly()R中的局部线性回归——locfit() vs locpoly()
【发布时间】:2015-04-01 22:11:02
【问题描述】:

当给定明显等效的输入时,我试图了解这两个平滑函数的不同行为。我的理解是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 在此处具有较小的“有效”带宽,即使假定的带宽参数对于每个参数具有相同的值。

这些函数有何不同?

【问题讨论】:

  • 不知何故,当 h 的带宽在 lines(locfit(y ~ lp(x, nn=0, h=0.05, deg=1)), col=4) 中更改为 0.10 时,两个平滑函数几乎相同
  • 你看到this discussion了吗?

标签: r regression smoothing


【解决方案1】:

这两个参数都表示平滑,但它们以两种不同的方式实现。

locpoly 的 bandwidth 参数在这里是相对于 x 轴的比例。例如,如果您将线 x &lt;- runif(n, 0, 1) 更改为 x &lt;- runif(n, 0, 10),您会看到绿色的 locpoly 线变得更加弯曲,尽管您仍然拥有相同数量的点 (100)。

locfit 的 smoothing 参数 h 与比例无关,而是基于数据的一部分。值 0.05 表示最接近该位置的数据的 5% 用于拟合曲线。所以改变比例不会改变线条。

这也解释了评论中的观察结果,即将 h 的值更改为 0.1 会使两者看起来几乎相同。这是有道理的,因为如果我们有 100 个点从 0 到 1 均匀分布,我们可以预期 0.05 的带宽将包含大约 10% 的数据。

我的来源包括documentation for the locfit packagedocumentation for the locpoly function

【讨论】:

  • 当 x 比例改变时,两条线的平滑度都会改变。 locfit::lp 的文档也与此答案相矛盾。
【解决方案2】:

我稍微更改了您的代码,以便我们可以更清楚地看到实际的窗口宽度:

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)

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

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

【讨论】:

    猜你喜欢
    • 2012-05-17
    • 1970-01-01
    • 2013-02-11
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 2018-04-28
    • 2023-03-11
    • 2021-07-02
    相关资源
    最近更新 更多