フィルタリング・畳み込み・累積畳み込み・時系列データの平滑化

  • 平滑化の一般的な手法として、Hanning filterを掛ける畳み込みをやってみる
    • c(1,2,1)/4 なるフィルタを使った畳み込みを実行するフィルタリング関数Han() を作り、それによる畳み込み平滑化。convolve()は高速フーリエ変換を使っている。
n <- length(w[,1])
t <- 1:n
Han <- function(y) # Hanning
        convolve(y, c(1,2,1)/4, type = "filter") 
plot(t,w[,1], pch=20,cex=0.1, main="Using  convolve(.) for Hanning filters")
han.out <- Han(w[,1])
lines(t[-c(1  , n)      ], han.out, col="red")
plot(t,w[,1], pch=20,cex=0.1, main="Using  convolve(.) for Hanning filters")
lines(t[-c(1:2, (n-1):n)], Han(han.out), lwd=2, col="dark blue")
  • filter()関数を使って同じことをする。filter()は、両端にNA値付きで返ってくるのに対し、convolve()の出力を返すHan()は両端が短くなって帰ってくる
filter.out <- filter(w[,1],c(1,2,1)/4,method="convolution")
plot(filter.out[c(-1,-n)],han.out)
-フィルタリングに関する基礎
--ある時系列データに、「何も作用しない」というフィルタリングを施そう
>|r|
filter.out.nothing <- filter(w[,1],c(1),method="convolution")
plot(w[,1],filter.out.nothing)
    • 累積型のフィルタリング。filter()関数のmethodをconvolution から rucursiveに変えると、累積和になる
      • cumsumってことは、ベクトルの各値が「一歩」であるときには、酔歩に相当するから、これは「酔歩発生的フィルタリング」
filter.out.cumsum <- filter(w[,1],c(1),method="recursive")
plot(cumsum(w[,1]),filter.out.cumsum)
    • 平滑化というフィルタリング
      • 観測時刻の真の値を、観測時刻の観測値そのものとせず、その前後に少し寄り添わせることができる
      • たとえば、c(1/4,1/2,1/4)というフィルタは、時刻そのものを1/2、前後を平等に1/4ずつの重みで合わせるフィルタ
    • 前後により添わせつつ、累積和・酔歩
      • filter()関数は、フィルタを引数として、平滑化するときはmethod="convolution"であるが、このmethodを"recursive"にすると、それは「累積和」を取りながら「平滑」にすることになる
  • フィルタリングとARIMA
    • 次の記事はARIMAだが、ARIMAは"Autoregressive integrated moving average"
    • 前半のAR Autoregressive Integratedと後半のMoving averageとの混成になっている
    • フィルタリングの2方法がこの前後半の別に関係していて、moving averageがconvolutionでautoregressive integratedがrecursiveに相当する
    • Moving averageというのは、フィルタが指定する前後範囲に関する、フィルタ指定の重みづけ平均が、フィルタの移動に応じて滑り動いていくことを意味している
    • Autoregressive integratedのintegralは積分〜累積和であって、autoregressiveは自身の(累積和)という意味
    • 実際、ARIMAモデルのデータシミュレーション関数arima.sim()はmodel=list(ar,ma)という引数をとり、ar,maに関して以下のように乱数列xにconvolutionとrecursiveのフィルタリングをしている
if (length(model$ma)) {
        x <- filter(x, c(1, model$ma), sides = 1L) # method="convolution"はデフォルト
        x[seq_along(model$ma)] <- 0
    }
    if (length(model$ar)) 
        x <- filter(x, model$ar, method = "recursive")
    • この辺りは、少し寄り道になるが、長くなるので、別立てで→こちら