2236. Re: Rでの非線形最小二乗法について 青木繁伸 2004/02/05 (木) 16:11
> エラーメッセージが例と異なっていて困っています。
> どこがいけないのか教えていただけないでしょうか?
エラーメッセージの意味は,「初期値が悪い」ということです。
> 数値以外は例をコピーアンドペーストしたのですが…
全く同じような例なら,うまくいくこともあるでしょうが。
うまくいったとしても,偶然でしょう。
> また,初期値は勘で入力していくしか方法がないのでしょうか?
> よい方法があるのでしたらこれも教えてください。
うまい方法ではなくて,当たりをつける方法はあります。
まず,データのグラフを描くべきです。Excel などを使うのがいいでしょう。
あなたのデータの場合,これはあなたが当てはめようとしているデータでしょうか?
予測式が,y ~ a/(1+b*exp(-c*x))+d ということは,y は d 〜 d+a の範囲にある。いわゆるs字状曲線です。x, y のデータとはずいぶん違うでしょう?
先のデータの y は,累積和を作らないといけないことになります,y は 0,1,1,1,1,2,3,5,10,17,...,122,125,127,127,127,128 となるんでしょうね。
そして,初期値のうち簡単にわかるものは,d ≒ 0, a ≒ 130。b,c を適当に決めて(変えて)さっき描いた x, y のグラフの中に予測値の曲線を加えてみましょう。b, c を式の中に直接書かずに(a, d もですが),セルに書き込んでおいてそれを用いて計算するようにします。
b, c のセルの数値を変えると予測値の曲線と y の値の一致の具合がよくわかるでしょう。
ここまでくればしめたもの,Excel のソルバーを使ってもよいし,R の nls でもよいでしょう。
ところが,R の nls はなかなか気むずかしいようで,Excel のソルバーだと多少のいい加減な初期値でも収束するようではあります。
結局のところ,試行錯誤の末
> nls(y ~ a/(1+b*exp(-c*x))+d, dat, start=list(a=130, b=360000, c=0.2, d=-0.25))
Nonlinear regression model
model: y ~ a/(1 + b * exp(-c * x)) + d
data: dat
a b c d
1.301335e+02 5.438734e+05 2.057295e-01 4.545957e-01
residual sum-of-squares: 85.2488
となりました。(d はモデルに入れなくてもよいようですね)
|