向 nlsLM 提供适当的启动参数时出错
Error supplying appropriate start parameters to nlsLM
我正在使用 minpack.lm 库中的 nlsLM 函数,遇到了一些我不理解的行为。
鉴于以下函数在我提供数值向量 'b' 作为输入时产生输出,我想使用此函数来将非线性模型拟合到我的数据。
volEquation <- function(DBH, PHt, b){
b[1] * DBH^b[2] * PHt^b[3]
}
但是,在正确指定初始参数值时,我遇到了困难。 R代码如下:
library(minpack.lm)
n <- 20
x <- seq(12, 60, length.out = n)
y <- seq(22, 45, length.out = n)
z <- x^2 * y ^ 3 + rnorm(n, 0, 0.1)
Data <- data.frame(DBH = x, PHt = y, TVT = z)
nlsFormula <- "TVT ~ volEquation(DBH, PHt, b)"
nlsInitial <- list(b = c(0.5, 2.25, 3.25))
nlsLMOutput <- nlsLM(formula = nlsFormula, data = Data, start = nlsInitial)
nlsOutput <- nls(formula = nlsFormula, data = Data, start = nlsInitial
nls 成功拟合了数据,而 nlsLM 给了我这个错误信息,
Error in rownames<-
(*tmp*
, value = "b") :
length of 'dimnames' [1] not equal to array extent
任何人都可以深入了解为什么 nlsLM 函数中会出现此问题吗?我试过筛选 nlsLM 代码,但我仍然不明白发生了什么。
尝试分离参数
volEquation <- function(DBH, PHt, x,y,z){
x * DBH^y * PHt^z
}
nlsFormula <- "TVT ~ volEquation(DBH, PHt, x, y, z)"
nlsInitial <- c(x=5e-3, y=2, z=1)
nlsOutput <- nlsLM(formula = nlsFormula, data = Data, start = nlsInitial, control=nls.lm.control(maxiter=100))
我正在使用 minpack.lm 库中的 nlsLM 函数,遇到了一些我不理解的行为。
鉴于以下函数在我提供数值向量 'b' 作为输入时产生输出,我想使用此函数来将非线性模型拟合到我的数据。
volEquation <- function(DBH, PHt, b){
b[1] * DBH^b[2] * PHt^b[3]
}
但是,在正确指定初始参数值时,我遇到了困难。 R代码如下:
library(minpack.lm)
n <- 20
x <- seq(12, 60, length.out = n)
y <- seq(22, 45, length.out = n)
z <- x^2 * y ^ 3 + rnorm(n, 0, 0.1)
Data <- data.frame(DBH = x, PHt = y, TVT = z)
nlsFormula <- "TVT ~ volEquation(DBH, PHt, b)"
nlsInitial <- list(b = c(0.5, 2.25, 3.25))
nlsLMOutput <- nlsLM(formula = nlsFormula, data = Data, start = nlsInitial)
nlsOutput <- nls(formula = nlsFormula, data = Data, start = nlsInitial
nls 成功拟合了数据,而 nlsLM 给了我这个错误信息,
Error in
rownames<-
(*tmp*
, value = "b") : length of 'dimnames' [1] not equal to array extent
任何人都可以深入了解为什么 nlsLM 函数中会出现此问题吗?我试过筛选 nlsLM 代码,但我仍然不明白发生了什么。
尝试分离参数
volEquation <- function(DBH, PHt, x,y,z){
x * DBH^y * PHt^z
}
nlsFormula <- "TVT ~ volEquation(DBH, PHt, x, y, z)"
nlsInitial <- c(x=5e-3, y=2, z=1)
nlsOutput <- nlsLM(formula = nlsFormula, data = Data, start = nlsInitial, control=nls.lm.control(maxiter=100))