はじめに
Stanで統計モデリングを学ぶ(7): 時系列の「トレンド」を目視ではなくきちんと統計的に推定する - 東京で働くデータサイエンティストのブログをみてください。
上記事では Stan で状態空間モデルを推定しているので、ここでは R の dlm パッケージを使ってやってみます。
モデル化
コンバージョン(CV)がベースラインとなるトレンドと三種類の広告の効果の和で表わされるというモデルです。
ここで dは切片、は誤差項で独立に正規分布に従います。
トレンド は二回差分で表わされ、
です。は誤差項で独立に正規分布に従います。
この式の意味は、「今回の変化量と前回の変化量はだいたいおなじくらいだろう」という仮定です。
の を移行してやると、
という形がでてきます。
行列表記
dlm が想定しているモデルは
という形なので上で仮定したモデルを行列形式に書きなおします。
、、、それに は時間に依存しないので、
と改めて表します。
や には誤差項がつきませんでしたが、これは「平均 0 分散 0 の正規分布に従う誤差がついている」と捉えます。
です。
dlm
上記のモデルを愚直に打ち込みます。
build1 <-function(theta){ dlm(FF=matrix(c(1,0,1,1,1,1),1,6), V=matrix(exp(theta[1])), GG=matrix(c(2,-1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1),6,6,byrow =TRUE), W=matrix(c(exp(theta[2]),0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),6,6,byrow =TRUE), JFF=matrix(c(0,0,1,2,3,0),1,6), X = as.matrix(data1[,2:4]), m0 = c(0,0,0,0,0,0), C0 =matrix(c(1e+7,0,0,0,0,0,0,0,0,0,0,0,0,0,1e+7,0,0,0,0,0,0,1e+7,0,0,0,0,0,0,1e+7,0,0,0,0,0,0,1e+7),6,6,byrow =TRUE))}
FF が 、GG が に対応します。
m0 は の事前分布の平均、C0 が分散です。
JFF は FF のどの成分に説明変数が入るのかを指定しています。
data1 <-read.table("https://raw.githubusercontent.com/ozt-ca/tjo.hatenablog.samples/master/r_samples/public_lib/jp/stan_trend_issue.txt",header =TRUE) fit1 <- dlmMLE(data1$cv, parm=c(log(var(data1$cv)),1,1), build1, method ="Nelder-Mead") model1 <- build1(fit1$par) Filt1 <- dlmFilter(data1$cv,model1) Smooth1 <-dlmSmooth(Filt1) plot(data1$cv,type="b") lines(dropFirst(Smooth1$s[,1])+ apply(Smooth1$s[-1,3:5]*data1[,2:4],1,sum)+ dropFirst(Smooth1$s[,6]),col="red",lwd=2) lines(dropFirst(Smooth1$s[,1]+Smooth1$s[,6]),col="blue",lwd=2)
パラメータを推定して、スムージングしてやると下図のようにトレンドと広告の効果を分離することができました。
青い線がトレンド、赤い線がトレンドと広告の効果を合わせた CV の推定値です。
trend <- read.table("https://raw.githubusercontent.com/ozt-ca/tjo.hatenablog.samples/master/r_samples/public_lib/jp/trend_actual.txt") plot(cumsum(trend$V1),type="b") lines(dropFirst(Smooth1$s[,1]),col="blue",lwd=2)
トレンドの正解データと推定されたトレンドをあわせてプロットしてやります。
まずまず正解に近い値が求まっていると言えそうです。
参考文献
本エントリはかなり説明をはしょっているので、以下を参照していただけると幸いです。
- 作者: J.J.F.コマンダー,S.J.クープマン,Jacques J.F. Commandeur,Sime Jan Koopman,和合肇
- 出版社/メーカー:シーエーピー出版
- 発売日: 2008/09
- メディア:単行本
- 購入: 2人 クリック: 4回
- この商品を含むブログを見る