为R中的signal::filter函数提供初始值

为R中的signal::filter函数提供初始值,r,filter,signal-processing,moving-average,butterworth,R,Filter,Signal Processing,Moving Average,Butterworth,考虑以下内容(源自signal::filterhelp页): require(信号) bf要传递蓝线的init值,可以通过更改代码的两行来实现 首先:将过滤器顺序存储在变量中,n 谢谢你。我选择了filtfilt来消除相移。使用第一个示例,我必须手动移动函数,比如说行(t[-c((1-10+length(t)):length(t))],z[-c(1:10)],col=“blue”,lty=“虚线”)。filter和filtfilt都会使我在开始和结束时丢失比SMA多得多的数据。不过,我想这是过滤

考虑以下内容(源自
signal::filter
help页):

require(信号)

bf要传递蓝线的
init
值,可以通过更改代码的两行来实现

首先:将过滤器顺序存储在变量中,
n


谢谢你。我选择了
filtfilt
来消除相移。使用第一个示例,我必须手动移动函数,比如说
行(t[-c((1-10+length(t)):length(t))],z[-c(1:10)],col=“blue”,lty=“虚线”)
filter
filtfilt
都会使我在开始和结束时丢失比SMA多得多的数据。不过,我想这是过滤器的本质,所以我对你简洁的答案投了赞成票。
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")
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))