使用来自 minpack.lm 的 nlsLM 时,是什么导致输入参数不正确?
What causes improper input parameters when using nlsLM from minpack.lm?
我正在尝试将非线性曲线拟合到三个数据点。稍后,我需要将这个片段集成到一个更大的软件中,该软件会尝试自动将曲线拟合到这三个点。如下所示,我正在尝试以 a*x^power1 + b*x^power2
的形式估计曲线。我知道下面的函数满足条件0.666*x^(-0.18) - 0.016*x^0.36
。但是,出于某种原因,我根本无法使用 minpack.lm
中的 nlsLM()
重现它。无论我尝试在 start
参数中添加什么组合,我最终都会收到相同的 Warning message: In nls.lm(par = start, fn = FCT, jac = jac, control = control, lower = lower, : lmdif: info = 0. Improper input parameters
.
警告消息
尽管它是 "only" 一条警告消息,但它似乎完全弄乱了我的代码。由于输入参数不正确,我将结果传递给的变量 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
您想用太少的观测值估计许多系数。你说 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
将是一个解决方案。
因此您要么必须增加观测值的数量,要么减少要估计的系数的数量。
我正在尝试将非线性曲线拟合到三个数据点。稍后,我需要将这个片段集成到一个更大的软件中,该软件会尝试自动将曲线拟合到这三个点。如下所示,我正在尝试以 a*x^power1 + b*x^power2
的形式估计曲线。我知道下面的函数满足条件0.666*x^(-0.18) - 0.016*x^0.36
。但是,出于某种原因,我根本无法使用 minpack.lm
中的 nlsLM()
重现它。无论我尝试在 start
参数中添加什么组合,我最终都会收到相同的 Warning message: In nls.lm(par = start, fn = FCT, jac = jac, control = control, lower = lower, : lmdif: info = 0. Improper input parameters
.
尽管它是 "only" 一条警告消息,但它似乎完全弄乱了我的代码。由于输入参数不正确,我将结果传递给的变量 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
您想用太少的观测值估计许多系数。你说 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
将是一个解决方案。
因此您要么必须增加观测值的数量,要么减少要估计的系数的数量。