【问题标题】:Calculating moving average in R在R中计算移动平均线
【发布时间】:2020-02-04 02:12:45
【问题描述】:

我一直在尝试计算 R 中向量的移动平均值。理想情况下,我想编写一个函数来计算任意数量滞后的 MA。我必须编码的数学步骤是: 1. 为每列创建一个具有 1:k 滞后的数据集。 2. 对行求和 3.除以2k+1

我现在被困在第 2 步。我可以评估 2 个滞后的总和,但是为多个滞后创建一个公式非常麻烦。

这就是我现在的位置。

我已经利用代码来计算滞后

lagpad <- function(x, k) {
  if (k>0) {
    return (c(rep(NA, k), x)[1 : length(x)] );
  }
  else {
    return (c(x[(-k+1) : length(x)], rep(NA, -k)));
  }
}

假设我在以下向量上计算 MA:

i<-1:50
rowSums(cbind(lagpad(i,1)[1:length(i)], lagpad(i,2)[1:length(i)]))

这适用于 2。但如果我想计算 20 滞后的 MA,我将不得不 cbind 20 列。有没有更快的方法来做这个/写这个函数?

谢谢

【问题讨论】:

  • 你真的想写一个函数还是将函数rollmean放在zoo包里写?
  • 我想写一个函数来实现它

标签: r statistics moving-average


【解决方案1】:

这是一个使用累积和差异的简单函数...

x <- 1:10

mav <- function(x, k){
  y <- c(0, cumsum(x))    #cumulative sums of x
  z <- y[-c(1:k)]         #discard first k values
  length(y) <- length(z)  #discard last k values of y
  return((z - y) / k)
}

mav(x,2)
[1] 1.5 2.5 3.5 4.5 5.5 6.5 7.5 8.5 9.5

mav(x,1)
[1]  1  2  3  4  5  6  7  8  9 10

mav(x,4)
[1] 2.5 3.5 4.5 5.5 6.5 7.5 8.5

【讨论】:

  • 这是一个很好的简短定义,在大多数情况下可能已经足够好了。请注意,数字稳定性对于“大”数字之后的所有“小”数字都是不利的。例如其中x = 10^(10:-10) 最后几个元素将被截断为零,并在此之前出现舍入错误。 @dexter 这些微妙的问题是您真正希望尽可能使用库代码的原因!
猜你喜欢
  • 1970-01-01
  • 2014-11-18
  • 2012-01-21
  • 2011-07-14
  • 2010-09-22
相关资源
最近更新 更多