Hello, I am trying to understand a small quirk I came across in R. The following code results in an error: k <- c(2, 1, 1, 5, 5) f <- c(1, 1, 1, 3, 2) loglikelihood <- function(theta,k,f){ if( theta<1 && theta>0 ) return(-1*sum(log(choose(k,f))+f*log(theta)+(k-f)*log(1-theta))) return(NA) } nlm(loglikelihood ,0.5, k, f ) Running this code results in: Error in nlm(logliklihood, 0.5, k, f) : invalid function value in 'nlm' optimizer However if the line return(NA) is changed to return(-NA) or even return(1*NA) or return(1/0), the code works. Is this expected behavior? The nlm help file says not NA or not NaN are acceptable values but I don't understand what that means. Thank you for your time, Mac Gaulin
On 30.11.2012 23:55, Mac Gaulin wrote:> Hello, > > I am trying to understand a small quirk I came across in R. The > following code results in an error: > > k <- c(2, 1, 1, 5, 5) > f <- c(1, 1, 1, 3, 2) > loglikelihood <- function(theta,k,f){ > if( theta<1 && theta>0 ) > return(-1*sum(log(choose(k,f))+f*log(theta)+(k-f)*log(1-theta))) > return(NA) > } > nlm(loglikelihood ,0.5, k, f ) > > Running this code results in: > Error in nlm(logliklihood, 0.5, k, f) : > invalid function value in 'nlm' optimizer > > However if the line return(NA) is changed to return(-NA) or even > return(1*NA) or return(1/0), the code works. Is this expected > behavior? The nlm help file says not NA or not NaN are acceptable > values but I don't understand what that means.Your function must return finite numbers, that means infinite numbers, NA nor NaN are not allowed and you experienced what happens if you do that. Please see ?constrOptim or other appropriate functions for constrained optimization problems. Uwe Ligges> > Thank you for your time, > Mac Gaulin > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >
On 30-11-2012, at 23:55, Mac Gaulin wrote:> Hello, > > I am trying to understand a small quirk I came across in R. The > following code results in an error: > > k <- c(2, 1, 1, 5, 5) > f <- c(1, 1, 1, 3, 2) > loglikelihood <- function(theta,k,f){ > if( theta<1 && theta>0 ) > return(-1*sum(log(choose(k,f))+f*log(theta)+(k-f)*log(1-theta))) > return(NA) > } > nlm(loglikelihood ,0.5, k, f ) > > Running this code results in: > Error in nlm(logliklihood, 0.5, k, f) : > invalid function value in 'nlm' optimizer >if you do a <- NA str(a) you'll see that a is a logical. And that is an invalid value for the function to return. When you do things such as NA+0 or -NA you get a numeric value NA and that is a non-finite value which is why you get the warning.. Instead of NA you could return something like .Machine$double.xmax . Or use constrOptim as advised. Berend> However if the line return(NA) is changed to return(-NA) or even > return(1*NA) or return(1/0), the code works. Is this expected > behavior? The nlm help file says not NA or not NaN are acceptable > values but I don't understand what that means. > > Thank you for your time, > Mac Gaulin > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.