Unless you are supplying analytic hessian code, you are almost certainly 
getting an
approximation. Worse, if you do not provide gradients, these are the result of 
two levels
of differencing, so you should expect some loss of precision in the approximate 
Hessian.

Moreover, if your estimate of the optimum is a little bit off, or the optimizer 
has
terminated (algorithms converge, programs terminate) to a point that is not an 
optimum,
there is no reason the Hessian should be positive definite.

Package optimx() uses the Jacobian of the gradient if the analytic gradient is 
available.
This drops the differencing to 1 level. Even better is to code the Hessian, but 
that is
messy and tedious in most cases.

Best, JN


On 09/03/2011 06:00 AM, r-help-requ...@r-project.org wrote:
> Message: 59
> Date: Fri, 2 Sep 2011 15:33:13 -0400
> From: tzai...@alcor.concordia.ca
> To: r-help@r-project.org
> Subject: [R] Hessian Matrix Issue
> Message-ID:
>       <e6dc43b4487eb4a4055e1ab485f015f0.squir...@webmail.concordia.ca>
> Content-Type: text/plain;charset=iso-8859-1
> 
> Dear All,
> 
> I am running a simulation to obtain coverage probability of Wald type
> confidence intervals for my parameter d in a function of two parameters
> (mu,d).
> 
> I am optimizing it using "optim" method "L-BFGS-B" to obtain MLE. As, I
> want to invert the Hessian matrix to get Standard errors of the two
> parameter estimates. However, my Hessian matrix at times becomes
> non-invertible that is it is no more positive definite and I get the
> following error msg:
> 
> "Error in solve.default(ac$hessian) : system is computationally singular:
> reciprocal condition number = 6.89585e-21"
> Thank you
> 
> Following is the code I am running I would really appreciate your comments
> and suggestions:
> 
> #Start Code
> #option to trace /recover error
> #options(error = recover)
> 
> #Sample Size
> n<-30
> mu<-5
> size<- 2
> 
> #true values of parameter d
> d.true<-1+mu/size
> d.true
> 
> #true value of  zero inflation index phi= 1+log(d)/(1-d)
> z.true<-1+(log(d.true)/(1-d.true))
> z.true
> 
> # Allocating space for simulation vectors and setting counters for simulation
> counter<-0
> iter<-10000
> lower.d<-numeric(iter)
> upper.d<-numeric(iter)
> 
> #set.seed(987654321)
> 
> #begining of simulation loop########
> 
> for (i in 1:iter){
> r.NB<-rnbinom(n, mu = mu, size = size)
> y<-sort(r.NB)
> iter.num<-i
> print(y)
> print(iter.num)
> #empirical estimates or sample moments
> xbar<-mean(y)
> variance<-(sum((y-xbar)2))/length(y)
> dbar<-variance/xbar
> #sample estimate of proportion of zeros and zero inflation index
> pbar<-length(y[y==0])/length(y)
> 
> ### Simplified function #############################################
> 
> NegBin<-function(th){
> mu<-th[1]
> d<-th[2]
> n<-length(y)
> 
> arg1<-n*mean(y)*ifelse(mu >= 0, log(mu),0)
> #arg1<-n*mean(y)*log(mu)
> 
> #arg2<-n*log(d)*((mean(y))+mu/(d-1))
> arg2<-n*ifelse(d>=0, log(d), 0)*((mean(y))+mu/ifelse((d-1)>= 0, (d-1),
> 0.0000001))
> 
> aa<-numeric(length(max(y)))
> a<-numeric(length(y))
> for (i in 1:n)
> {
> for (j in 1:y[i]){
> aa[j]<-ifelse(((j-1)*(d-1))/mu >0,log(1+((j-1)*(d-1))/mu),0)
> #aa[j]<-log(1+((j-1)*(d-1))/mu)
> #print(aa[j])
> }
> 
> a[i]<-sum(aa)
> #print(a[i])
> }
> a
> arg3<-sum(a)
> llh<-arg1+arg2+arg3
> if(! is.finite(llh))
> llh<-1e+20
> -llh
> }
> ac<-optim(NegBin,par=c(xbar,dbar),method="L-BFGS-B",hessian=TRUE,lower=
> c(0,1) )
> ac
> print(ac$hessian)
> muhat<-ac$par[1]
> dhat<-ac$par[2]
> zhat<- 1+(log(dhat)/(1-dhat))
> infor<-solve(ac$hessian)
> var.dhat<-infor[2,2]
> se.dhat<-sqrt(var.dhat)
> var.muhat<-infor[1,1]
> se.muhat<-sqrt(var.muhat)
> var.func<-dhat*muhat
> var.func
> d.prime<-cbind(dhat,muhat)
> 
> se.var.func<-d.prime%*%infor%*%t(d.prime)
> se.var.func
> lower.d[i]<-dhat-1.96*se.dhat
> upper.d[i]<-dhat+1.96*se.dhat
> 
> if(lower.d[i]  <= d.true & d.true<= upper.d[i])
> counter <-counter+1
> }
> counter
> covg.prob<-counter/iter
> covg.prob
> 
> 
>

______________________________________________
R-help@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.

Reply via email to