Robert D. Merithew
2001-Dec-14 19:06 UTC
[R] nls fit to exponential decay with unknown time origin
I'm trying to use nls() to fit an exponential decay with an unknown offset in the time (independent variable). (Perhaps this is inherently very difficult?).> decay.pl <- nls (amp ~ expn(b0,b1,tau,t0,t), data = decay,+ start = c(b0=1, b1=7.5, tau=3.5, t0=0.1), trace=T) Error in nlsModel(formula, mf, start) : singular gradient matrix at initial parameter estimates> > expn(1, 7.5, 3.5, 0.1, decay$t)[1] 6.636080 5.259657 4.164661 2.797383 1.760584 1.250300 attr(,"gradient") b0 b1 tau t0 [1,] 1 0.75147729 -0.4600881 1.61030849 [2,] 1 0.56795432 -0.6884997 1.21704497 [3,] 1 0.42195477 -0.7801858 0.90418880 [4,] 1 0.23965104 -0.7336256 0.51353794 [5,] 1 0.10141123 -0.4973290 0.21730978 [6,] 1 0.03337327 -0.2431481 0.07151415>Is the gradient matrix really singular? It works without the t0 parameter. Code follows (after MASS 2nd ed. p. 271): ---------- require(nls) t <- c(1.1,2.08,3.12,5.1,8.11,12) amp <- c(7.4, 6.1, 4.95, 3.5, 2.3, 1.5) decay <- data.frame (t = t, amp = amp) expn <- function (b0, b1, tau, t0, t) { temp <- exp((t0-t)/tau) model.func <- b0 + b1 * temp Z <- cbind(1, temp, (b1 * (t0-t) * temp) / tau^2, b1 * temp / tau) dimnames(Z) <- list(NULL, c("b0","b1","tau","t0")) attr(model.func, "gradient") <- Z model.func } decay.pl <- nls (amp ~ expn(b0,b1,tau,t0,t), data = decay, start = c(b0=1, b1=7.5, tau=3.5, t0=0.1), trace=T) ---------- thanks, -- Robert Merithew Laboratory of Atomic and Solid State Physics, Clark Hall Cornell University, Ithaca, NY -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html Send "info", "help", or "[un]subscribe" (in the "body", not the subject !) To: r-help-request at stat.math.ethz.ch _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
Peter Dalgaard BSA
2001-Dec-14 19:23 UTC
[R] nls fit to exponential decay with unknown time origin
"Robert D. Merithew" <merithew at ccmr.cornell.edu> writes:> I'm trying to use nls() to fit an exponential decay with an unknown offset > in the time (independent variable). (Perhaps this is inherently very > difficult?). > > > > decay.pl <- nls (amp ~ expn(b0,b1,tau,t0,t), data = decay, > + start = c(b0=1, b1=7.5, tau=3.5, t0=0.1), trace=T) > Error in nlsModel(formula, mf, start) : singular gradient matrix at > initial parameter estimates > > > > expn(1, 7.5, 3.5, 0.1, decay$t) > [1] 6.636080 5.259657 4.164661 2.797383 1.760584 1.250300 > attr(,"gradient") > b0 b1 tau t0 > [1,] 1 0.75147729 -0.4600881 1.61030849 > [2,] 1 0.56795432 -0.6884997 1.21704497 > [3,] 1 0.42195477 -0.7801858 0.90418880 > [4,] 1 0.23965104 -0.7336256 0.51353794 > [5,] 1 0.10141123 -0.4973290 0.21730978 > [6,] 1 0.03337327 -0.2431481 0.07151415 > > > > > Is the gradient matrix really singular? It works without the t0 > parameter. >Yes. b1 and t0 are not simultaneously identifiable. Shifting an exponential curve in time is the same as multiplying by a constant. Try calculating the ratio of the t0 and b1 columns above. -- O__ ---- Peter Dalgaard Blegdamsvej 3 c/ /'_ --- Dept. of Biostatistics 2200 Cph. N (*) \(*) -- University of Copenhagen Denmark Ph: (+45) 35327918 ~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk) FAX: (+45) 35327907 -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html Send "info", "help", or "[un]subscribe" (in the "body", not the subject !) To: r-help-request at stat.math.ethz.ch _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._