No.01787 nls()の初期値の設定  【波音】 2006/12/06(Wed) 17:03

Rのnls()を用いて非線形回帰分析を行いたいのですが,過去のスレッド(http://aoki2.si.gunma-u.ac.jp/lecture/mb-arc/arc027/02234.html)などをみて,とりあえずはうまくいったのですが初期値の設定の仕方が分かりません。optim()を使えば良いのは分かるのですが,そもそもこの関数を使う際に指定する初期値はどのように予測するのでしょうか。
> x<-c(20,  26,  33,  43,  56,  72,  93, 120, 155, 200)
> y<-c(18.1, 32.8, 47.9, 70.7, 110.1, 169.9, 253.7, 377.2, 533.9, 795.7)
> dat<-data.frame(x,y)
> nls(y ~a*x^b , dat, start=list(a=1, b=1))
Nonlinear regression model
model: y ~ a * x^b
data: dat
a b
0.2530953 1.5200905
residual sum-of-squares: 310.8182
> plot(x,y)
> xd<-seq(0,200,0.5)
> points(xd,0.2530953*xd^1.5200905,pch=".",col="blue")
このように今回は「とりあえずaもbも1にしてみようか」とした所,たまたまうまくいった様子ですが,本来はどのようにしてこの値を予測するのかが分からないのです。データ分析を行う人自身の経験に頼るしかないのでしょうか。

fig


No.01789 Re: nls()の初期値の設定  【青木繁伸】 2006/12/06(Wed) 18:18

シンプレックス法
http://aoki2.si.gunma-u.ac.jp/R/simplex.html
は,初期値の設定はかなりいい加減でも解を見つけられる可能性が高いかも。
パラメータ値を乱数で決めて何回かやってみると,そのうちまぐれであたるかも。
そのあと,nls で精度を上げる。

局所解の問題も避けることができるかも。

No.01793 Re: nls()の初期値の設定  【ひの】 2006/12/07(Thu) 00:10


>model: y ~ a * x^b

 このような単純なモデルなら対数を取ってモデルを線形化してから計算できますから,ます線形回帰で計算(初期値不要)して,その結果を初期値として非線形回帰で計算しなおすとよいでしょう。

No.01794 Re: nls()の初期値の設定  【波音】 2006/12/07(Thu) 01:20

青木先生にひの先生,早速の回答ありがとうございます。

なるほど,今回の場合のような単純なモデル式の場合は対数をとって線形回帰の結果を初期値としてあげる。それでもっと複雑な(ロジステック回帰分析のような)モデルを扱う場合は青木先生の教えてくださったシンプレックス法を使えば良いのですね。

シンプレックス法で値を乱数で決めて何回か試すというような根性作戦でも,私にはそのような方法のほうが向いているような気がします。

No.01799 Re: nls()の初期値の設定  【ひの】 2006/12/07(Thu) 15:41


>シンプレックス法で値を乱数で決めて何回か試すというような根性作戦でも,私にはそのような方法のほうが向いているような気がします。

  そのへんは好みの問題ですが,パラメータの多い複雑なモデルだと初期値が悪いと全然だめな場合もあります。私の場合,2変量程度の問題ならデータをプロッ トしたグラフに手入力したパラメータによるグラフをリアルタイムで書かせながら適当な初期値を探します。よく使うモデルならEXCELのワークシートに雛 形を作っておいて,そのままEXCELのソルバーで解きます。モデルが複雑でEXCELのソルバーでは解けないときは,しょうがないので数値計算ライブラ リのマルカート法を使って自分で書きます。この場合初期値設定ツールも自作します。

No.01800 Re: nls()の初期値の設定  【波音】 2006/12/07(Thu) 16:48

ひの先生,度々の回答ありとがとうございます。

マルカート法というのは初めて聞きましたが,googleで"マルカート法"というキーワードで検索しても詳しいものはヒットしなかったので,これを機会に本を買ってこの辺りのことを詳しく勉強してみようと思います。
私も必要なプログラムを自分でスラスラと書けるようになれば良いのですが,,,まだまだ勉強不足ですね。

No.01804 Re: nls()の初期値の設定  【青木繁伸】 2006/12/07(Thu) 19:27

Marquadt は,フランス人だったかなぁ
読み方は,マルカールとも。。。

● 「統計学関連なんでもあり」の過去ログ--- 039 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る