使用R中的滤波器函数进行EMA计算

Adi*_*hag 3 filtering r vector

我想用矢量化表示法重现这段代码

getEMA2<-function(x,win){
k<-2/(win+1)
v<-vector()
for (i in 1:length(x)){
    if (i==1){
        v[i]<-x[i]
    }
    else{
        v[i]<-k*x[i]+(1-k)*v[i-1]
    }
}
return (v)
}
testOutput<-getEMA2(rnorm(100,0,1),5)
Run Code Online (Sandbox Code Playgroud)

我尝试过使用过滤器功能,但似乎没有递归/卷积方法可以实现这一点

谢谢你的回复,

Vin*_*ynd 7

filter计算

y[n] = x[n] + alpha * y[n-1]
Run Code Online (Sandbox Code Playgroud)

你需要重新调整结果.

f <- function(x,win) {
  alpha <- 2/(win+1)
  filter(x, 1-alpha, method="recursive", side=1, init=x[1]/alpha)*alpha
}
x <- 1:10
k <- 3
getEMA2(x,k)
f(x,k) # identical
Run Code Online (Sandbox Code Playgroud)

大多数过滤器已在TTR包中定义.