[R] invalid function value in 'nlm' optimizer
Hanze Zhang
kevin511511 at gmail.com
Wed Apr 29 15:49:05 CEST 2015
How should I do? The issue happened on log likelihood function?
On Tue, Apr 28, 2015 at 11:06 PM, William Dunlap <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
>
>
> Bill Dunlap
> TIBCO Software
> wdunlap tibco.com
>
> On Tue, Apr 28, 2015 at 6:40 PM, Hanze Zhang <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
>> >
>> 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
>> > >
>> > > project<-read.table(file="C://data.txt", header=T, 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 mailing list -- To UNSUBSCRIBE and more, see
>> 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.
>>
>
>
[[alternative HTML version deleted]]
More information about the R-help
mailing list