gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 03:26:52 28 4
gpt4 key购买 nike

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

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

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

这基本上返回了 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) 系列。我怎样才能使用过滤器函数返回原始系列 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"),返回的不是我想要的 [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

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

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 中时间序列的线性滤波器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71623626/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com