问题描述
在 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 应该使用居中滚动窗口。
解决方法
两个建议:
-
根据@IceCreamToucan 的评论,由于宽度为 20,您将
==2
用作10
或11
可能更合适。 -
为了缓解确定 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
更有意义。我可能错了,这只是猜测:-)