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

如何在R语言中调整loess拟合曲线的斜率(如增减50%)

调整Loess拟合曲线的斜率(整体缩放陡峭程度)

要实现Loess拟合曲线的斜率整体缩放(比如增减50%),同时保持曲线形状,核心思路是调整曲线的导数(斜率)后重新积分,具体步骤和R代码如下:

1. 原数据与Loess拟合

先还原初始代码,确保拟合曲线正常生成:

x <- c(0,5,10,15,20,24,30,35,40,45,49,54,59,64,69,74,79,85,90,94,100) 
y <- c(0,0,0,0,1,3,5,8,11,16,23,29,37,44,52,59,68,76,84,91,100)

# 拟合Loess模型
fit <- loess(y ~ x, control=loess.control(surface="direct"))
xn <- seq(0, 100, by=1)  # 生成更密集的x序列用于平滑拟合
fitline <- predict(fit, newdata=data.frame(x=xn))

2. 斜率缩放的核心实现

通过Loess模型的导数预测功能,直接获取每个点的斜率,缩放后积分得到新曲线:

# 1. 计算原拟合曲线的导数(每个x点的斜率)
dy_dx <- predict(fit, newdata=data.frame(x=xn), deriv=1)

# 2. 定义斜率缩放因子:1.5=斜率增加50%,0.5=斜率减少50%
slope_scale <- 1.5

# 3. 缩放所有点的斜率
dy_dx_scaled <- dy_dx * slope_scale

# 4. 对缩放后的斜率积分,生成新的y值(保证起点与原曲线一致:x=0时y=0)
step_size <- xn[2] - xn[1]  # x序列的步长,这里是1
y_scaled <- c(0, cumsum(dy_dx_scaled[-1]) * step_size)

# 可选:如果需要让终点与原曲线对齐(比如原曲线终点y=100),添加以下代码
# y_scaled <- y_scaled * (fitline[length(fitline)] / y_scaled[length(y_scaled)])

3. 可视化对比

将原曲线、原始数据点和斜率调整后的曲线画在一起,验证效果:

plot(xn, fitline, type="l", lwd=2, col="blue", 
     xlab="x", ylab="y", main="原曲线与斜率缩放后的曲线")
lines(xn, y_scaled, lwd=2, col="red", lty=2)
points(x, y, pch=16, col="black")
legend("topleft", 
       legend=c("原Loess拟合曲线", paste0("斜率缩放", slope_scale*100, "%")),
       col=c("blue", "red"), lty=c(1,2), lwd=2)

关键说明

  • 用predict(..., deriv=1)直接获取Loess模型的导数,比用diff()做差分更平滑,符合Loess局部平滑的特性。
  • 积分时通过累积和(cumsum)近似,步长匹配x序列的间隔,保证曲线形状的连续性。
  • 可选的终点对齐步骤可以让调整后的曲线和原曲线在x=100处保持相同的y值,仅改变中间的陡峭程度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:20:25