Я пытаюсь отфильтровать ряд данных времени / положения, чтобы получить сглаженный график.Я измеряю глубину и время (механическая система), где скорость меняется.Я рассчитываю скорость по измеренным значениям глубины / времени и могу построить график зависимости скорости от глубины, но на низких скоростях шум слишком велик (по разным причинам).Тенденция на низких скоростях правильная, но я хотел бы иметь возможность применить фильтр, который будет использовать процедуру адаптивного сглаживания, т.е. для низких скоростей (где у меня много точек данных) мне нужно использовать большее окно сглаживаниядля высоких скоростей (несколько точек данных) мне нужно использовать меньшее окно.
Я немного посмотрел и нашел решение с использованием 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)
}