[R] invalid function value in 'nlm' optimizer

Duncan Murdoch murdoch.duncan at gmail.com
Wed Apr 29 15:54:05 CEST 2015

```On 29/04/2015 9:49 AM, Hanze Zhang wrote:
> How should I do? The issue happened on log likelihood function?

I imagine it's the log(x[delta==1]) term that is turning the result into
a vector.

Duncan Murdoch
>
> On Tue, Apr 28, 2015 at 11:06 PM, William Dunlap <wdunlap at tibco.com
> <mailto:wdunlap at tibco.com>> wrote:
>
>     Your function ln() does not return a scalar.
>        > ln(theta=c(1,2))
>        [1] 48.5342640972 48.5342640972 48.5342640972 48.5342640972
>     48.5342640972 <tel:5342640972>
>
>
>     Bill Dunlap
>     TIBCO Software
>     wdunlap tibco.com <http://tibco.com>
>
>     On Tue, Apr 28, 2015 at 6:40 PM, Hanze Zhang
>     <kevin511511 at gmail.com <mailto:kevin511511 at gmail.com>> wrote:
>
>         I still cannot solve the problem: 'invalid function value in 'nlm'
>         optimizer'
>
>         I want to get the MLE for theta[1] and theta[2], my code is below:
>
>
>         x <- c(2,5,3,7,3,2,4)
>         delta <- c(1, 0, 1, 1, 1, 0, 1)
>
>         # -log likelihood
>         #alpha<-theta[1]
>         #lamda<-theta[2]
>         ln<-function(theta,x1,x2  )
>           {
>
>          -sum(delta)*log(theta[1]*theta[2])-sum(delta)*(theta[1]-1)*log(x[delta==1])+theta[2]*sum(x^theta[1])
>         }
>
>
>         #MLE
>         nlm(ln,theta<-c(1,1),x1=x, x2=delta, hessian=TRUE)
>
>
>         On Tue, Apr 28, 2015 at 6:40 AM, Duncan Murdoch
>         <murdoch.duncan at gmail.com <mailto:murdoch.duncan at gmail.com>>
>         wrote:
>
>         > On 28/04/2015 2:43 AM, Hanze Zhang wrote:
>         > > Hi, R users,
>         > >
>         > >
>         > > I am using nlm function to get the MLE of parameter alpha
>         and lambda
>         > from a
>         > >  parametric survival model (Weibull distribution).
>         However, this message
>         > > always came out: ' invalid function value in 'nlm'
>         optimizer'. Could
>         > anyone
>         > > help me? Code is
>         > >
>         <http://as.is>=T)
>         > > names(project)
>         > > attach(project)
>         > >
>         > > x<-time
>         > > delta<-ind
>         > >
>         > >
>         > > # -log likelihood
>         > > #alpha<-theta[1]
>         > > #lambda<-theta[2]
>         > > ln<-function(theta)
>         > >   {
>         > >
>         > >
>         >
>         -sum(delta)*log(theta[1]*theta[2])-sum(delta)*(theta[1]-1)*log(x[delta==1])+theta[2]*sum(x^theta[1])
>         > > }
>         > >
>         > > #MLE
>         > > nlm(ln,theta<-c(1,1),hessian=TRUE)
>         >
>         > You are taking logs of parameters.  Probably the optimizer
>         is setting
>         > the parameters to negative values, and so the log returns NaN.
>         >
>         > You can avoid this by testing your parameters on input, and
>         always
>         > returning a valid number.  There are lots of ways to do
>         this: One
>         > strategy is to return +Inf for invalid values; another is to
>         move the
>         > parameter to the nearest boundary, and apply a penalty
>         according to how
>         > far you moved it.  Or just take the absolute value of the
>         parameter.  Or
>         > reparametrize so that illegal values aren't possible.
>         >
>         > Duncan Murdoch
>         >
>         >
>
>                 [[alternative HTML version deleted]]
>
>         ______________________________________________
>         R-help at r-project.org <mailto:R-help at r-project.org> mailing
>         list -- To UNSUBSCRIBE and more, see
>         https://stat.ethz.ch/mailman/listinfo/r-help