[R] nlminb() - how do I constrain the parameter vector properly?

William Dunlap wdunlap at tibco.com
Mon Oct 21 03:41:44 CEST 2013

Do you mean that your objective function (given to nlminb) parameterized
a positive definite matrix, P, as the elements in its upper (or lower) triangle?
If so, you could reparameterize it by the non-zero (upper triangular) elements
of the Choleski decomposition, C, of P.  Compute P as crossprod(C), compute
the initial estimate of C as chol(P).

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com

> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf
> Of Steven LeBlanc
> Sent: Sunday, October 20, 2013 3:02 PM
> To: r-help at R-project.org
> Subject: [R] nlminb() - how do I constrain the parameter vector properly?
> Greets,
> I'm trying to use nlminb() to estimate the parameters of a bivariate normal sample and
> during one of the iterations it passes a parameter vector to the likelihood function
> resulting in an invalid covariance matrix that causes dmvnorm() to throw an error. Thus,
> it seems I need to somehow communicate to nlminb() that the final three parameters in
> my parameter vector are used to construct a positive semi-definite matrix, but I can't see
> how to achieve this using the constraint mechanism provided. Additional details are
> provided in the code below.
> Suggestions?
> Best Regards,
> Steven
> Generate the data set I'm using:
> mu<-c(1,5)
> sigma<-c(1,2,2,6)
> dim(sigma)<-c(2,2)
> set.seed(83165026)
> sample.full<-sample.deleted<-mvrnorm(50,mu,sigma)
> delete.one<-c(1,5,13,20)
> delete.two<-c(3,11,17,31,40,41)
> sample.deleted[delete.one,1]<-NA
> sample.deleted[delete.two,2]<-NA
> missing<-c(delete.one,delete.two)
> complete<-sample.deleted[!(is.na(sample.deleted[,1]) | is.na(sample.deleted[,2])),]
> deleted<-sample.deleted[missing,]
> Try to estimate the parameters of the data set less the deleted values:
> exact<-function(theta,complete,deleted){
>     one.only<-deleted[!(is.na(deleted[,1])),1]
>     two.only<-deleted[!(is.na(deleted[,2])),2]
>     u<-c(theta[1],theta[2])
>     sigma<-c(theta[3],theta[5],theta[5],theta[4])
>     dim(sigma)<-c(2,2)
>     -sum(log(dmvnorm(x=complete,mean=u,sigma=sigma)))-
>         sum(log(dnorm(one.only,u[1],sigma[1,1])))-
>             sum(log(dnorm(two.only,u[2],sigma[2,2])))
> }
> nlminb(start=c(0,0,1,1,0),objective=exact,complete=complete,deleted=deleted,control=l
> ist(trace=1))
> Escape and it stops at Iteration 9 on my machine.
> ______________________________________________
> 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.

More information about the R-help mailing list