株価チャートを見るときは、専ら単純移動平均なんだけど、経済指数の予測には指数を使ったものが重要なので、ここは重要。 株価は、あまり仮定を置かない?けど、 経済データは、ある時間的な傾向の変更が予め、ある程度分かってる。 移動平均にしても、最小二乗法にしても、その計算期間のデータを等しく処遇してる。 直近データに重みを付けるには、幾何級数となるように、過去に遡って重みを低減するのが簡単。 => 指数平滑 Rではfilter関数がやってくれる。 filter関数での、重み配分列を与えてやらないといけないけど、 例えば、0.8づつ低減するのは、 => cumprod(rep(0.8,10)) 0.8, 0.64, 0.512,,,,,,となる。 この数列の和は、合計1にしておきたいので、 =>(1/ sum( cumprod(rep(0.8,10)))) 0.28 これをもう一回計算しておいて、それで割るのが順当? => cumprod(rep(0.8,10) / sum(cumprod(rep(0.8, 10) 0.2241, 0.1792, 0.1434,,,,,, 本では、等比級数の和の公式を使ってる。 その場合は、 (1 * B) * (1 - 0) /(1 - B) で今回だと、4 => 0.25づつかける。 さっきのが0.28だけど、20個くらいの列にすると、0.25。 本だと20個の列をとってるけど、20個くらいは欲しいという事か。 まとめて、関数にすると、 ws <- function(r, n){s = cumprod(rep(r, n)); s/sum(s)} これを filter(データ列、 filter= ws(0.8, 20)) とすると、指数平滑化した列が求まる。 グラフ化 ts.plot(GDP, filter(GDP, ws(0.7,12), sides=1), filter(GDP, rep(1/12,12),sides=1), col=c(1:3)) 本では、予測値をやってる。 これは、二重平滑法でつながる話なので、そこで。 |