向nlsLM提供适当的启动参数时出错

时间:2015-04-22 00:27:52

标签: r nls

我正在使用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给了我这个错误信息,

  

rownames<-中的错误(*tmp*,值=“b”):     'dimnames'[1]的长度不等于数组范围

任何人都可以提供有关nlsLM函数中出现此问题的原因吗?我试过筛选nlsLM代码,但我仍然不明白发生了什么。

1 个答案:

答案 0 :(得分:2)

尝试分离参数

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))