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

How to find local minima with the rollapply function?

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])

绘制结果给出:

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

两条建议:

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

  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])

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