为何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
相关产品推荐
相关产品推荐

