Search code examples
rnls

Error supplying appropriate start parameters to nlsLM


I was playing around with the nlsLM function, from the minpack.lm library, and encountered some behaviour that I don't understand.

Given that the following function produces output when I supply a numeric vector 'b' as input I wanted to use this function to fit a nonlinear model to my data.

volEquation <- function(DBH, PHt, b){
       b[1] * DBH^b[2] * PHt^b[3]
}

However I have become stuck when it comes to correctly specifying the initial parameter values. R code follows:

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 was successful at fitting the data while nlsLM gave me this error message,

Error in rownames<-(*tmp*, value = "b") : length of 'dimnames' [1] not equal to array extent

Can anyone provide insight as to why this problem occurs in the nlsLM function? I've tried sifting through the nlsLM code but I still don't understand what's going on.


Solution

  • Try separating your parameters

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