問題は開始値です。これに対する 2 つのアプローチと、問題の開始値を使用しても収束する代替案を示します。
1) plinear右辺は Q*b で線形であるため、b を Q に吸収する方がよいでしょう。その後、線形に入るパラメーターがあるため、より簡単に解決できます。また、plinear アルゴリズムでは、線形パラメーターの開始値は必要ないため、b の開始値のみを指定する必要があります。plinear では、nls 式の右辺を、線形パラメーターを乗算するベクトルとして指定する必要があります。以下に示すnls を実行した結果は、fm0
名前付きの係数でb
あり.lin
、Q = .lin / b です。
からの回答は既に得られていますが、 andではなくandfm0
に関してクリーンな実行が必要な場合は、示されているように、によって返される係数によって暗示された開始値を使用して、問題の元の式を実行できます。b
Q
b
.lin
fm0
fm0 <- nls(Y ~ X/(1+b*X), Data, start = list(b = 0.5), alg = "plinear")
st <- with(as.list(coef(fm0)), list(b = b, Q = .lin/b))
fm <- nls(Y ~ Q*b*X/(1+b*X), Data, start = st)
fm
与える
Nonlinear regression model
model: Y ~ Q * b * X/(1 + b * X)
data: Data
b Q
0.0721 366.2778
residual sum-of-squares: 920.6
Number of iterations to convergence: 0
Achieved convergence tolerance: 9.611e-07
結果を表示できます。ポイントはデータで、赤い線は適合曲線です。
plot(Data)
lines(fitted(fm) ~ X, Data, col = "red")
(プロットの後に続く)

2) meanまたは、Q に mean(Data$Y) の開始値を使用するとうまくいくようです。
nls(Y ~ Q*b*X/(1+b*X), Data, start = list(b = 0.5, Q = mean(Data$Y)))
与える:
Nonlinear regression model
model: Y ~ Q * b * X/(1 + b * X)
data: Data
b Q
0.0721 366.2779
residual sum-of-squares: 920.6
Number of iterations to convergence: 6
Achieved convergence tolerance: 5.818e-06
質問には、b
使用した合理的な開始値が既にありましたが、必要な場合は、キャンセルして平均 (Data$X) を設定し、可能性のある開始値として与えるために解くことY
ができます。の開始値として のこの開始値を使用することは示されていませんが、収束も生じました。Q*b
X
b
b = 1 - 1/mean(Data$X)
b
mean(Data$Y)
Q
3) optimアルゴリズム を使用optim
すると、質問で使用した初期値でも収束します。残差二乗和を形成し、それを最小化します。
rss <- function(p) {
Q <- p[1]
b <- p[2]
with(Data, sum((Y - b*Q*X/(1+b*X))^2))
}
optim(c(1, 0.5), rss)
与える:
$par
[1] 366.27028219 0.07213613
$value
[1] 920.62
$counts
function gradient
249 NA
$convergence
[1] 0
$message
NULL