正しい開始値を持つnlsの特異勾配誤差


19

私は線+指数曲線をいくつかのデータに当てはめようとしています。最初に、人工データでこれを実行しようとしました。関数である: それが効果的に直線部を有する指数曲線、ならびに追加の水平シフトパラメータである(M)。ただし、Rの関数を使用すると、最初にデータを生成するために使用したのと同じパラメーターを使用しても、「初期パラメーター推定値での特異な勾配行列」エラーが発生します。

y=a+b⋅r(バツ−m)+c⋅バツ
nls()
さまざまなアルゴリズム、さまざまな開始値を試しoptim、残差平方和を最小化するために使用しようとしましたが、すべて役に立ちませんでした。私は、このために考えられる理由は、式のオーバーパラメータ化することができることを読んだが、私は(それがある?)それはないと思う
誰もがこの問題のための提案を持っていますか?または、これは単なる厄介なモデルですか?

短い例:

#parameters used to generate the data
reala=-3
realb=5
realc=0.5
realr=0.7
realm=1
x=1:11 #x values - I have 11 timepoint data
#linear+exponential function
y=reala + realb*realr^(x-realm) + realc*x
#add a bit of noise to avoid zero-residual data
jitter_y = jitter(y,amount=0.2)
testdat=data.frame(x,jitter_y)

#try the regression with similar starting values to the the real parameters
linexp=nls(jitter_y~a+b*r^(x-m)+c*x, data=testdat, start=list(a=-3, b=5, c=0.5, r=0.7, m=1), trace=T)

ありがとう!


2
ヒント:の係数見(固定用R)となお、BのR - M = 定数は、溶液の一次元ファミリー有する(B 、M )と、B = R M ⋅ 定数。rバツrbr−m=定数(b、m)b=rm⋅定数
— whuber

1
これは、またはrが何らかの形で制約されていない限り、特定されたモデルではありません。私は必要だと思いR ∈ (0 、1 )仕事をするでしょうし。brr∈(0、1)
— マクロ

回答:


16

私は最近これに噛まれました。私の意図は同じで、人工モデルを作成してテストしました。主な理由は、@ whuberと@marcoによって与えられたものです。そのようなモデルは特定されていません。これを確認するには、NLSが関数を最小化することに注意してください。

∑私=1n(y私−a−brバツ私−m−cバツ私)2

パラメーター(a、b、m、r、c)のセットによって最小化されているとします。パラメーターのセット(a、br−m、0、r、c)が最小化される関数の同じ値を与えることを確認するのは難しくありません。したがって、モデルは特定されません。つまり、一意のソリューションはありません。

勾配が特異である理由を見るのも難しくありません。を示す

f(a、b、r、m、c、バツ)=a+brバツ−m+cバツ

それから

∂f∂b=rバツ−m

∂f∂m=−bln⁡rrバツ−m

そして、私たちはすべてのxについてそれを得るバツ

bln⁡r∂f∂b+∂f∂m=0。

したがって、行列

(∇f(バツ1)⋮∇f(バツn))

フルランクではないためnls、特異な勾配メッセージが表示されます。

主なバグがモデルにあることに気付くまで、他の場所でコードのバグを探すのに1週間以上費やしました:)


2
これは私が知っている昔ですが、ただ疑問に思って、これは識別できないモデルではnlsを使用できないことを意味しますか?たとえば、ニューラルネットワークですか?
— カウントゼロ

ファットチャンス、私は知っていますが、これをより少ない計算を覚えている人々のために分解できますか?:)。また、OPの問題の解決策は何ですか?あきらめて家に帰る?
— 森林生態学者

2
b⋅rバツ−mβ⋅rバツmββ=b⋅r−m

@CountZero、基本的にははい、パラメーターが識別されない場合、通常の最適化方法は失敗します。ただし、追加の制約を追加し、他の興味深いトリックを使用することにより、ニューラルネットワークはこの問題を回避します。
— mpiktas

∂f∂m=−bln⁡r rバツ−m

17

もちろん、上記の答えは正しいです。http://stat.ethz.ch/R-manual/R-patched/にあるnlsヘルプページによると、人工データセットでこれを試している場合、与えられた説明に加えて、その価値についてlibrary / stats / html / nls.html

Rのnlsはそれを処理できません。ヘルプページには具体的に次のように記載されています。

警告

人工的な「ゼロ残差」データにはnlsを使用しないでください。

nls関数は、相対オフセット収束基準を使用して、現在のパラメーター推定値の数値の不正確さを残差平方和と比較します。これは、フォームのデータでうまく機能します

y = f(x、θ)+ eps

(var(eps)> 0)。フォームのデータの収束を示すことができません

y = f(x、θ)

基準は丸め誤差の2つの成分を比較することになります。人工データでnlsをテストする場合は、以下の例に示すように、ノイズコンポーネントを追加してください。

したがって、ノイズなし== Rのnlsには適していません。


@B_D_Dubbyaサイトへようこそ。私はあなたの答えをフォーマットする自由を取りました、あなたが気にしないことを願っています。CV での回答の編集に関する詳細については、こちらをご覧ください。
— GUNG -復活モニカ

1
私はこの問題を認識しています-したがって、「ジッタ」機能を使用してノイズを追加します
— ステニー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.