向量化计算R中移动平均线的差异?

时间:2015-03-24 19:27:21

标签: r vectorization apply

我有一个向量,对于该向量中的每个点,我想计算紧接该点之前的某些点范围的平均值减去该点之后的某些点的平均值之间的差异。我用for循环完成了这个,因为filter似乎没有一个选项可以在向量点之后专门应用于点(参数sides =只有1或2)并且因为我不知道如何将一个apply语句,因为我需要一个函数,它使用它在向量中的位置而不仅仅是它自己的值来操作每个点。有人能给我指路吗?

以下是我使用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")

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

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

P.S。我看到有人想将此标记为Calculating moving average in R的重复但是我的问题是不同的,因为该问题的答案(使用roll_mean或过滤器)不适用于此而不进行修改。如果有一种方法可以使用roll_mean或过滤器,我无法从文档中得知,并且会感谢有人告诉我如何使用其中任何一种来计算前瞻性移动平均线而不是后向移动平均线。再次感谢。

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分:0)

行。我有一个解决方案,但我已经修改了你的代码,以便从(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个值吗?)