从minpack.lm使用nlsLM时,什么原因导致输入参数不正确?

时间:2019-09-30 10:37:09

标签: r curve-fitting nls

我正在尝试将非线性曲线拟合到三个数据点。稍后,我需要将此代码段集成到一个更大的软件中,该软件将尝试自动将曲线拟合到这三个点。如下所示,我正在尝试以a*x^power1 + b*x^power2的形式估算曲线。我知道以下函数满足条件0.666*x^(-0.18) - 0.016*x^0.36。但是,由于某种原因,我根本无法使用nlsLM()中的minpack.lm来重现它。无论我尝试在start参数中添加什么组合,最终都会得到相同的警告消息Warning message: In nls.lm(par = start, fn = FCT, jac = jac, control = control, lower = lower, : lmdif: info = 0. Improper input parameters

即使它只是“警告”消息,也似乎完全弄乱了我的代码。由于输入参数不正确,我将结果传递给的变量m被破坏,之后包含变量m的所有内容均无效。

以下是可重现的示例:

library(ggplot2)
library(minpack.lm)

dataset <- read.table(text='
                      x   y
                      1   0.1 1
                      2   30 0.3
                      3  1000 0', header=T)

ds <- data.frame(dataset)
str(ds)
plot(ds, main = "bla")
nlmInitial <- c(a = 0.5, power1 = -0.2, b = -0.02, power2 = 0.3)
m <- nlsLM(y ~ a*I(x^power1) + b*I(x^power2), 
           data = ds, 
           start = nlmInitial, 
           trace = T)
summary(m)$coefficients

1 个答案:

答案 0 :(得分:1)

您想用较少的观测值来估计许多系数。您说0.666*x^(-0.18) - 0.016*x^0.36将是一个解决方案。 R来到:

m <- nlsLM(y ~ 0.666*I(x^power1) + b*I(x^power2), data = ds, trace = T
           , start = c(power1 = -0.2, b = -0.02, power2 = 0.3))

0.666*x^(-0.18053) - 0.01975*x^0.32879。而且

m <- nlsLM(y ~ 0.7*I(x^power1) + b*I(x^power2), data = ds, trace = T
           , start = c(power1 = -0.2, b = -0.02, power2 = 0.3))

0.7*x^(-0.16599) - 0.04428*x^0.23363将是一个解决方案。

因此,您要么必须增加观察数,要么减少要估计的系数数。