1. What does "i" in your formula represent? Have you worked the examples in the "nls" help page, and do you understand how it works? "nls" tries to do vector computations.

2. Unfortunately, "nls" often quits with errors like "singular convergence". A standard way around that problem is to use a general purpose optimizer like "optim" to get the answer, then feed that answer to "nls". I also use "fit <- optim(..., hessian=TRUE)" and then compute "eigen(fit$hessian, symmetric=TRUE)": If the smallest eigenvalue is less than roughly 0.0001 times the largest, it suggests that there may not be sufficient information in the data to estimate all the parameters. Then looking at the eigenvector corresponding to the largest eigenvalue should help you identify a parameter than can be fixed in the model to produce a model that for which all the parameters are reasonably estimable.

3. If this still doesn't solve your problem, please post another question. First, however, I suggest you try to generate a commented, minimal, self-contained, reproducible example, as suggested in the posting guide "www.R-project.org/posting-guide.html". Often the effort of doing so will lead you to an answer to your question. If not, the simpler example will often increase the probability of a useful reply. Hope this helps. Spencer Graves


MathZero wrote:
Hi, I am trying to use the nls() function to closely approximate a vector of
values, colC and I'm running into trouble.  I am not sure how if I am asking
the program to do what I think its doing, because the same minimization in
Excel's Solver does not run into problems.  If anyone can tell me what is
going wrong, and why I'm getting a singular convergence(7) error, please
tell me.  I have also included, after the R code, the optimal answers
according to Excel.  The reason I'm using R is because of the (relative)
ease of getting the standard errors on the coefficients, which I don't
believe Excel Solver does.  I'm new to nonlinear optimization, so please
forgive any obvious things I've overlooked.  Thank you very much for taking
a look!

Here is the R code, and error message:

ColumnA.data<-read.csv(file.choose()) #select ColA.csv
ColumnB.data<-read.csv(file.choose()) #select ColB.csv
ColumnC.data<-read.csv(file.choose()) #select ColC.csv
colA<-ColumnA.data[0:3600,]
colB<-ColumnB.data[0:3600,]
colC<-ColumnC.data[0:3600,]

i<-1:3600

cor.model<-nls(colC ~ exp( - beta2 * abs( colB[i] - colA[i] ) / 12 ) - ( 1 -
exp( - beta2 * abs(  colB[i] - colA[i] ) / 12 ) ) * exp( - beta1 / ( min(
colB[i], colA[i] ) / 12 ) ) , start=list(beta1 = 0.37, beta2 = 0.06), trace
= T, control=nls.control(minFactor=1/4096) , alg="port",
lower=list(beta1=0.35,beta2=0.05))
  0:     7.7890438: 0.370000 0.0600000
  1:     7.4408010:  3.96197 0.0597763
  2:     4.5308657:  3.96197 0.0500000
  3:     4.5308657:  3.96197 0.0500000
Error in nls(colC ~ exp(-beta2 * abs(colB[i] - colA[i])/12) - (1 -
exp(-beta2 * : Convergence failure: singular convergence (7)




The optimal answers, according to Excel are:
beta2= 0.0670690912936098
beta1=0.398341074464919

when I try to check the residuals myself with the following R code, I get
the same answer as when I calculate them in Excel:

colE<-function(i) {(colC[i]-exp( - beta2 * abs( colB[i] - colA[i] ) / 12 ) -
( 1 - exp( - beta2 * abs(  colB[i] - colA[i] ) / 12 ) ) * exp( - beta1 / (
min( colB[i], colA[i] ) / 12 ) ) )^2}

Any ideas?  Thank you for your help!




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

Reply via email to