计算移动平均数

我试图用R来计算matrix中一系列值的移动平均值。 正常的R邮件列表search并不是很有帮助。 在R中似乎没有内置函数可以让我计算移动平均线。 做任何包提供一个? 还是我需要写我自己的?

  • 动物园包装中的滚动手段/最大值/ Median(rollmean)
  • 移动平均在TTR
  • ma 预测

或者你可以简单地使用filter来计算它,下面是我使用的函数:

ma <- function(x,n=5){filter(x,rep(1/n,n), sides=2)}

使用cumsum应该是足够和有效的。 假设你有一个向量x,并且你想要一个运行总和的n个数字

 cx <- cumsum(x) rsum <- (cx[(n+1):length(x)] - cx[1:(length(x) - n)]) / n 

您可以使用RcppRoll快速移动以C ++编写的平均值。 只要调用roll_mean函数。 文档可以在这里find。

否则,这(慢)for循环应该做的伎俩。

 ma <- function(arr, n=15){ res = arr for(i in n:length(arr)){ res[i] = mean(arr[(in):i]) } res } 

其实RcppRoll非常好。

呗发布的代码必须在第四行更正到窗口被修正:

 ma <- function(arr, n=15){ res = arr for(i in n:length(arr)){ res[i] = mean(arr[(i-n+1):i]) } res } 

另一种处理错误的方法在这里给出。

第三种方法,改善鳕鱼这个代码来计算部分平均值,如下:

  ma <- function(x, n=2,parcial=TRUE){ res = x #set the first values if (parcial==TRUE){ for(i in 1:length(x)){ t<-max(i-n+1,1) res[i] = mean(x[t:i]) } res }else{ for(i in 1:length(x)){ t<-max(i-n+1,1) res[i] = mean(x[t:i]) } res[-c(seq(1,n-1,1))] #remove the n-1 first,ie, res[c(-3,-4,...)] } } 

caTools软件包具有非常快速的平均/分钟/最大/ SD和其他function。 我只和runsd一起工作过,他们是迄今为止提到的其他软件包中速度最快的。

这里列出的所有选项都是因果移动平均线。 如果需要非因果版本,那么包信号有一些选项。

为了补充鳕鱼和罗德里戈· 雷梅迪奥的答案,

 moving_fun <- function(x, w, FUN, ...) { # x: a double vector # w: the length of the window, ie, the section of the vector selected to apply FUN # FUN: a function that takes a vector and return a summarize value, eg, mean, sum, etc. # Given a double type vector apply a FUN over a moving window from left to the right, # when a window boundary is not a legal section, ie lower_bound and i (upper bound) # are not contained in the length of the vector, return a NA_real_ if (w < 1) { stop("The length of the window 'w' must be greater than 0") } output <- x for (i in 1:length(x)) { # plus 1 because the index is inclusive with the upper_bound 'i' lower_bound <- i - w + 1 if (lower_bound < 1) { output[i] <- NA_real_ } else { output[i] <- FUN(x[lower_bound:i, ...]) } } output } # example v <- seq(1:10) # compute a MA(2) moving_fun(v, 2, mean) # compute moving sum of two periods moving_fun(v, 2, sum) 
Interesting Posts