计算移动平均值,不包括 R 中的中间值

Calculating Moving Average, excluding middle value in R

我在 R 中使用 rollmean 来计算移动平均值:

> x = c(3, 8, 12, 5, 9, 6, 8)
> rollmean(x, 7)
[1] 7.285714

Rollmean 采用奇数输入并计算移动平均线,包括中间值(在本例中为 5)。但是我想知道是否有一个函数可以计算围绕一个值的 MA,排除它,以便评估围绕中间值的影响。用这个例子,平均3+8+12+9+6+8,不包括中间值5.

如果有可用的功能,我的偏好是避免编写复杂的函数。

谢谢!

您可以使用 rollapply(它允许您将自定义函数应用于滚动 window)并编写一个简单的函数来排除中间值。例如:

my_mean = function(x) {
  if(length(x) %% 2 == 0L) { return(mean(x)) }
  if(length(x) %% 2 == 1L) { return(mean(x[-ceiling(0.5*length(x))])) }
}

# Fake data
set.seed(5)
values = cumsum(rnorm(20))

library(zoo)

rollapply(values, width=5, FUN=my_mean)
[1]  0.032599697  0.341949790 -0.223156076 -0.054644590 -0.007797604 -0.313482549 -0.248932331 -0.372755845
[9] -0.880215212 -0.848262308 -1.049123185 -1.822352744 -2.315909292 -3.318552855 -4.107026776 -4.295736122