Укажите начальное значение для функции signal::filter в R

Рассмотрим следующее (получено из signal::filter страница справки):

require(signal)

bf <- butter(5, 0.1) 
t <- seq(0, 1, len = 100)
x <- sin(2*pi*t*2.3) + 0.25*rnorm(length(t)) + 5
y <- filtfilt(bf, x)
z <- filter(bf, x)

plot(t, x, ylim = c(0, max(x)))
lines(t, y, col="red")
lines(t, z, col="blue")
lines(t, stats::filter(x, rep(1/10, 10)), col = "green")
legend("bottomright", legend = c("data", "filtfilt", "filter", "SMA"), 
       pch = 1, col = c("black", "red", "blue", "green"), bty = "n")

exampleFilter

Можно видеть, что как красный, так и синий (то есть фильтр и фильтрат) происходят из (0,0). Тем не менее, я хотел бы, чтобы они начали с заданного начального значения, такого как init = mean(x[1:10]), Независимо от того, как я предоставляю указанное ограничение в filter(bf, x)будь то целое число или вектор, я либо не получаю результат, либо length of 'init' must equal length of 'filter', В качестве сравнения для желаемого результата предоставлена ​​простая скользящая средняя (зеленая). Спасибо.

1 ответ

Пройти init значение для синей линии, это может быть достигнуто путем изменения 2 строк вашего кода.

Во-первых: сохранить порядок фильтров в переменной, n

bf <- butter(n<-5, 0.1)

а затем создать init вектор или матрица правильного размера

z <- filter(bf, x, init=rep(mean(x[1:10]), n))

Что касается красной линии, filtfilt это удобная функция, которая на самом деле не использует initтак что, если вам нужно установить это для красной линии, я думаю, вы захотите просто позвонить filter метод дважды самостоятельно, как сделано в источнике, и передать / обработать init цените этот путь. Например:

filtfilt2 <- function(filt, a, x, init)  {
    y = filter(filt, a, c(x, numeric(2 * max(length(a), length(filt)))), init=init)
    y = rev(filter(filt, a, rev(y)))[seq_along(x)]
    y
}
y <- filtfilt2(bf$b, bf$a, x, init=rep(mean(x[1:10]), n))

Другие вопросы по тегам