R中使用lowess平滑data.table列出现异常结果的问题咨询
Q1:lowess平滑结果不符合预期的原因
lowess函数返回的平滑结果是按x值升序排序后的坐标对,若输入的原数据x不是严格升序排列,直接将返回的$y赋值给原数据表会出现值错位,导致平滑线完全偏离原始点(你当前测试数据的x是升序的,所以没有触发这个问题)。- 你设置的窗口参数
f=0.1过小,该参数控制每次拟合的邻域样本占总样本的比例,61个样本时仅用6个左右的点做局部拟合。边界点(尤其是右边界)只能使用单侧邻域点拟合,邻域样本量不足导致拟合结果波动极大,出现了不符合趋势的尖峰。
Q2:替代平滑方案推荐
你可以选择以下两种常用的平滑函数,都能有效避免边界尖峰问题:
方案1:loess函数(局部加权回归的升级版)
loess支持直接按原数据顺序返回预测值,不需要担心排序问题,边界鲁棒性更好:
library(data.table) library(ggplot2) # 拟合loess模型,span参数对应lowess的f参数,调整到0.15左右兼顾贴合度和平滑性 loess_mod <- loess(y ~ x, data = test_dt, span = 0.15) test_dt[, z := predict(loess_mod, newdata = test_dt)] # 绘图验证 ggplot(test_dt) + geom_point(aes(x, y)) + geom_line(aes(x, z), color = "red")
方案2:smooth.spline平滑样条
平滑样条通过惩罚项控制平滑度,对边界的处理天然更稳定,不需要手动设置窗口大小:
# 拟合平滑样条,spar参数控制平滑程度,数值越大越平滑 spline_mod <- smooth.spline(x = test_dt$x, y = test_dt$y, spar = 0.5) test_dt[, z := predict(spline_mod, x = test_dt$x)$y]
内容的提问来源于stack exchange,提问作者Saurabh
相关产品推荐
相关产品推荐

