# How to use optim in R

March 12, 2013
By

(This article was first published on mages' blog, and kindly contributed to R-bloggers)

A friend of mine asked me the other day how she could use the function `optim` in R to fit data. Of course there are functions for fitting data in R and I wrote about this earlier. However, she wanted to understand how to do this from scratch using `optim`.

The function `optim` provides algorithms for general purpose optimisations and the documentation is perfectly reasonable, but I remember that it took me a little while to get my head around how to pass data and parameters to `optim`. Thus, here are two simple examples.

I start with a linear regression by minimising the residual sum of square and discuss how to carry out a maximum likelihood estimation in the second example.

### Minimise residual sum of squares

I start with an x-y data set, which I believe has a linear relationship and therefore I'd like to fit y against x by minimising the residual sum of squares.

``dat=data.frame(x=c(1,2,3,4,5,6),                y=c(1,3,5,6,8,12))``

Next, I create a function that calculates the residual sum of square of my data against a linear model with two parameter. Think of `y = par + par * x`.

``min.RSS <- function(data, par) {              with(data, sum((par + par * x - y)^2))             }``

Optim minimises a function by varying its parameters. The first argument of `optim` are the parameters I'd like to vary, `par` in this case; the second argument is the function to be minimised, `min.RSS`. The tricky bit is to understand how to apply `optim` to your data. The solution is the `...` argument in `optim`, which allows me to pass other arguments through to `min.RSS`, here my data. Therefore I can use the following statement:

``result <- optim(par = c(0, 1), min.RSS, data = dat)# I find the optimised parameters in result\$par# the minimised RSS is stored in result\$valueresult## \$par##  -1.267  2.029## ## \$value##  2.819## ## \$counts## function gradient ##       89       NA ## ## \$convergence##  0## ## \$message## NULL``

Let me plot the result:

``plot(y ~ x, data = dat)abline(a = result\$par, b = result\$par, col = "red")``

R-bloggers.com offers daily e-mail updates about R news and tutorials on topics such as: Data science, Big Data, R jobs, visualization (ggplot2, Boxplots, maps, animation), programming (RStudio, Sweave, LaTeX, SQL, Eclipse, git, hadoop, Web Scraping) statistics (regression, PCA, time series, trading) and more...

If you got this far, why not subscribe for updates from the site? Choose your flavor: e-mail, twitter, RSS, or facebook...