# [R] Functions ,Optim, & Dataframe

Tony Plate tplate at acm.org
Mon Jul 31 19:52:14 CEST 2006

```Supply your additional arguments to optim() and they will get passed to

> mydat<-data.frame(d1=c(3,5),d2=c(6,10),p1=c(.55,.05),p2=c(.85,.35))
>
> fr<-function(x, d) {
+     # d is a vector of d1, d2, p1 & p2
+     u <- x[1]
+     v <- x[2]
+     d1 <- d[1]
+     d2 <- d[2]
+     p1 <- d[3]
+     p2 <- d[4]
+     sqrt(sum((plnorm(c(d1,d2,u,v)-c(p1,p2))^2)))
+ }
> x0 <- c(1,1)    # starting values for two unknown parameters
> y1 <- optim(x0,fr,d=unlist(mydat[1,]))
> y2 <- optim(x0,fr,d=unlist(mydat[2,]))
> y1\$par
[1] 0.462500 0.828125
> y2\$par
[1] -1.0937500  0.2828125
> yall <- apply(mydat, 1, function(d) optim(x0,fr,d=d))
> yall[[1]]\$par
[1] 0.462500 0.828125
> yall[[2]]\$par
[1] -1.0937500  0.2828125
>

One thing you must be careful of is that none of the arguments to your
function match or partially match the named arguments of optim(), which are:
> names(formals(optim))
[1] "par"     "fn"      "gr"      "method"  "lower"   "upper"   "control"
[8] "hessian" "..."
>

For example, if your function has an argument 'he=', you will not be
able to pass it, because if you say optim(x0, fr, he=3), the 'he' will
match the 'hessian=' argument of optim(), and it will not be interpreted
as being a '...' argument.

-- Tony Plate

Michael Papenfus wrote:
> I think I need to clarify a little further on my original question.
>
> I have the following two rows of data:
> mydat<-data.frame(d1=c(3,5),d2=c(6,10),p1=c(.55,.05),p2=c(.85,.35))
>  >mydat
>   d1 d2 p1 p2
> 1 3 6 0.55 0.85
> 2 5 10 0.05 0.35
>
> I need to optimize the following function using  optim for each row in mydat
> fr<-function(x) {
>     u<-x[1]
>     v<-x[2]
>     sqrt(sum((plnorm(c(d1,d2,u,v)-c(p1,p2))^2))
> }
> x0<-c(1,1)    # starting values for two unknown parameters
> y<-optim(x0,fr)
>
> In my defined function fr, (d1 d2 p1 p2) are known values which I need
> to read in from my dataframe and u & v are the TWO unknown parameters.
> I want to solve this equation for each row of my dataframe.
>
> I can get this to work when I manually plug in the known values (d1 d2
> p1 p2).  However, I would like to apply this to each row in my dataframe
> where the known values are automatically passed to my function which
> then is sent to optim which solves for the two unknown parameters for
> each row in the dataframe.
>
> thanks again,
> mike
>

```