如何编写函数获取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
相关产品推荐
相关产品推荐

