0

プログラム R 内で点データを多項式関数で近似しようとしていますが、どの順序が最適かを確認したいと考えています。非線形回帰モデルを使用しnls(function, data, start)、関数はy~a*(x+c)^bです。

私がやりたいことは、谷間充填堆積物の断面積を計算することです。このため、下にある谷底がどのように見えるかをモデル化する必要があります。私はすでに線形シナリオを持っており、いくつかの多項式シナリオを試してみたいと思っています。

私のデータセットは谷のプロファイルを表し、次のようになります (x_combsl は距離、y_combsl は標高):

    x_combsl  y_combsl    
1   0.0000000 120.9095
2   0.9904867 120.5066
3   1.9809735 120.0947
4   2.9714602 119.6811
5   3.9619470 119.2492
6   4.9524337 118.8483
7   5.9429204 118.4866
8   6.9334072 118.1120
9   7.9238939 117.7750
10  8.9143806 117.2833
11  9.9048674 116.7698
12 10.8953541 116.2841
13 11.8858409 115.8285
14 12.8763276 115.2949
15 13.8668143 114.6750
16 14.8573011 114.1301
17 15.8477878 113.6537
18 16.8382746 113.2016
19 17.8287613 112.8163
20 18.8192480 112.4945
21 19.8097348 112.0304
22 20.8002215 111.2370
23 21.7907082 110.7463
24 22.7811950 110.2954
25 23.7716817 109.6715
26 24.7621685 109.1829
27 44.5719032 109.0435
28 45.5623900 109.4721
29 46.5528767 110.0491
30 47.5433634 110.4394
31 48.5338502 110.6832
32 49.5243369 111.0763
33 50.5148237 111.8376
34 51.5053104 112.6162
35 52.4957971 113.2467
36 53.4862839 113.8065
37 54.4767706 114.4694
38 55.4672573 114.9547
39 56.4577441 115.4724
40 57.4482308 116.0013
41 58.4387176 116.4606
42 59.4292043 117.0797
43 60.4196910 117.7074
44 61.4101778 118.2127    
45 62.4006645 118.7544
46 63.3911512 119.3134
47 64.3816380 119.9159
48 65.3721247 120.5462
49 66.3626115 121.0418
50 67.3530982 121.5350
51 68.3435849 122.0184
52 69.3340717 122.5490
53 70.3245584 123.1162
54 71.3150452 123.6437

モデルを生成しようとすると、次のエラー メッセージが表示されます。

data<-data.frame(x_combsl, y_combsl)

fit_nls<-nls(y_combsl~a*(x_combsl + c)^b, data=data, start=list(a=1, b=2, c=35))
Error in numericDeriv(form[[3]], names(ind), env) :
   Missing value or an Infinity produced when evaluating the model

問題を引き起こす可能性のあるアイデアはありますか? 多項式のピークは c=35 付近にある可能性が非常に高いため、開始パラメータが問題を引き起こしているようには見えません。ポイントの非常に直線的な配置でしょうか?少ないデータ ポイントで試してみました [24:31] が、同じエラー メッセージが表示されました。

私は R を使ったプログラミングの経験があまりないので、具体的な回答があれば助かります。

4

1 に答える 1

1

いくつかのポイント:

  • 曲線は約 35 でほぼ対称であるため、開始点cは +35 ではなく -35 に等しくなるはずです。
  • 対称性が与えられた場合、b は偶数、2、4、6、... である必要があります。
  • モデルには上下にシフトする柔軟性が必要なので、そのためのパラメーターを追加します
  • 最後のポイントには 2 つの線形パラメーターがあるためalgorithm="plinear"、それらの開始値を考え出す必要がないように使用します。また、b を修正しているので、開始値を与える c だけがあり、そのために -35 を使用することが既に決定されています。

したがって、b=2 と b=6 を使用して、次の実行とおそらく追加の実行を試してください。

nls(y_combsl ~ cbind(1, (x_combsl + c)^4), data, alg = "plinear", start = list(c = -35))

もちろん、実際には多項式に落ち着いているので、モデルを完全な多項式に変更して を使用することもできますlm

lm(y_combsl ~ poly(x_combsl, 4), data)
于 2013-05-07T22:37:15.537 に答える