【问题标题】:vectorize computation of difference of moving averages in R?向量化计算R中移动平均线的差异?
【发布时间】:2015-03-24 19:27:20
【问题描述】:

我有一个向量,对于该向量中的每个点,我想计算该点之前某个点范围的平均值减去该点之后某个点范围的平均值之间的差。我已经使用 for 循环完成了此操作,因为 filter 似乎没有选项专门应用于矢量点之后的点(参数边 = 仅 1 或 2),并且因为我不知道如何将其硬塞到 @ 987654323@ 语句,因为我需要一个函数,该函数使用它在向量中的位置而不只是它自己的值对每个点进行操作。谁能给我指路?

这是我使用 for 循环的方法:

x = rep(c(1,1,1,1,1,10), 20)
x = x + 100
x = x - c(1:length(x))
lookahead = 4
y = x

for(i in (lookahead):(length(x)-lookahead))
{
y[i] = mean(x[(i-lookahead):i]) - mean(x[i:(i+lookahead)])
}
plot(x)
lines(y, col="red")

您可以从图中看到目标是什么:识别尖峰(但不,我不想被告知其他查找尖峰的方法,我想使用我的简单 boxcar 移动平均法)。

必须有更好的方法来计算这个向量。感谢您的任何建议。

附言我看到有人想将此标记为 Calculating moving average in R 的重复,但是我的问题有所不同,因为该问题的答案(使用 roll_mean 或过滤器)在未经修改的情况下不适用于此处。如果有使用 roll_mean 或 filter 的方法,我无法从文档中得知,如果有人告诉我如何使用其中任何一个来计算前瞻性移动平均线而不是向后移动平均线,我将不胜感激。再次感谢。

【问题讨论】:

  • 你能用你的代码添加一个例子吗
  • 还有一些数据...?datasets中的大量时间序列
  • @Gregor 我刚刚生成了一些非常简单的数据/代码来使用。
  • @rawr 完整示例可以从我粘贴到原始帖子中的行中运行。感谢您的任何建议。
  • 我不认为你得到了 4 个值的平均值:i:i+lookahead 是一个值。我认为您需要使用i:(i+lookahead) 也需要使用(i-lookahead):i: 运算符优先于+-。)

标签: r vectorization apply


【解决方案1】:

您的过程的问题是它从i=4 开始,子集x[0:4] R 自动修剪0 索引。

y1 = RcppRoll::roll_mean(x, 5)
y1 = c(rep(NA, 4), y1) - c(y1, rep(NA, 4)) # you can use y1 = lag(y1, 4) - y1 instead if you have dplyr
# fill NA positions
y1[1:4]=x[1:4] 
y1[116:120]=x[116:120]

y1y 的不同之处仅在于您的循环有问题的位置 4 和 116。

如果您无法访问 RcppRoll,则可以使用embed(比zoo::rollmean 快)。

y1 = rowMeans(embed(x, 5)) #slightly slower than roll_mean
y1 = c(rep(NA, 4), y1) - c(y1, rep(NA, 4)) # you can use y1 = lag(y1, 4) - y1 instead if you have dplyr
# fill NA positions
y1[1:4]=x[1:4] 
y1[116:120]=x[116:120]

【讨论】:

    【解决方案2】:

    好的。但是,我有一个解决方案,我已将循环代码修改为从 (lookahead+1):(length(x)-lookahead) 开始。这样一来,第一个平均值就是 5 个值的平均值,就像其他所有值一样。

    计算 5 个值的平均值的向量:

    lastIndexInY <- length(x)-lookahead 
    Y_ave <- (x[ 1:lastIndexInY ] + x[ 1:lastIndexInY +1] + x[ 1:lastIndexInY +2] + x[ 1:lastIndexInY +3]+ x[ 1:lastIndexInY +4] )/5
    

    那么你的结果 y 是一样的:

    y_vec  <- c(x[1:4], Y_ave[1:(length(Y_ave)-4)] - Y_ave[5:length(Y_ave) ] ,  x[-3:0 + length(x)]  )
    
    all(y - y_vec == 0 )
    [1] TRUE
    

    (您确定需要保留 x 的前 4 个和后 4 个值吗?)

    【讨论】:

      猜你喜欢
      • 2020-02-04
      • 1970-01-01
      • 1970-01-01
      • 2014-05-16
      • 2014-11-18
      相关资源
      最近更新 更多