Re: [R] How can I fitting this function from values.
Thanks for the help received, I will test the proposal. R is case sensitive ;-) so in your list of start values you must have B=3 and not b=3. Perhaps you have an object named b of a different length than your data somewhere giving rise to your error message. Also brute force wont work as Joerg point out. We have A*1/(1+t/B)*1/sqrt(1+t/C) = D/(B+t)/sqrt(C+t), where D = A*B*sqrt(C). We notice that we need B -t and C -t. Now one can use the port algorithme of nls() with constraints on parameters: foo - function(t,ccc){ D - ccc[1] B - ccc[2] C - ccc[3] D/(B+t)/sqrt(C+t) } ttt - seq(1,10,length=100) yyy - foo(ttt,c(5*3*sqrt(2),3,2)) set.seed(42) dat.test - data.frame(t=ttt,y=yyy+rnorm(100,0,.1)) fit.test - nls(y~D/(B+t)/sqrt(C+t),data=dat.test, start=c(D=5*3*sqrt(2),B=3,C=2), lower=c(-Inf,-1,-1),alg=port) # -Inf could be 0, -1 could be -min(dat.test$t) with(dat.test,plot(t,y)) with(dat.test,lines(t,foo(t,c(21.21,3,2)),col=green)) # Looks cool. lines(ttt,fitted(fit.test),col=red) Best regards Frede Aakmann Tøgersen Scientist UNIVERSITY OF AARHUS Faculty of Agricultural Sciences Dept. of Genetics and Biotechnology Blichers Allé 20, P.O. BOX 50 DK-8830 Tjele Phone: +45 8999 1900 Direct: +45 8999 1878 E-mail: [EMAIL PROTECTED] Web: http://www.agrsci.org This email may contain information that is confidential. Any use or publication of this email without written permission from Faculty of Agricultural Sciences is not allowed. If you are not the intended recipient, please notify Faculty of Agricultural Sciences immediately and delete this email. -Oprindelig meddelelse- Fra: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] På vegne af Rolf Turner Sendt: 12. november 2007 21:16 Til: Horacio Castellini Cc: r-help@r-project.org Emne: Re: [R] How can I fitting this function from values. On 13/11/2007, at 8:27 AM, Horacio Castellini wrote: Hi all, I'd like fit this function: G(t)=A*1/(1+t/B)*1/sqrt(1+t/C) where A, B and C are fitting constants that one like search. I have got a fcs-(t,G(t)) value table in a data frame. Any one can help me? Tahnks Horacio. I ***thought*** that nls would solve your problem in a trice. But I tried a toy example before replying to you, and it messed up mightily: foo - function(t,ccc){ ccc[1]*1/(1+t/ccc[2])*1/sqrt(1+1/ccc[3]) } ttt - seq(1,10,length=100) yyy - foo(ttt,c(5,3,2)) set.seed(42) dat.test - data.frame(t=ttt,y=yyy+rnorm(100,0,0.1)) with(dat.test,plot(t,y)) with(dat.test,lines(t,foo(t,c(5,3,2 # Looks cool. fit.test - nls(y~A*1/(1+t/B)*1/sqrt(1+t/C),start=list (A=5,b=3,C=2),data=dat.test) # Gives error; no idea what the implications are. The error message: Error in `[[-.data.frame`(`*tmp*`, var, value = c(0.70934153524875, 0.761288405463172, : replacement has 65 rows, data has 100 In addition: Warning message: In t/B : longer object length is not a multiple of shorter object length I don't think I have *ever* had a good experience with nls(); it is always pretty flaky. (Well, maybe it worked for me once ..., can't remember for sure. :-) ) cheers, Rolf Turner ## Attention:\ This e-mail message is privileged and confid...{{dropped:9}} __ 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. __ 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.
Re: [R] How can I fitting this function from values.
On 13/11/2007, at 8:54 PM, Frede Aakmann Tøgersen wrote: R is case sensitive ;-) so in your list of start values you must have B=3 and not b=3. Duhh!!! Typo. Perhaps you have an object named b of a different length than your data somewhere giving rise to your error message. Nope. That's not it. Also brute force wont work as Joerg point out. We have A*1/(1+t/B)*1/sqrt(1+t/C) = D/(B+t)/sqrt(C+t), where D = A*B*sqrt(C). We notice that we need B -t and C -t. OTOH if one invokes optim() --- with method=BFGS (no constraints) it goes like a train (given the excellent starting values, at least): foo - function(t,ccc){ ccc[1]*1/(1+t/ccc[2])*1/sqrt(1+1/ccc[3]) } ttt - seq(1,10,length=100) yyy - foo(ttt,c(5,3,2)) set.seed(42) dat.test - data.frame(t=ttt,y=yyy+rnorm(100,0,0.1)) with(dat.test,plot(t,y)) with(dat.test,lines(t,foo(t,c(5,3,2 bar - function(par,y,t) { yhat - foo(t,par) sum((y-yhat)^2) } fit.test - optim(c(5,3,2),bar,method=BFGS,control=list (trace=6),t=dat.test$t,y=dat.test$y) It converges virtually instantaneously and the fit looks good: fit.test $par [1] 5.096597 2.888116 2.039852 $value [1] 1.062285 $counts function gradient 176 $convergence [1] 0 $message NULL yhat - foo(dat.test$t,fit.test$par) lines(dat.test$t,yhat,col=red) Moral of the story: It's better and easier and less frustrating to use optim() rather than nls() wherever possible. cheers, Rolf Turner Now one can use the port algorithme of nls() with constraints on parameters: foo - function(t,ccc){ D - ccc[1] B - ccc[2] C - ccc[3] D/(B+t)/sqrt(C+t) } ttt - seq(1,10,length=100) yyy - foo(ttt,c(5*3*sqrt(2),3,2)) set.seed(42) dat.test - data.frame(t=ttt,y=yyy+rnorm(100,0,.1)) fit.test - nls(y~D/(B+t)/sqrt(C+t),data=dat.test, start=c(D=5*3*sqrt(2),B=3,C=2), lower=c(-Inf,-1,-1),alg=port) # -Inf could be 0, -1 could be -min(dat.test$t) with(dat.test,plot(t,y)) with(dat.test,lines(t,foo(t,c(21.21,3,2)),col=green)) # Looks cool. lines(ttt,fitted(fit.test),col=red) Best regards Frede Aakmann Tøgersen Scientist UNIVERSITY OF AARHUS Faculty of Agricultural Sciences Dept. of Genetics and Biotechnology Blichers Allé 20, P.O. BOX 50 DK-8830 Tjele Phone: +45 8999 1900 Direct: +45 8999 1878 E-mail: [EMAIL PROTECTED] Web: http://www.agrsci.org This email may contain information that is confidential. Any use or publication of this email without written permission from Faculty of Agricultural Sciences is not allowed. If you are not the intended recipient, please notify Faculty of Agricultural Sciences immediately and delete this email. -Oprindelig meddelelse- Fra: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] På vegne af Rolf Turner Sendt: 12. november 2007 21:16 Til: Horacio Castellini Cc: r-help@r-project.org Emne: Re: [R] How can I fitting this function from values. On 13/11/2007, at 8:27 AM, Horacio Castellini wrote: Hi all, I'd like fit this function: G(t)=A*1/(1+t/B)*1/sqrt(1+t/C) where A, B and C are fitting constants that one like search. I have got a fcs-(t,G(t)) value table in a data frame. Any one can help me? Tahnks Horacio. I ***thought*** that nls would solve your problem in a trice. But I tried a toy example before replying to you, and it messed up mightily: foo - function(t,ccc){ ccc[1]*1/(1+t/ccc[2])*1/sqrt(1+1/ccc[3]) } ttt - seq(1,10,length=100) yyy - foo(ttt,c(5,3,2)) set.seed(42) dat.test - data.frame(t=ttt,y=yyy+rnorm(100,0,0.1)) with(dat.test,plot(t,y)) with(dat.test,lines(t,foo(t,c(5,3,2 # Looks cool. fit.test - nls(y~A*1/(1+t/B)*1/sqrt(1+t/C),start=list (A=5,b=3,C=2),data=dat.test) # Gives error; no idea what the implications are. The error message: Error in `[[-.data.frame`(`*tmp*`, var, value = c(0.70934153524875, 0.761288405463172, : replacement has 65 rows, data has 100 In addition: Warning message: In t/B : longer object length is not a multiple of shorter object length I don't think I have *ever* had a good experience with nls(); it is always pretty flaky. (Well, maybe it worked for me once ..., can't remember for sure. :-) ) cheers, Rolf Turner # # Attention:\ This e-mail message is privileged and confid...{{dropped:9}} __ 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. ## Attention: This e-mail message is privileged and confidential. If you are not the intended recipient
[R] How can I fitting this function from values.
Hi all, I'd like fit this function: G(t)=A*1/(1+t/B)*1/sqrt(1+t/C) where A, B and C are fitting constants that one like search. I have got a fcs-(t,G(t)) value table in a data frame. Any one can help me? Tahnks Horacio. __ 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.
Re: [R] How can I fitting this function from values.
On Mon, Nov 12, 2007 at 04:27:26PM -0300, Horacio Castellini wrote: Hi all, I'd like fit this function: G(t)=A*1/(1+t/B)*1/sqrt(1+t/C) where A, B and C are fitting constants that one like search. I have got a fcs-(t,G(t)) value table in a data frame. Any one can help me? Tahnks Horacio. if your data are in `df' and the columns are labeled `t' and `G' this seems what you want (cf. `?nls'): nls(G ~ A*1/(1+t/B)*1/sqrt(1+t/C), start =list(A=1, B=2, C=3), data = df) where `start' should be set to reasonable start values. and I would think, it is better to use p1 = 1/B, p2= 1/C during the fit (no singularities of G for certain parameter values...). joerg __ 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.
Re: [R] How can I fitting this function from values.
On 13/11/2007, at 8:27 AM, Horacio Castellini wrote: Hi all, I'd like fit this function: G(t)=A*1/(1+t/B)*1/sqrt(1+t/C) where A, B and C are fitting constants that one like search. I have got a fcs-(t,G(t)) value table in a data frame. Any one can help me? Tahnks Horacio. I ***thought*** that nls would solve your problem in a trice. But I tried a toy example before replying to you, and it messed up mightily: foo - function(t,ccc){ ccc[1]*1/(1+t/ccc[2])*1/sqrt(1+1/ccc[3]) } ttt - seq(1,10,length=100) yyy - foo(ttt,c(5,3,2)) set.seed(42) dat.test - data.frame(t=ttt,y=yyy+rnorm(100,0,0.1)) with(dat.test,plot(t,y)) with(dat.test,lines(t,foo(t,c(5,3,2 # Looks cool. fit.test - nls(y~A*1/(1+t/B)*1/sqrt(1+t/C),start=list (A=5,b=3,C=2),data=dat.test) # Gives error; no idea what the implications are. The error message: Error in `[[-.data.frame`(`*tmp*`, var, value = c(0.70934153524875, 0.761288405463172, : replacement has 65 rows, data has 100 In addition: Warning message: In t/B : longer object length is not a multiple of shorter object length I don't think I have *ever* had a good experience with nls(); it is always pretty flaky. (Well, maybe it worked for me once ..., can't remember for sure. :-) ) cheers, Rolf Turner ## Attention:\ This e-mail message is privileged and confid...{{dropped:9}} __ 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.
Re: [R] How can I fitting this function from values.
R is case sensitive ;-) so in your list of start values you must have B=3 and not b=3. Perhaps you have an object named b of a different length than your data somewhere giving rise to your error message. Also brute force wont work as Joerg point out. We have A*1/(1+t/B)*1/sqrt(1+t/C) = D/(B+t)/sqrt(C+t), where D = A*B*sqrt(C). We notice that we need B -t and C -t. Now one can use the port algorithme of nls() with constraints on parameters: foo - function(t,ccc){ D - ccc[1] B - ccc[2] C - ccc[3] D/(B+t)/sqrt(C+t) } ttt - seq(1,10,length=100) yyy - foo(ttt,c(5*3*sqrt(2),3,2)) set.seed(42) dat.test - data.frame(t=ttt,y=yyy+rnorm(100,0,.1)) fit.test - nls(y~D/(B+t)/sqrt(C+t),data=dat.test, start=c(D=5*3*sqrt(2),B=3,C=2), lower=c(-Inf,-1,-1),alg=port) # -Inf could be 0, -1 could be -min(dat.test$t) with(dat.test,plot(t,y)) with(dat.test,lines(t,foo(t,c(21.21,3,2)),col=green)) # Looks cool. lines(ttt,fitted(fit.test),col=red) Best regards Frede Aakmann Tøgersen Scientist UNIVERSITY OF AARHUS Faculty of Agricultural Sciences Dept. of Genetics and Biotechnology Blichers Allé 20, P.O. BOX 50 DK-8830 Tjele Phone: +45 8999 1900 Direct: +45 8999 1878 E-mail: [EMAIL PROTECTED] Web: http://www.agrsci.org This email may contain information that is confidential. Any use or publication of this email without written permission from Faculty of Agricultural Sciences is not allowed. If you are not the intended recipient, please notify Faculty of Agricultural Sciences immediately and delete this email. -Oprindelig meddelelse- Fra: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] På vegne af Rolf Turner Sendt: 12. november 2007 21:16 Til: Horacio Castellini Cc: r-help@r-project.org Emne: Re: [R] How can I fitting this function from values. On 13/11/2007, at 8:27 AM, Horacio Castellini wrote: Hi all, I'd like fit this function: G(t)=A*1/(1+t/B)*1/sqrt(1+t/C) where A, B and C are fitting constants that one like search. I have got a fcs-(t,G(t)) value table in a data frame. Any one can help me? Tahnks Horacio. I ***thought*** that nls would solve your problem in a trice. But I tried a toy example before replying to you, and it messed up mightily: foo - function(t,ccc){ ccc[1]*1/(1+t/ccc[2])*1/sqrt(1+1/ccc[3]) } ttt - seq(1,10,length=100) yyy - foo(ttt,c(5,3,2)) set.seed(42) dat.test - data.frame(t=ttt,y=yyy+rnorm(100,0,0.1)) with(dat.test,plot(t,y)) with(dat.test,lines(t,foo(t,c(5,3,2 # Looks cool. fit.test - nls(y~A*1/(1+t/B)*1/sqrt(1+t/C),start=list (A=5,b=3,C=2),data=dat.test) # Gives error; no idea what the implications are. The error message: Error in `[[-.data.frame`(`*tmp*`, var, value = c(0.70934153524875, 0.761288405463172, : replacement has 65 rows, data has 100 In addition: Warning message: In t/B : longer object length is not a multiple of shorter object length I don't think I have *ever* had a good experience with nls(); it is always pretty flaky. (Well, maybe it worked for me once ..., can't remember for sure. :-) ) cheers, Rolf Turner ## Attention:\ This e-mail message is privileged and confid...{{dropped:9}} __ 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. __ 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.