【发布时间】:2015-04-22 00:27:51
【问题描述】:
我正在使用 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*, value = "b") 中的错误: 'dimnames' [1] 的长度不等于数组范围
谁能提供关于为什么在 nlsLM 函数中出现此问题的见解?我已经尝试过筛选 nlsLM 代码,但我仍然不明白发生了什么。
【问题讨论】:
-
如果您使用示例输入数据创建reproducible example 会很好,这样我们就可以测试可能的解决方案。
-
代码的设置方式似乎不像
nls()那样喜欢本身就是向量的参数。 (来自用户提交的包,即使名称相似,它也不必遵循与基本函数相同的规则)。如果我增加最大迭代次数,测试数据将适用于我提出的解决方案。 -
@MrFlick 我很害怕,我终于弄清楚了问题在 nlsLM 代码中的位置(更具体地说,它在 nls.lm 函数中)但这可能超出了我的修复能力。分开的参数将不得不做。