Dear Nilsson,
    Thank you very much for your reply which gave me much instruction!
    I will have a try on the suggested way from you.
    In fact, to get the value of MA is the most important thing for me 
in the fitting by this model. And I have thought about the linear model 
fitting at first, but you know, when the the functional form  be changed 
as:   
y = (a + b*c^2 + d*c^4) + (-2*b*c - 4*d*c^3)*x +

    (d + b*6*c^2)*x^2   - (4*d*c)*x^3 + d*x^4 + epsilon

     four coefficient (a,b,c,d) turns to five in this linear model (for 
constant, x, x^2, x^3, x^4), that means there should be some 
relationship among the five coefficients,  which cannot be reflected in 
the linear model. So I cannot get the accurate value for the parameters.

    For your reference:
    As what you pointed out, the initial value for a,b,c,MA is critical 
for nls. In recent days, I tried recruiting the model, y~a*x^4+b*x^2+c, 
to get the initial value of a0, b0, and c0, and it works, but cannot 
avoid the convergence problem totally (the probability went down).

    Thank you very much again!
    I really appreciate your help!

Best regards,
Warren


Nilsson Fredrik X wrote:
> Dear Warren,
>
> I had similar problems, this is (roughly) how I solved it translated to your 
> problem:
> x <- c(-0.06,-0.04,-0.025,-0.015,-0.005,0.005,0.015,0.025,0.04,0.06)
>
> y <- c(1866760,1457870,1314960,1250560,1184850,1144920,
>        1158850,1199910,1263850,1452520)
>
> dafa<-data.frame(x,y)
> plot(x,y)
>
> foqufu<-function(parm)
> {
> const<-parm[1]
> A<-parm[2]
> B<-parm[3]
> MA<-parm[4]
>
> d<-y-(const + A*(x-MA)^4 + B*(x-MA)^2)
> d<-d%*%d
> return(d)
> }
>
> # This is your initial guess
> aaa<-c(10000000, 100000000, -1000000, 0)
> # As already pointed out, you have a bad initial guess.
>
>
> apa3<-optim(aaa, foqufu, control=list(maxit=20000, reltol=1e-16))
> apa3<-optim(apa3$par, foqufu, control=list(maxit=20000, reltol=1e-16))
> apa3<-optim(apa3$par, foqufu, control=list(maxit=20000, reltol=1e-16))
> apa3<-optim(apa3$par, foqufu, control=list(maxit=20000, reltol=1e-16))
> # I do this a couple of times until convergence
> apa3<-optim(apa3$par, foqufu, control=list(maxit=20000, reltol=1e-10))
>
> fitOup<- nls(y ~ constant + A*(x-MA)^4 + B*(x-MA)^2, data=dafa,
>   start=list(constant= 4.911826e+06, A=2.625077e+08, B=-6.278897e+07, 
> MA=3.538064e-01), 
>   control=nls.control(maxiter=100, minFactor=1/4096), trace=TRUE)
>
>
> Note that due to your bad initial guess on parameters you end up in a local 
> not global minimum which is the trouble with nonlinear optimization. A way 
> out would perhaps be to randomize your initial guesses.
>
> Andy's way of getting the initial values is better in that respect. NOTE that 
> he searches for the quadratic first (downplaying the importance of the 
> quartic term) But technically I don't understand the  need to scale your y's, 
> in this case you get the same.
>  
> Another way of finding some intial values is to solve (const + B*MA^2 = 
> intercept, -2*B*MA = coefficient of x, B = coefficient of x^2 in the J2.lm 
> fit below; assuming that J2.lm (below has been fit):
> B<-as.numeric(coef(J2.lm)[3])
> A<-0
> MA<-as.numeric(coef(J2.lm)[2])/2/B
> const<- as.numeric(coef(J2.lm)[1])-B*MA^2
>
> bbb<-c(const, 0, B, MA)
> apa3<-optim(bbb, foqufu, control=list(maxit=20000, reltol=1e-16))
> #iterating a couple of times
> apa3<-optim(apa3$par, foqufu, control=list(maxit=20000, reltol=1e-16))
> #gives the same solution as Andy's
> ).
> #variation of Andy's solution (no scaling of y)
> J2.lm<-lm(y~1 + x + I(x^2), data=dafa)
> summary(J2.lm)
>
> plot(xx, predict(J2.lm, ydf))
> xx[which.min(predict(J2.lm, ydf))]
> Ja2.lm<-lm(y~1 + I((x-0.01)^2), data=dafa)
> summary(Ja2.lm)
> plot(x,y)
> points(x, predict(Ja2.lm, data=data.frame(x=x-0.01, y=y)), col="red")
>
> apa <-optim(c(1146530, 0,139144223, 0.01), foqufu, control=list(maxit=20000, 
> reltol=1e-10))
>
> fitOup3b<- nls(y ~ constant + A*(x-MA)^4 + B*(x-MA)^2, data=dafa,
>   start=list(constant= apa$par[1], A=apa$par[2], B= apa$par[3], 
> MA=apa$par[4]),
>   control=nls.control(maxiter=100, minFactor=1/4096), trace=TRUE)
> # this is exactly the same solution as Andy's, except that the residuals are 
> # 1e12 larger and A,B, const are 1e6 larger (due to the scaling).
>
>
> BUT, and this is a big BUT, why on earth do you choose this functional form? 
> First, the plot(x,y) suggest to my eyes that the function is not symmetric 
> around its centre. Second, if you're not particularly interested in finding a 
> value for MA (i.e. it can be considered as a constant) why not use a simple 
> linear regression with a polynomial? What I mean here is that if:
>
> y = a + b*(x-c)^2 + d*(x-c)^4 + epsilon
> (and no variability in c) then
> y = (a + b*c^2 + d*c^4) + (-2*b*c - 4*d*c^3)*x + 
>     (d + b*6*c^2)*x^2   - (4*d*c)*x^3 + d*x^4 + epsilon
>
> So in fact you could do:
> A.lm<-lm(y ~ poly(x,4), data=dafa)
> Summary(A.lm)
> # suggests that fourth order not necessary
> B.lm<-lm(y ~ poly(x,3), data=dafa).
> anova(B.lm, A.lm)
>
> # note that this suggest that your problem has an asymmetry that  
> # should be accounted for (unless you have very strong reasons for choosing 
> # your particular model formulation).  
>
> Third, and this is a more critical question (which I hope that the experts on 
> nls/R gurus would comment on how to solve) I think it is problematic to have 
> variability in LOCATION such as your shift variable (MA). It seems to 
> introduce all sorts of nastiness, which ought to be particularly severe in 
> non-linear regression.
>
> Best regards,
> Fredrik 
>
> -----Ursprungligt meddelande-----
> Från: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] 
> Skickat: den 5 september 2007 18:24
> Till: Yu (Warren) Wang
> Kopia: [EMAIL PROTECTED]; [EMAIL PROTECTED]
> Ämne: Re: [R] question about non-linear least squares in R
>
> Here is one way of getting a reasonable fit:
>
> 1.  Scale your y's by dividing all values by 1e6.
> 2.  Plot x vs. y.  The plot looks like a quadratic function.
> 3.  Fit a quadratic const. + B*x^2 - this a linear regression problem so
> use lm.
> 4.  Plot the predictions.
> 5.  Eyball the necessary shift - MA is around 0.01.  Refit const. +
> B*(x-.01)^2.  Should get const.=1.147 and B=139.144
> 6.  Use start=list(const.= 1.147, A=0, B=1.147, MA=.01).  nls should
> converge in 4 iterations.
>
> In general, good starting points may be crucial to nls convergence.
> Scaling the y's to reasonable values also helps.
>
> Hope this helps,
>
> Andy
>
> __________________________________
> Andy Jaworski
> 518-1-01
> Process Laboratory
> 3M Corporate Research Laboratory
> -----
> E-mail: [EMAIL PROTECTED]
> Tel:  (651) 733-6092
> Fax:  (651) 736-3122
>
>
>                                                                            
>              "Yu (Warren)                                                  
>              Wang"                                                         
>              <[EMAIL PROTECTED]>                                          To 
>              Sent by:                  "[EMAIL PROTECTED]"          
>              [EMAIL PROTECTED]         <[EMAIL PROTECTED]>          
>              at.math.ethz.ch                                            cc 
>                                                                            
>                                                                    Subject 
>              09/05/2007 02:51          [R] question about non-linear least 
>              AM                        squares in R                        
>                                                                            
>                                                                            
>                                                                            
>                                                                            
>                                                                            
>                                                                            
>
>
>
>
> Hi, everyone,
>     My question is: It's not every time that you can get a converged
> result from the nls function. Is there any solution for me to get a
> reasonable result? For example:
>
> x <- c(-0.06,-0.04,-0.025,-0.015,-0.005,0.005,0.015,0.025,0.04,0.06)
>
> y <-
> c(1866760,1457870,1314960,1250560,1184850,1144920,1158850,1199910,1263850,1452520)
>
>
> fitOup<- nls(y ~ constant + A*(x-MA)^4 + B*(x-MA)^2,
> start=list(constant=10000000, A=100000000, B=-1000000, MA=0),
> control=nls.control(maxiter=100, minFactor=1/4096), trace=TRUE)
>
>
>
>  For this one, I cannot get the converged result, how can I reach it? To
> use another funtion or to modify some settings for nls?
>
> Thank you very much!
>
> Yours,
>
> Warren
>
> ______________________________________________
> [EMAIL PROTECTED] 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.
>
>
>
>

______________________________________________
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