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) Thanks! [[alternative HTML version deleted]]
Why are you doing this instead of using the survival package? Bert On Tuesday, April 28, 2015, Hanze Zhang <kevin511511 at gmail.com> 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) > > > Thanks! > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org <javascript:;> 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. >-- Bert Gunter Genentech Nonclinical Biostatistics (650) 467-7374 "Data is not information. Information is not knowledge. And knowledge is certainly not wisdom." Clifford Stoll [[alternative HTML version deleted]]
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
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]]