On Wed, Jun 15, 2011 at 5:35 PM, Gabor Grothendieck <ggrothendi...@gmail.com> wrote: > On Wed, Jun 15, 2011 at 11:06 AM, Christopher Hulme-Lowe > <hulme...@umn.edu> wrote: >> I'm trying to fit the Bass Diffusion Model using the nls function in R but >> I'm running into a strange problem. The model has either two or three >> parameters, depending on how it's parameterized, p (coefficient of >> innovation), q (coefficient of immitation), and sometimes m (maximum market >> share). Regardless of how I parameterize the model I get an error saying >> that the step factor has decreased below it's minimum. I have tried >> re-setting the minimum in nls.controls but that doesn't seem to fix the >> problem. Likewise, I have run through a variety of start values in the past >> few days, all to no avail. Looking at the trace output it appears that R >> believes I always have one more parameter than I actually have (i.e. when >> the model is parameterized with p and q R seems to be seeing three >> parameters, when m is also included R seems to be seeing four). My >> experience with nls is limited, can someone explain to me why it's doing >> this? I've included the data set I'm working with (published in Michalakelis >> et al. 2008) and some example code. >> >> ## Assign relevant variables >> adoption <- >> c(167000,273000,531000,938000,2056452,3894103,5932090,7963742,9314687,10469060,11393302,11976340) >> time <- seq(from = 1,to = 12, by = 1) >> ## Models >> Bass.Model <- adoption ~ ((p + q)^2/p) * (exp(-(p + q) * time)/((q / p) * >> exp(-(p + q) * time) + 1)^2) >> ## Starting Parameters >> Bass.Params <- list(p = 0.1, q = 0.1) >> ## Model fitting >> Bass.Fit <- nls(formula = Bass.Model, start = Bass.Params, algorithm = >> "plinear", trace = TRUE) > > Using the default nls algorithm (which means we must specify m in the > formula and in the starting values) rather than "plinear" and using > commonly found p and q for starting values: > >> Bass.Model <- adoption ~ m * ((p + q)^2/p) * (exp(-(p + q) * time)/((q / p) * > + exp(-(p + q) * time) + 1)^2) >> nls(formula = Bass.Model, start = c(p = 0.03, q = 0.4, m = max(adoption))) > Nonlinear regression model > model: adoption ~ m * ((p + q)^2/p) * (exp(-(p + q) * time)/((q/p) > * exp(-(p + q) * time) + 1)^2) > data: parent.frame() > p q m > 2.70842174019e-03 4.56307730094e-01 1.02730314877e+08 > residual sum-of-squares: 2922323788247 > > Number of iterations to convergence: 14 > Achieved convergence tolerance: 3.05692430520e-06
and if its important to you to use "plinear" then try absorbing (p+q)^2/p into m which means you will have to back that out from .lin to calculate m: > Bass.Model <- adoption ~ (exp(-(p + q) * time)/((q / p) * + exp(-(p + q) * time) + 1)^2) > nls(formula = Bass.Model, start = c(p = 0.03, q = 0.4), alg = "plinear") Nonlinear regression model model: adoption ~ (exp(-(p + q) * time)/((q/p) * exp(-(p + q) * time) + 1)^2) data: parent.frame() p q .lin 2.70843216557e-03 4.56307130968e-01 7.99164076337e+09 residual sum-of-squares: 2922323788276 Number of iterations to convergence: 12 Achieved convergence tolerance: 2.56069064476e-06 -- Statistics & Software Consulting GKX Group, GKX Associates Inc. tel: 1-877-GKX-GROUP email: ggrothendieck at gmail.com ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.