恢复 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::filter
与 recursive
选项一起使用是 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
可以通过切换 b
和 a
来恢复 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)
我正在使用 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::filter
与 recursive
选项一起使用是 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
可以通过切换 b
和 a
来恢复 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)