Адаптивный фильтр временных рядов в R ...? - PullRequest
2 голосов
/ 21 сентября 2011

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

Я немного посмотрел и нашел решение с использованием 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...