恢复 R 中时间序列的线性滤波器

Reverting a linear filter for time series in R

我正在使用 R 中的 stats::filter 函数来理解 R 中的 ARIMA 模拟(如函数 stats::arima.sim 中)和估计。我知道 stats::filter 将线性过滤器应用于向量或时间序列,但我不确定如何“取消过滤”我的系列。

考虑以下示例:我想对我的系列 x = 1:5 使用值为 0.7 的递归过滤器(这实际上是生成一个 phi=0.7 的 AR(1))。我可以这样做:

x    <- 1:5 
ar   <-0.7 
filt <- filter(x, ar, method="recursive")
filt 

Time Series:
Start = 1 
End = 5 
Frequency = 1 
[1]  1.0000  2.7000  4.8900  7.4230 10.1961

return本质上是我 c(y1,y2,y3,y4,y5) 其中:

y1 <- x[1]                                            
y2 <- x[2] + ar*y1      
y3 <- x[3] + ar*y2 
y4 <- x[4] + ar*y3 
y5 <- x[5] + ar*y4 

现在假设我有 y = c(y1,y2,y3,y4,y5) 系列。如何使用过滤功能return我原来的系列x = 1:5?

我可以写一个代码来做到这一点:

unfilt <- rep(NA, 5)
unfilt[1] <- filt[1]

for(i in 2:5){
   unfilt[i] <- filt[i] - ar*filt[i-1]
}
unfilt
[1] 1 2 3 4 5

但我确实想使用过滤器函数来这样做,而不是编写我自己的函数。我该怎么做?我试过 stats::filter(filt, -ar, method="recursive"),return 是我 [1] 1.0000 2.0000 3.4900 4.9800 6.7101 不是我想要的。

stats::filterrecursive 选项一起使用是 ARMA 过滤器的特例。

a[1]*y[n] + a[2]*y[n-1] + … + a[n]*y[1] = b[1]*x[n] + b[2]*x[m-1] + … + b[m]*x[1]  

您可以使用 signal 包实现此过滤器,它允许比 stat::filter 更多的选项:

a = c(1,-ar)
b = 1

filt_Arma <- signal::filter(signal::Arma(b = b, a = a),x)
filt_Arma

# Time Series:
# Start = 1 
# End = 5 
# Frequency = 1 
# [1]  1.0000  2.7000  4.8900  7.4230 10.1961

identical(filt,filt_Arma)
# [1] TRUE

可以通过切换 ba 来恢复 ARMA 过滤器,前提是反向过滤器保持稳定(这里就是这种情况):

signal::filter(signal::Arma(b = a, a = b),filt)

# Time Series:
# Start = 2 
# End = 6 
# Frequency = 1 
# [1] 1 2 3 4 5

这对应z-transform中切换分子和分母:

Y(z) = a(z)/b(z) X(z)

X(z) = b(z)/a(z) Y(z)