从平滑数据中查找 R 中的拐点

机器算法验证 r 平滑 黄土
2022-01-18 02:48:07

我有一些数据可以平滑使用loess我想找到平滑线的拐点。这可能吗?我敢肯定,有人已经提出了一种奇特的方法来解决这个问题……我的意思是……毕竟,它是 R!

我可以更改我使用的平滑功能。我只是用过loess,因为那是我过去使用过的。但是任何平滑功能都可以。我确实意识到拐点将取决于我使用的平滑函数。我没关系。我想开始使用任何可以帮助吐出拐点的平滑功能。

这是我使用的代码:

x = seq(1,15)
y = c(4,5,6,5,5,6,7,8,7,7,6,6,7,8,9)
plot(x,y,type="l",ylim=c(3,10))
lo <- loess(y~x)
xl <- seq(min(x),max(x), (max(x) - min(x))/1000)
out = predict(lo,xl)
lines(xl, out, col='red', lwd=2)

在此处输入图像描述

4个回答

从使用 R 查找平滑曲线中的拐点的角度来看,您只需找到平滑 y 值中 y 的变化切换符号的那些位置。

infl <- c(FALSE, diff(diff(out)>0)!=0)

然后,您可以在出现这些拐点的图形中添加点。

points(xl[infl ], out[infl ], col="blue")

从寻找具有统计意义的拐点的角度来看,我同意@nico 的观点,即您应该研究变化点分析,有时也称为分段回归。

这里有几个层面的问题。

首先,黄土恰好更光滑,有很多很多可供选择。乐观主义者认为,几乎所有合理的平滑器都会找到真实的模式,并且几乎所有合理的平滑器都同意真实的模式。悲观主义者认为这就是问题所在,“合理的平滑器”和“真实模式”在这里是相互定义的。说到点子上,为什么黄土和为什么你认为这里是一个不错的选择?选择不仅仅是单个平滑器或平滑器的单个实现(并非所有以 loess 或 lowess 为名的软件在软件中都是相同的),还包括单个平滑度(即使是由你的例行公事)。你确实提到了这一点,但这并没有解决它。

更具体地说,正如您的玩具示例所示,黄土可能很容易无法保留转折点等基本特征(也不是单独列出黄土)。你的第一个局部最小值消失了,你的第二个局部最小值被你显示的特殊平滑所取代。可以预期由二阶导数的零点而不是一阶导数定义的拐点会更加变化无常。

有很多很好的方法可以解决这个问题。有些包括。(1)-changepoint-包(2)-分段-包。但是您需要选择变更点的数量。(3) 在 -earth- 包中实现的 MARS

根据您的偏差/方差权衡,所有这些都会为您提供略有不同的信息。-segmented-非常值得一看。不同数量的变点模型可以与 AIC/BIC 进行比较

你也许可以使用 fda 库,一旦你估计了一个合适的连续函数,你就可以很容易地找到二阶导数为零的地方。

FDA CRAN

FDA介绍