R Time Series Analysis 時系列解析(3) (filterによる指数平滑化法)

####filter関数を使った指数平滑法####
#データは経済産業省総合原指数【月次】出荷(平成17年=100.0)
#資本財を対象とする
dat <- read.csv("http://www.meti.go.jp/statistics/tyo/iip/result/h2afdldj/csv/ha2zom3j.csv",skip=2,header=TRUE) #skip=2は上位2行を省く意味 dat_ts <- ts(dat[,4],start=c(2003,1),frequency=12) bunkai <- decompose(dat_ts,type="multiplicative") dat_TC <- bunkai$trend dat_TC2 <- dat_TC[is.na(dat_TC)==FALSE] dat_TC3 <- ts(dat_TC2,start=c(2003,7),frequency=12) n <- length(dat_TC3) x <- rep(0,6);b <- 0;p <- 6 #xはダミー変数、bは予測値と実績値のバランス係数(0なら前時刻の実績重視、1なら前時刻の予測重視) #pは過去何期を参照するかを示す (w <- (1-b)*(cumprod(c(1,rep(b,p-1)))))
#移動平均ウェイト。指数平滑化法の場合、ウェイトが等比数列となる。 datINT <- rev(dat_TC3[(n-p+1):n]) #予測値の初期値を求めるため Pre <- filter(x,filter=w,method="recursive",init=datINT) Pre2 <- ts(Pre,start=c(2011,4),frequency=12) title <- "指数平滑法による予測" ts.plot(dat_TC3,Pre2,type="l",lty=c(1,2),main=title) #漸化式による予測系列 #Y予測T = (1-β)YT-1+(1-β)βYT-2+…+(1-β)β^T-2*Y1において、 #Y予測T+1 - β×Y予測Tを計算すると #Y予測T+1 = Y予測T +(1-β)×(YT-Y予測T)という関係式が導ける
#これは"予測値と実績値の差の1-β倍分を調整し、次の予測とする"という意味
#また、Y予測T+1 = (1-β)YT + βY予測T …☆ とも書ける b <- 0.8;w <- b #bは上記のβにあたる定数 x <- (1-b)*dat_TC3[-1] #xはトレンドの0.2倍値の系列 datHAT <- filter(x,filter=w,method="recursive",init=dat_TC3[1]) #☆式において、x:(1-β)YTに対応、w:βに対応、init:Y1に対応 #datHAT[1] == dat_TC3[1]*0.8 + x[1] #datHAT[2] == datHAT[1]*0.8 + x[2] …のように計算が行われていることに注意 dathat <- ts(datHAT,start=c(2003,7),frequency=12) title <- "漸化式による予測系列の作成" ts.plot(dat_TC3,dathat,type="l",lty=c(1,2),main=title)

 f:id:nakhirot:20130614143023p:plain

【まとめ】

T期における実績値と予測値の内分点を、T+1期の予測とする方法が指数平滑化法であるとわかる。