我正在尝试过滤时间/位置数据系列以生成平滑的图。我正在测量深度与时间(机械系统)的速度变化。我从测量的深度/时间值计算速度并且可以绘制速度与深度的关系,但是在低速时,噪声过大(由于各种原因)。低速时的趋势是正确的,但我希望能够应用一个使用自适应平滑程序的滤波器,即低速(我有很多数据点)我需要使用更大的平滑窗口,对于高速(几个数据点),我需要使用一个较小的窗口。
我看了一下并且已经找到了使用rollapply()的解决方案但是想知道是否还有其他方法。特别是,我不清楚如何“矢量化”一个操作。我是一个相对较新的编码器,所以如果我的代码有点业余,我很抱歉。我的解决方案如下:
adapt<-function(x,wmin,wmax) {
# adapt takes a vector of calculated velocities (x), a minimum window size (wmin),
# and a maximum window size (wmax). It returns a vector of filtered velocities
#
x<-ifelse(is.na(x),0,x) # check for na values
x<-ifelse(is.infinite(1/x),1/wmax,x) # check for infinite values
x<-runmed(x,11) # smooth raw velocities using 11 point window
wins<-ceiling(ifelse(is.infinite(1/x),wmin,1+wmax/(1+x)^15)) # set window widths
wins<-ifelse(wins<=wmin,wmin,wins) # set min windows
wins<-ifelse(wins>wmax,wmax,wins) # set max windows
out<-rollapply(x,width=wins,median) # apply filter to each element
out[length(x)]<-0 # set last value to zero
return(out)
}