You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何R语言中locpoly与ksmooth的核回归结果存在差异?

为什么ksmooth与locpoly(degree=0)的核回归结果不同

在R语言中,即使将locpoly的degree设为0(对应核加权平均,理论上与ksmooth的核回归逻辑一致),两者输出结果仍会存在明显差异,核心原因在于带宽参数的定义不同以及计算细节的差异:

1. 带宽参数的定义差异

  • ksmooth的bandwidth参数直接对应正态核的标准差:使用的核函数为 $K(u) = \exp(-\frac{u^2}{2})$,其中 $u = \frac{x_i - x_0}{\text{bandwidth}}$,最终通过局部权重归一化的加权平均得到预测值。
  • locpoly的bandwidth参数对应正态核的有效带宽,与标准差的转换关系为:$\text{标准差} = \frac{\text{bandwidth}}{\sqrt{\pi/2}} \approx \frac{\text{bandwidth}}{1.2533}$。也就是说,若要让locpoly使用与ksmooth相同的核标准差,需要将locpoly的bandwidth参数乘以$\sqrt{\pi/2}$,或者将ksmooth的bandwidth除以该系数。

2. 计算细节的差异

  • locpoly默认会对数据进行分箱(binned=TRUE),即使数据集较小时也可能通过分箱近似计算核权重,而ksmooth始终使用精确的点-wise核权重计算。分箱操作会引入微小的近似误差,导致结果偏差。
  • 两者对核函数的全局归一化处理逻辑略有不同:locpoly会确保核函数在全局范围内积分至1,而ksmooth仅对每个预测点的权重进行局部归一化(本质等价,但极端情况下可能存在数值差异)。

验证与修正

以你的测试数据为例,若要让locpoly输出与ksmooth一致的结果,需要调整带宽参数并关闭分箱:

#install.packages("KernSmooth")
library(KernSmooth)

x <- c(1, 2, 3, 4, 5, 6, 7, 8, 9)
y <- c(40, 46, 64, 93, 34, 64, 92, 94, 63)

yy1 <- ksmooth(x, y, kernel = "normal", bandwidth = 2, x.points = x)$y
# [1] 42.13168 49.31186 65.62029 72.85509 54.53128 64.40078 85.13549 86.31581 72.26733

# 调整带宽匹配ksmooth的标准差定义,关闭分箱
yy2_aligned <- locpoly(x, y, bandwidth = 2 / sqrt(pi/2), kernel = "normal", 
                       gridsize = 9, range.x = c(1, 9), degree = 0, binned=FALSE)$y
# 此时yy2_aligned将与yy1基本一致

内容的提问来源于stack exchange,提问作者Anthony Tan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 15:30:51