如何使用 rollapply 函数找到局部最小值?

问题描述

this answer 之后,我试图找到函数的局部最小值。这是我正在做的:

require(ggplot2)
require(zoo)

x <- seq(0,25,by=0.1)
y <- sin(x)

my.df <- data.frame(x,y)

xz <- as.zoo(y)
rxz <- zoo::rollapply(xz,width = 20,align = "center",function(x) which.min(x)==2)

indexes <- index(rxz)[coredata(rxz)]
indexes

ggplot(my.df,aes(x,y)) + geom_line() + geom_vline(xintercept = my.df$x[indexes])

绘制结果给出:

enter image description here

我猜 x 偏移是由于我使用的宽度,但无法弄清楚为什么会发生这种情况,因为 rollapply 应该使用居中滚动窗口。

解决方法

两个建议:

  1. 根据@IceCreamToucan 的评论,由于宽度为 20,您将 ==2 用作 1011 可能更合适。

  2. 为了缓解确定 10 或 11 中哪一个更合适的问题(因为您有偶数宽度的内核),我建议使用奇数宽度的内核。

wid <- 21L
ceiling(wid/2)
# [1] 11
rxz <- zoo::rollapply(y,width = 21,align = "center",function(x) which.min(x) == ceiling(wid/2),fill = FALSE)
ggplot(my.df,aes(x,y)) + geom_line() + geom_vline(xintercept = x[rxz])

ggplot2 highlighting local minima

请注意,我有意以编程方式设置宽度,以排除 rollapply 和内部函数调用之间出现不一致的可能性。 (我推断这可能是您遇到的情况:您最初的宽度为 3 或 4,其中 == 2 更有意义。我可能错了,这只是猜测:-)