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


14

我有一些可以平滑使用的数据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)

在此处输入图片说明


3
也许您想看看变更点分析
nico

我发现这行代码非常有用:infl <-c(FALSE,diff(diff(out)> 0)!= 0)但是此代码找到所有转折点,无论它向上还是向下。如何知道时间序列中哪些点向上弯曲和哪些向下弯曲?例如,将向上转折点绘制为绿色,将向下转折点绘制为红色。
user3511894

Answers:


14

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

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

然后,您可以将点添加到图形中发生这些拐点的位置。

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

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


这似乎做得很好。我知道这并不理想,而且给出的结果当然也不理想。谢谢您的贡献。它涵盖了除直线之类的大多数情况。
user164846

3
我不确定我是否理解,@ user164846。一条直线没有拐点。
让五世·亚当斯

另外,您可能想看看立即提供导数的平滑器,例如Savitzky-Golay滤波器。但是,平滑器的选择应始终由您的数据和应用程序决定,而不是相反!
cbeleites对SX 2014年

4

这里有几个层面的问题。

首先,黄土恰好是光滑的,有很多很多选择。乐观主义者认为,几乎任何合理的平滑器都会找到真实的模式,几乎所有合理的平滑器都同意真实的模式。悲观主义者认为这是问题所在,在这里,“合理的平滑器”和“实际模式”是相互定义的。到目前为止,为什么黄土以及为什么您认为这里是个好选择?选择不仅是单个平滑器或平滑器的单个实现(并非黄土或低矮名称在软件中都是相同的),而且还包括单个平滑度(即使是由平滑器选择的)常规)。您确实提到了这一点,但并没有解决。

更具体地说,如您的玩具示例所示,黄土可能不容易保留转折点之类的基本特征(也不能单独提取黄土)。您的第一个局部最小值消失了,而您的第二个局部最小值被显示的特定平滑所取代。由二阶导数而不是一阶导数的零点定义的拐点可以变幻无常。


我选择黄土是因为我是从互联网上获取的。一般而言,我在平滑方面非常有经验,因此我只是在线上获取了代码。您有更好的建议吗?
user164846

抱歉,我不明白您的评论。如果您在平滑方面有丰富的经验,则应该对哪些平滑器在抑制噪声的同时最大程度地保留弯曲度有争议。对我来说,这似乎是一个矛盾的目标,但是我很高兴听到技术上的争论,为什么我错了。
尼克·考克斯

抱歉,我不是说“没有经验”哈哈
user164846

1
我知道了。生命很短暂,您无法尝试所有可能的方法。我们看不到您的真实数据,但是您的玩具示例确实强调了平滑可以删除可识别的结构。
Nick Cox

2

有很多解决此问题的方法。一些包括。(1)-更改点-程序包(2)-分段-程序包。但是您需要选择更改点的数量。(3)-earth软件包中实现的MARS

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


1

您也许可以使用fda库,并且一旦估计了适当的连续函数,就可以轻松地找到二阶导数为零的位置。

FDA CRAN

FDA简介


一阶导数的零点定义了最小值和最大值。我想你的意思是第二。什么是“轻松”?有多种方法可以区分数值。
Nick Cox

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.