先日書いたこの記事ですが、「トイデータとは言え乱数シードを一つに決めて発生させたランダムウォークに対して実験をしているので、乱数シードを複数通りに変えてみたら結果は変わってくる(再現しない)のではないか?」という指摘を何人かの友人知人から貰いました。正直言って多項式フィッティングには何の思い入れもないのですが、再現性があるかどうかについては単純に気になるところです。
ちなみに、以前沖本本で勉強した際にあった「ランダムウォークには平均回帰性がなく時間と共に不確実性が増すため事実上予測不可能(特に長期予測)」という議論の通りで、本来ならランダムウォークに対して「予測」を行うのはそもそも適切ではありません。ただし、短期予測なら例えば状態空間モデルやBSTS的な方法で多少は精度を改善できるのでは?と考えていたのは事実で、同じことが無根拠でナンセンスな多項式フィッティングでも出来たら面白いかもと思ったというのも先日の記事の狙いの一つでした。
ということで、物は試しということで実験をやってみました。やり方は先日の記事から少し変えていますが大体同じで、
- 乱数シード101から300までの200通りで生成したランダムウォークで実験
- ランダムウォークの長さ(サイズ)は360に固定
- データを359:1に分け、前者をtrain + val、後者をtestとする
- さらにtrain:valは80%:20%とする
- 多項式フィッティングはデフォルト20次で、CVする場合はvalでベストスコアを出した次数のモデルをtrainに対して推定したものを用いてtest期間の値を予測する
- 状態空間モデルによるフィッティングは{bsts}でローカルレベルモデルとローカル線形トレンドモデルをそれぞれ別にtrain + valで推定し、直接test期間の値を短期予測する(予測値はtest期間の各時点で得られた予測分布のmedianをとる)
- 20次多項式・CV付き多項式・BSTSローカルレベル・BSTSローカル線形トレンドの4通りのモデルに対してRMSEを乱数シードごとに記録する(計200個)
- 最後に箱ひげ図でそれぞれのRMSEの分布を比較し、必要に応じてt検定及び順位和検定を行う(RMSEなので小さいほど予測性能に優れている)
ということをやっています。詳細はRコードをご覧いただいた方が早いでしょう。クソコードなので最適でもない上にかなり遅いですが、ご容赦ください。{bsts}についてはill-identifiedさんの記事が最も分かりやすいと思います。ただし{bsts}を選んだ理由は単純で、{dlm}の使い方は忘れてしまった上に{KFAS}は不慣れでよく分からないからです。。。
なお、コード冒頭で大半の設定は変えられるようになっていて、例えば20次多項式だと出力が上下に暴れて不利だというのであれば上限6次ぐらいに制限することも可能です。当然ながらtest期間長はおろか全体のデータの長さを変えることもできます。実験のセットアップやコードに不具合や誤りなどあれば是非ご指摘ください。
続きを読む