[R] Help on simple problem with optim

William Dunlap wdunlap at tibco.com
Thu Sep 9 22:34:40 CEST 2010


You can record all arguments and return values of the
calls that optim(par,fn) makes to fn with a function
like the following.  It takes your function and makes
a new function that returns the same thing but also
records information it its environment.  Thus, after
optim is done you can see its path to the optimum.

  trackFn <- function (fn) 
  {
      X <- NULL
      VALUE <- NULL
      force(fn)
      function(x) {
          X <<- rbind(X, x)
          val <- fn(x)
          VALUE <<- c(VALUE, val)
          val
      }
  }

E.g.,
> fn <- function(x)sum( (sin(x)-c(-1,0,1)) ^ 2 )
> optim(c(0,0,0), tfn <- trackFn(fn))
$par
[1] -1.583466e+00  6.726235e-05  1.558809e+00

$value
[1] 1.612853e-08

$counts
function gradient 
     146       NA 

$convergence
[1] 0

$message
NULL

> with(environment(tfn), length(VALUE)) # agrees w/ counts above
[1] 146
> with(environment(tfn), plot(VALUE, log="y"))
> with(environment(tfn), matplot(X, VALUE, log="y", type="l"))

You could also record warning messages by including a call
to withCallingHandlers() that stashed the warning in a list.

Recall trackFn each time you call optim().

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com 

> -----Original Message-----
> From: r-help-bounces at r-project.org 
> [mailto:r-help-bounces at r-project.org] On Behalf Of Zhang,Yanwei
> Sent: Thursday, September 09, 2010 11:54 AM
> To: r-help at r-project.org
> Subject: [R] Help on simple problem with optim
> 
> Dear all,
> 
> I ran into problems with the function "optim" when I tried to 
> do an mle estimation of a simple lognormal regression. Some 
> warning message poped up saying NANs have been produced in 
> the optimization process. But I could not figure out which 
> part of my code has caused this. I wonder if anybody would 
> help. The code is in the following and the data is in the attachment.
> 
> 
> da <- read.table("da.txt",header=TRUE)
> 
> # fit with linear regression using log transformation of the 
> response variable
> fit <- lm(log(yp) ~ as.factor(ay)+as.factor(lag),data=da)
> 
> # define the log likelihood to be maximized over
> llk.mar <- function(parm,y,x){
>         # parm is the vector of parameters
>         # the last element is sigma
>         # y is the response
>         # x is the design matrix
>         l <- length(parm)
>         beta <- parm[-l]
>         sigma <- parm[l]
>         x <- as.matrix(x)
>         mu <- x %*% beta
>         llk <- sum(dnorm(y, mu, sigma,log=TRUE))
>         return(llk)
> }
> 
> # initial values
> parm <- c(as.vector(coef(fit)),summary(fit)$sigma)
> y <- log(da$yp)
> x <- model.matrix(fit)
> 
> op <- optim(parm, llk.mar, 
> y=y,x=x,control=list(fnscale=-1,maxit=100000))
> 
> 
> After running the above code, I got the warning message:
> Warning messages:
> 1: In dnorm(x, mean, sd, log) : NaNs produced
> 2: In dnorm(x, mean, sd, log) : NaNs produced
> 
> 
> I would really appreciate if anybody would help to point out 
> the problem with this code or tell me how to trace it down 
> (using "trace"?)?
> Many thanks in advance.
> 
> 
> 
> 
> 
> 
> 
> Wayne (Yanwei) Zhang
> Statistical Research
> CNA
> 
> 
> 
> 
> 
> NOTICE:  This e-mail message, including any attachments and 
> appended messages, is for the sole use of the intended 
> recipients and may contain confidential and legally 
> privileged information.
> If you are not the intended recipient, any review, 
> dissemination, distribution, copying, storage or other use of 
> all or any portion of this message is strictly prohibited.
> If you received this message in error, please immediately 
> notify the sender by reply e-mail and delete this message in 
> its entirety.
> 



More information about the R-help mailing list