2008-01-21

スプライン

前回、if文を使うと、引数にベクトルを与えたときに成分毎に計算してくれないのでsign関数を使う方法を紹介しましたが、条件式を使うことで解決できると院生さんに教えてもらいました。

例えば
1 > 0
の値はTRUEですが、掛け算を行って
(1 > 0) * 1
とすると1になります。当然
(1 < 0) * 1
は0になります。

従って、前回作った0次スプライン基底は

sp0=function(x) {
return( (x >= 0) * (x < 1) )
}

で定義することが出来ます。等号は1次以上ならあってもなくても良いのですが、0次から1次を作るためには片方だけに付けてください。

さて前回、0次スプラインから1,2,3次スプラインを作ろうとしましたが、その解答です。
1次スプラインは既に作ったので2次、3次スプラインを作ります。

sp2=function(x) {
return( x*sp1(x) + (3-x)*sp1(x-1) )
}

sp3=function(x) {
return( x*sp2(x) + (4-x)*sp2(x-1) )
}

この方法だと高さがどんどん高くなるのですが、係数の方で調整できるので簡単なこの方法をここでは紹介しておきます。

このスプライン基底を、以前の多項式回帰における各次数の項のように使うことで非線形回帰を行います。違う点は、xの範囲を覆う基底を用意すれば定数が表現できるので、定数項が不要になることです。

非線形回帰を適用する例として広く使われているものに、The motorcycle data setがあります。 これはオートバイを実験的に衝突させて、取り付けたセンサーに加わる加速度を衝突後の経過時間とともに記録したものです。 時間と加速度の2つ1組のデータが133組あります。表計算ソフトに一旦貼り付けて、133×2の形に整えて、Rへ読み込んでください。

0 件のコメント: