次は、状態空間モデルの難所というか、パッと見よくわかんない「左端」について説明します。左端というのは私の造語ですが。難しい、文字通り「ひだりはし」の問題です。グラフにすると一番左端の部分なので、私は勝手に左端と呼んでます。ほかの人に説明するときに左端って言っても通じないので気を付けてください。この左端の値、dlmパッケージではデフォルトで0となっています。0、と指定しています。1e+07この、太字で示したm0のところです。いう関数を使って、左端の値を取り除いてからプロットしていました。推定していないんだから、表示させると、うっとうしいことになるので、切ったんですね。これも勝手な値が仮定されています。前ページの例を見ればわかるように、べつに、このままでもモデルは推定できます。行われているからですね。Nileデータは1971年から存在します。1971年の状態を推定するためには左端として1970年の状態の値が必要です。それを0だと仮定した。1971年の状態は、前期の状態の値と全く同じだとみなされるので0だと予測される。過小評価だ、ということですごい勢いで補正されたんですね。前回の例だとNileFilt$mをすれば、推定された状態が表示できると書きましたが、この値は1970年からのスタートとなっています。データは1971年からスタートなのに謎に1970年が存在して、そこに0が入っているというのは、これが原因です。補正された状態を使って1872年以降が推定されているから、一応問題ないということです。いるときが多いような気がします。左端に関してはほかにもいくつか対策があります。一つは、左端を、データもろとも切って捨てること。Nileのデータは1872年からしかないとみなすんですね。左端に、1871年の観測値を入れるんです。仮定してモデルを組むことができます。このやり方だと、使えるデータが一期分少なくなってしまいます。違う解析ですが)レフェリーにこうしたら、と勧められたことがあります。二番目は左端というパラメタも最尤法で推定してしまう方法です。いう欠点はありますが、手持ちのデータを全部使ってモデルを組めます。三番目は、偉い先生が決めたとか理論的な考察に基づいてなぜかもうすでにわかってるとかいう場合です。ローカル・レベル・モデル実際にローカル・レベル・モデルを推定してみます。前のページで簡単なモデルは一応推定は終わっているので、左端も一緒に推定してみます。dlmパッケージを落としてから。library(dlm)としてから、計算していきます。残りは前と一緒でdVは観測誤差の大きさ、dWは状態の変動の大きさです。パラメタ推定fit.2<-dlmMLE(Nile,parm=dlmMLE(Nile,parm=c(1,1,10),build.2,method="Nelder-Mead")$par,build.2,method="BFGS")ここで、ちょっとだけ工夫をしました。いうのも、推定すべきパラメタが一個増えたので、推定がちょっと大変になっているんですね。定すると、変な推定値が出てしまうことがあります。dlmMLEという関数はoptim関数という最適化関数をそのまま使っています。optim関数で使える匠の技がこちらでも使えるんですね。optim関数を使う時の工夫の方法は、文献[1]に載っています。今回は多段階最適化という技を使ってみました。最適化してやる方法です。部分)のせいで推定結果がおかしくなるという事態を緩和することができます。このやり方のおかげで多少ましにはなったのですが、それでも一番最初に入れる初期値によっぽど変な値を入れると意味不明な推定値が返されます。うまく推定できているかどうかは推定結果におけるconvergenceを見るとよいです。0$messageNULL太字にした部分ですね。これが0になっていればとりあえず解がちゃんと求まったということになります。ここが0でも意味不明な推定値を返していることがあります。1e+07m0にもそれっぽい値が入りました。それっぽい値か、「絶対これはないだろ」って値かはちゃんと確認したほうがよいと思います。あとは、前回作ったモデルと同じなので、省略します。状態の分散を0にする今度は、タイトルの通り、状態の分散を0だと仮定してモデルを組んでみます。MLEでパラメタ推定。plotplot(Nile,col=8,type="o",main="スムージングの結果")lines(Nile.Smooth.3$s,col=4)今回はスムージングの結果だけを載せていますが、まっすぐになっているのがわかると思います。状態が全く動かないというのは、実は、ふつうの線形回帰を行った結果と一致します。lm.model<-lm(Nile~1)↑は、説明変数の入っていない線形回帰です。傾きが0の直線を引っ張る処理ですね。切片だけを推定したわけです。lm.model$coef(Intercept)919.35一方、dlm使って引っ張られた線はこんな値になってます。919.35両方とも919.35になっていますね。919.35Nileの平均値は919.35ですから、これは単に平均値を求めたのと同じことになっているということです。これをすれば、状態空間モデルと回帰分析の関係が多少はわかるかなと思います。状態空間モデルのほうがパワーアップしているということです。バグや誤り等ございましたら、掲示板などにご一報ください。