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

如何编写函数获取loess平滑曲线中最大Y值对应的x值?

解决loess平滑曲线峰值对应x值的问题

嗨~我来帮你修正这个函数,你当前的代码问题在于找的是原始数据y的最大值对应的x,而不是loess平滑曲线的峰值对应的x,这就和你想要的结果不符啦。

错误原因分析

你的原代码:

myFmsy<-function(x,y){ 
  model <- loess(y ~ x,span = 0.4) 
  return(x[which(y==max(y))]) 
}

这里的max(y)取的是输入的原始y数据的最大值,完全没有用到loess模型拟合出的平滑曲线结果,自然得不到你想要的平滑曲线峰值对应的x。

修正方案一:用密集x序列精准定位峰值(推荐)

为了更准确找到平滑曲线的峰值,我们可以生成覆盖原始x范围的密集x序列,用loess模型预测这些x对应的平滑y值,再找到最大值对应的x:

myFmsy <- function(x, y) {
  # 拟合loess平滑模型
  model <- loess(y ~ x, span = 0.4)
  
  # 生成覆盖原始x范围的密集x序列,length.out可调整精度
  x_dense <- seq(min(x), max(x), length.out = 1000)
  
  # 预测密集x对应的平滑y值
  y_smooth <- predict(model, newdata = data.frame(x = x_dense))
  
  # 返回平滑y值最大对应的x
  return(x_dense[which.max(y_smooth)])
}

这个方法的优势在于:原始数据的x可能间隔较大,平滑曲线的峰值未必刚好落在原始x点上,密集x序列能帮我们更精准地捕捉到峰值位置。

修正方案二:基于原始x的拟合值查找

如果你只需要基于原始x对应的平滑拟合值来找最大值,也可以用以下代码(精度略低):

myFmsy <- function(x, y) {
  model <- loess(y ~ x, span = 0.4)
  
  # 获取原始x对应的平滑拟合y值
  y_fitted <- fitted(model)
  
  # 返回拟合y值最大对应的原始x
  return(x[which.max(y_fitted)])
}

内容的提问来源于stack exchange,提问作者Oscar-fr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:53:04