[R] how to avoid NaN in optim()

Ravi Varadhan rvaradhan at jhmi.edu
Fri Oct 1 20:22:47 CEST 2010


You do not have to worry about re-defining your function to handle the
constraints on parameters.  You can let the optimizer worry about it.

lik <- function(nO, nA, nB, nAB){
	loglik <- function(par)
	{
	p=par[1]
	q=par[2]
	r <- 1 - p - q

	-(2 * nO * log (r) + nA * log (p^2 + 2 * p * r)
	+ nB * log (q^2 + 2 * q * r)
	+ nAB * (log(2) +log(p) +log(q)))
	}
}


library(BB)
# constraints:  x[1] > 0; x[2] > 0; x[1] + x[2] < 1

Amat <- matrix(c(1,0,0,1,-1,-1), 3, 2, byrow=TRUE)

b <- c(0, 0, -1)

c1 <- runif(1) 

p0 <- c(c1, max(0.01, 0.99-c1)) 

spg(p0, lik ( 176,182,60,17) , project="projectLinear",
projectArgs=list(A=Amat, b=b, meq=0))

Hope this helps,
Ravi.

-----Original Message-----
From: Ravi Varadhan [mailto:rvaradhan at jhmi.edu] 
Sent: Thursday, September 30, 2010 3:09 PM
To: Ravi Varadhan
Cc: arindam fadikar; r-help at r-project.org
Subject: Re: [R] how to avoid NaN in optim()

Here is how you do it:

library(BB)

Amat <- matrix(c(1,0,0,1,-1,-1), 3, 2, byrow=TRUE)

b <- c(0, 0, -1)

p0 <- c(0.5, 0.4)

spg(p0, lik ( 176,182 , 60 ,17) , project="projectLinear",
projectArgs=list(A=Amat, b=b, meq=0))


Hope this helps,
Ravi.

____________________________________________________________________

Ravi Varadhan, Ph.D.
Assistant Professor,
Division of Geriatric Medicine and Gerontology
School of Medicine
Johns Hopkins University

Ph. (410) 502-2619
email: rvaradhan at jhmi.edu


----- Original Message -----
From: Ravi Varadhan <rvaradhan at jhmi.edu>
Date: Thursday, September 30, 2010 3:04 pm
Subject: Re: [R] how to avoid NaN in optim()
To: Ravi Varadhan <rvaradhan at jhmi.edu>
Cc: arindam fadikar <arindam.fadikar at gmail.com>, r-help at r-project.org


> You also need the constrain that par[1] + par[2] < 1 in order to avoid 
> NaNs.
>  
>  You can do this using the `projectLinear' argument in  `spg'.
>  
>  library(BB)
>  ?spg
>  
>  
>  Ravi.
>  
>  ____________________________________________________________________
>  
>  Ravi Varadhan, Ph.D.
>  Assistant Professor,
>  Division of Geriatric Medicine and Gerontology
>  School of Medicine
>  Johns Hopkins University
>  
>  Ph. (410) 502-2619
>  email: rvaradhan at jhmi.edu
>  
>  
>  ----- Original Message -----
>  From: Ravi Varadhan <rvaradhan at jhmi.edu>
>  Date: Thursday, September 30, 2010 2:54 pm
>  Subject: Re: [R] how to avoid NaN in optim()
>  To: arindam fadikar <arindam.fadikar at gmail.com>
>  Cc: r-help at r-project.org
>  
>  
>  > Change the `else NA' to `else Inf' in your loglik function  and 
> then 
>  > run the following:
>  >  
>  >  
>  >  library(BB)
>  >  
>  >  p0 <- runif(2)
>  >  
>  >  spg(p0, lik (176,182 , 60 ,17) , lower=0,  upper=1)
>  >  
>  >  
>  >  This will give you correct results.
>  >  
>  >  Ravi.
>  >  
>  >  ____________________________________________________________________
>  >  
>  >  Ravi Varadhan, Ph.D.
>  >  Assistant Professor,
>  >  Division of Geriatric Medicine and Gerontology
>  >  School of Medicine
>  >  Johns Hopkins University
>  >  
>  >  Ph. (410) 502-2619
>  >  email: rvaradhan at jhmi.edu
>  >  
>  >  
>  >  ----- Original Message -----
>  >  From: arindam fadikar <arindam.fadikar at gmail.com>
>  >  Date: Thursday, September 30, 2010 2:17 pm
>  >  Subject: [R] how to avoid NaN in optim()
>  >  To: r-help at r-project.org
>  >  
>  >  
>  >  > hi ,
>  >  >  
>  >  >  lik <- function(nO, nA, nB, nAB){
>  >  >  
>  >  >  loglik <- function(par)
>  >  >    {
>  >  >        p=par[1]
>  >  >        q=par[2]
>  >  >        r <- 1 - p - q
>  >  >  
>  >  >        if (c(p,q,r) > rep(0,3) && c(p,q,r) < rep(1,3) )
>  >  >  
>  >  >          {
>  >  >            -(2 * nO * log (r) + nA * log (p^2 + 2 * p * r)
>  >  >              + nB * log (q^2 + 2 * q * r)
>  >  >              + nAB * (log(2) +log(p) +log(q)))
>  >  >         }
>  >  >        else
>  >  >          NA
>  >  >    }
>  >  >  
>  >  >  loglik
>  >  >  
>  >  >  }
>  >  >  
>  >  >  
>  >  >  i want to maximize this likelihood function over the range 
> (0,0,0) 
>  > to
>  >  >  (1,1,1). so i tried
>  >  >  
>  >  >  optim ( c(0.3,0.3), lik ( 176,182 , 60 ,17) , method = "CG")
>  >  >  
>  >  >  and obtained the following :
>  >  >  
>  >  >  > optim(c(0.3,0.3), fn, method="CG")
>  >  >  $par
>  >  >  [1] 0.26444187 0.09316946
>  >  >  
>  >  >  $value
>  >  >  [1] 492.5353
>  >  >  
>  >  >  $counts
>  >  >  function gradient
>  >  >       130       19
>  >  >  
>  >  >  $convergence
>  >  >  [1] 0
>  >  >  
>  >  >  $message
>  >  >  NULL
>  >  >  
>  >  >  Warning messages:
>  >  >  1: In log(q^2 + 2 * q * r) : NaNs produced
>  >  >  2: In log(q) : NaNs produced
>  >  >  3: In log(q^2 + 2 * q * r) : NaNs produced
>  >  >  4: In log(q) : NaNs produced
>  >  >  
>  >  >  
>  >  >  please help ...
>  >  >  
>  >  >  
>  >  >  -- 
>  >  >  Arindam Fadikar
>  >  >  M.Stat
>  >  >  Indian Statistical Institute.
>  >  >  New Delhi, India
>  >  >  
>  >  >  	[[alternative HTML version deleted]]
>  >  >  
>  >  >  ______________________________________________
>  >  >  R-help at r-project.org mailing list
>  >  >  
>  >  >  PLEASE do read the posting guide 
>  >  >  and provide commented, minimal, self-contained, reproducible code.
>  >  
>  >  ______________________________________________
>  >  R-help at r-project.org mailing list
>  >  
>  >  PLEASE do read the posting guide 
>  >  and provide commented, minimal, self-contained, reproducible code. 
>



More information about the R-help mailing list