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