[R] Use of optim to fit two curves at the same time ?
Greg Snow
538280 at gmail.com
Thu Apr 26 19:49:11 CEST 2012
The phrase "does not work" is not very helpful, it can mean quit a few
things including:
* Your computer exploded.
* No explosion, but smoke is pouring out the back and microsoft's
"NoSmoke" utility is not compatible with your power supply.
* The computer stopped working.
* The computer sits around on the couch all day eating chips and
watching talk shows.
* The computer has started picketing your house shouting catchy
slogans and demanding better working conditions and an increase in
memory.
* Everything went dark and you cannot check the cables on the back of
the computer because the lights are off due to the power outage.
* R crashed, but the other programs are still working.
* R gave an error message and stopped processing your code after
running for a while.
* R gave an error message without running any of your code (and is
waiting for your next command).
* R is still running your code and the time has exceeded your patience
so you think it has hung.
* R completed and returned a result, but also gave warnings.
* R completed your command, but gave an incorrect answer.
* R completed your command but the answer is different from what you
expect (but is correct according to the documentation)
There are probably others.
Running your code I think the answer is the last one. The criteria
for optim finishing is a small improvement relative to previous
improvements, not a guarantee of an exactly correct answer. Since
your starting points were very different from the "True" values this
means that what appears to be a good improvement can still be far from
the answer that you know to be true. There are various arguments that
you can give to optim to improve the fitting process, but sometimes
the easiest thing to do is to just run optim again using the previous
results as the new starting values. Try running the following:
out4 <- optim( par=out3$par, fn=function(x){optfunc3(x,dfxy,dfxy2)})
(out4 <- optim( par=out4$par, fn=function(x){optfunc3(x,dfxy,dfxy2)}))
and see if it "works". Run the last line a couple more times to see
how well it works (at least it worked for me, if this does not work
for you, tell us what "does not work" means).
On Wed, Apr 25, 2012 at 6:57 AM, Arnaud Mosnier <a.mosnier at gmail.com> wrote:
> Dear list,
>
> In order to find a solution to my problem, I created a third objective
> function including both calculations done in the previous cases. This
> function return a value (i.e. the value to be minimize by optim) equal to
> the sum of the two sum of squares, but it does not work (see the code added
> at the end of my previous script).
>
> Any suggestion ?
>
> Arnaud
>
>
> Dear list,
>>
>> Here is a small example code that use optim and optimize in order to fit
>> two functions.
>> Is it possible to fit two functions (like those two for example) at the
>> same time using optim ... or another function in R ?
>>
>> Thanks
>>
>> Arnaud
>>
>> ######################################################################
>> ## function 1
>> x1 <- 1:100
>> y1 <- 5.468 * x + 3 # + rnorm(100,0, 10)
>> dfxy <- cbind(x1,y1)
>>
>> # Objective function
>> optfunc <- function(x, dfxy){
>> a <- x[1]
>> b <- x[2]
>> xtest <- dfxy[,1]
>> yobs <- dfxy[,2]
>> ysim <- a*xtest + b
>> sum((ysim - yobs)^2)
>> }
>>
>> out<- optim(par=c(0.2,5), fn=function(x){optfunc(x, dfxy)}, method =
>> "Nelder-Mead", hessian = F)
>>
>>
>> ## function 2
>>
>> x2 <- seq(0.01, 0.1, length=100)
>> y2 <- exp(30*x2)
>> dfxy2 <- cbind(x2,y2)
>>
>> # objective function
>> optfunc2 <- function(x, dfxy){
>> a <- x[1]
>> xtest <- dfxy[,1]
>> yobs <- dfxy[,2]
>> ysim <- exp(a*xtest)
>> sum((ysim - yobs)^2)
>> }
>>
>> out<- optimize(f=function(x){optfunc2(x, dfxy2)}, interval=c(0,500))
>>
>> ######################################################################
>>
>>
>
> optfunc3 <- function(x, dfxy, dfxy2){
>
> a <- x[1]
> b <- x[2]
> xtest <- dfxy[,1]
> yobs <- dfxy[,2]
> ysim <- a*xtest + b
> obj1 <- sum((ysim - yobs)^2)
>
> c <- x[3]
> xtest2 <- dfxy2[,1]
> yobs2 <- dfxy2[,2]
> ysim2 <- exp(c*xtest2)
> obj2 <- sum((ysim2 - yobs2)^2)
>
> obj1 + obj2
> }
>
> out3<- optim(par=c(0.2,5, 500), fn=function(x){optfunc3(x, dfxy, dfxy2)},
> method = "Nelder-Mead", hessian = F)
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at 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.
--
Gregory (Greg) L. Snow Ph.D.
538280 at gmail.com
More information about the R-help
mailing list