Укажите начальное значение для функции 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")
Можно видеть, что как красный, так и синий (то есть фильтр и фильтрат) происходят из (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))