2017-05-03 5 views
2

モデルにフィットしたい/ 70シリーズを使って機能的なフォームを探したい。私はそれらのそれぞれのための30の値があります。プロットは傾向が線形ではないので、NLSを使用しようとしていることを示しています。 the data looks like thisマルチプルシリーズのNLSを見つける

これが正しいアプローチであるかどうかはわかりません。私は以前これを実装していません。私はモデル化するために何か他のものを使用すべきでしょうか?次のエラーが表示されています。

Error in nls(y ~ a * exp(b * x), start = list(a = a_start, b = b_start)) :
singular gradient

xの値は1:30です。これは70回繰り返されます。 Yの値は0と1の間で変化します。私は71のベクトル(長さ30)を使うべきですか、それらを2つの列に集めるべきですか?現時点では、私は2つの列にすべてを集めました。

データは次のようになります。


a_start<-0.2 
b_start<-2*log(2)/a_start 

私の質問が明確でない場合は、さらに明確化のためにお問い合わせください。どんな助力も高く評価されます。

+0

私はnls' 'と比較的経験の浅いんだけど、私はそれを使用してきた時代から、トリッキーな部分の一つは、それが開始値を供給することであること解決策を見つけることができるように十分に近い。このエラーが関連しているかどうかはわかりませんが、これは一連のフィッティングを自動化しようとすると問題になります。このために、あなたは自己始動モデルを調べるかもしれません。 '?selfStart'とそのリンクを参照してください。 – lmo

+0

両側のログを取ってlmを使ってフィッティングしてから、結果を開始値に変換するか、lmだけで十分です。 –

答えて

0

問題は、あなたの数式は、あなたのデータを正確に反映した形ではないということです。 y〜a * exp(b * x)は決してあなたのデータのようには見えないので、意味を成さない鋭いグラデーションが得られます。

これを試してみてください:

#some made up data, since none provided 
x <- runif(1000) * 30 
y <- -0.9 * exp(-0.5 * x) + 1.1 + rnorm(length(x), sd=0.1) 

fit <- nls(y ~ a * exp(b * x) + c, start = list(a = -1, b=-.1, c=1)) 

plot(x,y) 
lines(x[order(x)], predict(fit)[order(x)], col="red", lwd=4) 

enter image description here

+0

ありがとう@thc。間違った機能が原因でエラーが発生したと私は理解しています。あなたが指定した関数を使って、私はフィット感を得ます。私はスタートが0.2に近づきたい。おそらく、私は希望の結果を達成するためにパラメータで遊ぶ必要があります。 – NKaz

+0

@NKaz、うれしかった。私が提案した機能は、データの形状に基づいた例に過ぎませんでした。私は、科学的観点から理にかなった方程式を見つけることを試みることを提案する。モデルのすべてのパラメータは科学的な意味を持つ必要があります。 – thc

+0

あなたは、データを使って科学的に非線形方程式を見つけることについての任意の読み込み/リンクを提案することができます。私はy値のログを使ってlmを適用しようとしました。しかし、残差は自動的に相関します。私が試した他のことはnls2(ブルートフォース)です。しかし、それは私が指定する式に基づいてより良いパラメータ値を見つけることに関するものです。 – NKaz