Dick Harray
2010-Nov-05 00:45 UTC
[R] User defined function and nonlinear least-squares fit
Hello, I'd like to fit a user defined function to a data set, but I have problems to find my problem. The user defined function is a combination of two rectangular functions, and the listing below gives an example for what I want to do. The problem is, that I get the error message for fit1 and fit2 "Error in nlsModel(formula, mf, start, wts) : singular gradient matrix at initial parameter estimates". traceback() shows "stop("singular gradient matrix at initial parameter estimates")" as the last step in both cases, so I assume, that I make a fundamental mistake, because start values should be OK. So my two questions are: 1) How do I fit only one parameter as tried with fit1 in the example? 2) How do I fit all parameters as tried with fit2 in the example? Thanks, Dirk rm(list=ls(all=TRUE)) # rectangular function g <- function (x, x0=0, P=1, w=0.5) { .g <- function(.x, .x0=x0, .P=P, .w=w) { .x <- .x - (.x %/% .P)*.P if ( (.x >= x0 ) & (.x <= .x0 + .w) ) {return(1)} else {return(0)} } return( unlist(lapply(x, .g))) } # combining two rectangular functions with an offset dx f <- function (x, x0=0, P=2, w=0.5, dx=1) { .f <- function(.x, .dx=dx, .P=P, .w=w) g(x=(x0+.x), P=.P, w=.w) + g(x=(x0+.x+dx), P=.P, w=.w) return( unlist(lapply(x, .f))) } # generate a data set dataset <- curve(f(x, dx=0.65), 1, 5, n=1e3) # add some noise dataset$x <- dataset$x + rnorm(1e3, 0, 0.02) dataset$y <- dataset$y + rnorm(1e3, 0, 0.05) points(dataset, type='p', cex=0.67, col='blue') # trying to fit only one parameter fit1 <- nls( y ~ f(x, x0=0, P=2, w=0.5, dx), start = list(dx=0.6), data = dataset ) # trying to fit all parameters fit2 <- nls( y ~ f(x), start = list(x0=0, P=2, w=0.5, dx=0.6), data = dataset ) [[alternative HTML version deleted]]