1. ホーム
  2. r

[解決済み] 初期パラメータ推定時の特異勾配行列を防ぐための曲線の修正

2022-02-05 04:18:50

質問

を使いたいのですが y=a^(b^x) を使って、以下のデータに当てはめることができます。

y <- c(1.0385, 1.0195, 1.0176, 1.0100, 1.0090, 1.0079, 1.0068, 1.0099, 1.0038)
x <- c(3,4,5,6,7,8,9,10,11)
data <- data.frame(x,y)

非線形最小二乗法を使った場合。

f <- function(x,a,b) {a^(b^x)}
(m <- nls(y ~ f(x,a,b), data = data, start = c(a=1, b=0.5)))

と表示され、エラーが発生します。 初期パラメータ推定値における特異な勾配行列です。 結果はだいたいa=1.1466, b=0.6415で、初期パラメータ推定値はa=1, b=0.5と定義しているので問題ないはずです。

他のトピックで、カーブを修正すると便利というのを読んだことがあります。私は次のようなものを考えていました。 log y=log a *(b^x) しかし、関数の指定はどうしたらよいのでしょうか?何かいい方法はないでしょうか?

どのように解決するのですか?

コメントを拡大して回答します。

以下を使用すると

y <- c(1.0385, 1.0195, 1.0176, 1.0100, 1.0090, 1.0079, 1.0068, 1.0099, 1.0038)
x <- c(3,4,5,6,7,8,9,10,11)
data <- data.frame(x,y)

f <- function(x,a,b) {a^b^x}

(m <- nls(y ~ f(x,a,b), data = data, start = c(a=0.9, b=0.6)))

または

(m <- nls(y ~ f(x,a,b), data = data, start = c(a=1.2, b=0.4)))

取得します。

Nonlinear regression model
  model: y ~ f(x, a, b)
   data: data
     a      b 
1.0934 0.7242 
 residual sum-of-squares: 0.0001006

Number of iterations to convergence: 10 
Achieved convergence tolerance: 3.301e-06

を使用すると必ずエラーが発生します。 1 の開始値として a というのは、おそらく 1 は、何にでも上げることができます。 1 .

開始値の自動生成については、私はその手順をよく知りません。 私が読んだことのある方法のひとつは、曲線をシミュレートし、データに近似していると思われる曲線を生成する開始値を使用することです。

上記のパラメータ推定値を用いて、以下のコードで生成したプロットがこちらです。 右下の線がもう少しフィットしてもいいかもしれないことは認めます。

setwd('c:/users/mmiller21/simple R programs/')

jpeg(filename = "nlr.plot.jpeg")

plot(x,y) 
curve(1.0934^(0.7242^x), from=0, to=11, add=TRUE)

dev.off()

<イグ