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

Steven LeBlanc oreslag at gmail.com
Mon Oct 21 00:01:44 CEST 2013

```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=list(trace=1))

Escape and it stops at Iteration 9 on my machine.
```