# [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