21

I am trying to use the optim function in R - I have no problems with this:

funk=function(param){
  x=c(1,2,3,4,5)
  z=c(3,4,2,2,1)
  y=c(30,40,22,33,40)
  a=rep(param[1],5)
  b=param[2]
  d=param[3]
  fit=sum((y-(a+b*x+z*d))^2)
  return(fit)
}

optim(par=c(1,1,1),fn=funk)
#

But as soon as I don't want to hard-code my data (x,y,z) into the function I have problems. How do I optimize a function in optim when the function input is more than just the parameters to be optimized? Ideally I would pass on value of xx, zz, yy then optimize, then move to differnt values of xx, zz, yy and optimize that case next.

xx=c(1,2,3,4,5)
zz=c(3,4,2,2,1)
yy=c(30,40,22,33,40)

funk=function(param,x,y,z){
  a=rep(param[1],5)
  b=param[2]
  d=param[3]
  fit=sum((y-(a+b*x+z*d))^2)
  return(fit)
}

optim(par=c(1,1,1),fn=funk(param=c(0,0,0),x=xx,y=yy,z=zz))

Error in (function (par) : could not find function "fn"

Ali
  • 56,466
  • 29
  • 168
  • 265
user311020193
  • 327
  • 2
  • 4
  • 10

1 Answers1

29

In optim, ... is used to pass arguments to fn:

xx=c(1,2,3,4,5)
zz=c(3,4,2,2,1)
yy=c(30,40,22,33,40)

funk=function(param,x,y,z){
  a=rep(param[1],5)
  b=param[2]
  d=param[3]
  fit=sum((y-(a+b*x+z*d))^2)
  return(fit)
}

optim(par=c(1,1,1), fn=funk, x=xx, y=yy, z=zz) 
$par
[1] -1.863076  5.722988  7.372296

$value
[1] 124.075

$counts
function gradient 
     180       NA 

$convergence
[1] 0

$message
NULL
  • Is this the same for optimx? – road_to_quantdom Mar 03 '15 at 00:12
  • 2
    Please read the help file `?optimx`. It is clearly written `... For optimx further arguments to be passed to fn and gr; otherwise, further arguments are not used.` –  Mar 03 '15 at 01:29
  • Can you please take a look at this question if you have time? https://stackoverflow.com/questions/68280857/r-x-probs-outside-0-1 thanks! – stats_noob Jul 07 '21 at 22:34