10. カーブ・フィッティング

藤宮

はじめに

様々な将来予測などでは、これからのシナリオを考えて、そのシナリオに沿ったカーブをイメージしながら、与えられたデータにフィッティングしてカーブを引きたいとことがあります。スプライン関数といった方法もありますが、与えられたデータの中で内挿するだけで、外側に大胆に引くことはできません。

フリーハンドで「これぐらいになる」とカーブを引くのもひとつの手ですが、得られているデータにそれなりにマッチした線を綺麗に描きたいときもあります。「非線形最小二乗法を使って」と試しても収束しないと悩むことも多いのではないでしょうか?特に得られているデータの範囲が狭いとか、思ってもいない位置に収束してしまうとか、諦めることも多いと思います。

今回の話題は、とりあえず思ったようなカーブの線を引きたいとき(人)のためのBUGSソフトウェアの話です。ただし、残念ながら現時点では実際に使おうとするとプログラミングや確率統計の知識も必要となります。

MCMCによるカーブ・フィッティング

まず、図1を見てください。直線にも見えます。なんとなくガウス分布の左半分ぐらいともとれます。または、ロジスティックカーブともとれます。いずれを採用するかは、そのデータの由来から知っている方でないと判断ができません。患者数のようなデータで原因となっている疾患が頭打ちになる傾向がすでに知られていれば、ガウス分布やロジスティック関数を使ってフィッティングするほうが直線より良いかも知れません。とりあえずここでは、ガウス分布やロジスティック関数でフィッティングしたいとします。

tech010_01

図1 部分的なカーブの例

MCMCの良いところは、自分の思いを事前情報分布として数値にしてモデルに与えれば、その範囲で探してくれる点です。MCMCのソフトウェアとしては、プログラミングや確率統計の知識を必要としますが、WinBUGSやOpenBUGS、 JAGSなどのフリーソフトがあります。

これらのソフトでは、まず、(1)フィッティングしたい関数の統計モデルを定義し、(2)各パタメータの事前分布に自分の思っている程度の制約を与え、(3)予測したい領域を”NA”という欠測値にした尤度関数を得るための計測データを渡し、(4)得られた事後分布からサンプリングを実行することで尤もらしいフィッティング結果を返してくれます。

結果がふらついて収束しないときには、かなり恣意的になりますが、事前に得られている知識で、どの程度のパラメータの範囲になるか期待される値とその範囲を狭くして与えてしまいます。「それでは手書きと同じだ」というご指摘はごもっともです。でも全てのパラメータを与えて曲線を一本描くのとは違い、特定のパラメータに対して精度の良い事前情報分布を与え、その他のパラメータは無条件事前分布に近い感じで収束するまでBUGSにおまかせという方法が取れます。

一つでも恣意的であれば十分全部が恣意的かも知れませんが、気持ちだけ、少し数学的な配慮が効いたもので、データに合致した曲線が得られます。ここでは、お絵かきソフト替わりと思って記載しておりますのでそのレベルでお許しください。

前記の図1に対して、形状から決まってくるおよその位置と範囲を指定してフィッティングしてみました。図2に結果を示します。黒はオリジナルの曲線で、赤が正規分布関数、青はロジスティックカーブです。

tech010_02

図2 ガウス分布関数によるフィッティングの例

ここで、どちらの関数の当てはまりが良いか見てみたいと思います。BUGSソフトウェアの場合、DIC(Deviance Information Criterion)という情報量規準で簡単に当てはまりの良さを評価することができます。情報量規準を用いた評価は、必ずしも残差が小さいだけで選ばれるわけではなく、推定するパラメータの数も考慮して適合性の良いモデルを選ぶことができる点です。上記ではBUGSソフトとしてJAGSを用いました。

ガウス分布関数の場合は、単に平均と分散だけでなく、全体のオフセット分や振幅もフィッティングしています。また、ロジスティック関数もオフセットと振幅やX軸方向の位置や立ち上がりの傾斜などを決めるパラメータを推定しています。そのため、実効的なパラメータ数を表すpenaltyもそれなりに大きくなります。

DICで評価した結果は、ガウス分布関数モデルでPenalized deviance: 62.46という結果でした。一方ロジスティック関数でもほぼ同じ程度の値Penalized deviance: 63.58でした。情報量規準では、小さい方を選択することになりますが、この場合差は小さく、どちらをとってもそれほど変わらずという感じです。もちろんここでは、与えられたデータの範囲でどうか当てはまり具合を見ただけですので、むしろ得られたデータソースの性質から最終的なモデルを決めることになると思います。

あまり意味が無いのですが、たとえば、図3に示すようにかなり短い線分(図1の上のほうの一部分)に対してもフィッティングできます(一応DICを使ったモデル比較もしてみました。Penalized devianceが直線モデル(青)は41.9で、ガウス分布(赤)が34.97でした。この線は全体的には曲がっているからか、ガウス分布の方がモデルとして良いという結果でしたが、あまり深い意味はありません)。

tech010_03

図3 局所データへのガウス分布関数フィッティング

ベイズ推定では、事前分布としてできあがりのイメージがあれば、それを初期値として与えることで、それなりに合わせてくれるような使い方ができる例を示しました。裏を返せば、それなり見えてしまう結果が得られるということでもあり、これらを適用した場合には、事前分布に関するかなり慎重な説明書きが必要と考えます。