如何使用 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。
两条建议:
根据@IceCreamToucan 的评论,您使用 ==2
可能更适合 10
或 11
,因为您的宽度为 20。
为了解决确定 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
更有意义。我可能是错的,这只是一个猜测:-)
在 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。
两条建议:
根据@IceCreamToucan 的评论,您使用
==2
可能更适合10
或11
,因为您的宽度为 20。为了解决确定 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
更有意义。我可能是错的,这只是一个猜测:-)