[R] Numerical stability of eigenvalue and hessian matrix in R

Ben Bolker bbolker at gmail.com
Wed Feb 18 15:36:03 CET 2015


C W <tmrsg11 <at> gmail.com> writes:

> 
> Hi list,
> 
> I am running the following R code, the answer should be zero.  But R gives
> a very small negative number, what should I do?
> 
> ##R code
> 
library(numDeriv)
 
h_x <- function(x){
   a = x[1]
   b = x[2]
   c = x[3]
   d = x[4]
    (a^2 + c^2 + d^2) * (b^2 + c^2 + d^2)
}

x1 = 10
x2 = 1
x3 = 0
x4 = 10
x = c(x1, x2, x3, x4)
hess.h <- hessian(func = h_x, x)
mat <- h_x(x)*hess.h - grad(h_x, x) %o% grad(h_x, x)

m <- zapsmall(mat)

sum(eigen(m)$val[2:4])

I get a much smaller answer than you do (several orders of magnitude):

[1] 2.421439e-08
    
This is with: 

 R Under development (unstable) (2015-02-11 r67792)
Platform: i686-pc-linux-gnu (32-bit)
Running under: Ubuntu precise (12.04.5 LTS)
numDeriv_2012.9-1

  However, you mostly have to learn to deal with the
inherent imprecision of floating-point calculations.
It's hard to tell without any further context, but there
may be a more numerically stable way to do what you want.

> [1] 12160648  8103268  1665782 -9769050
> 
> > sum(eigen(m)$val[2:4])
> 
> [1] -0.0005430793
> 
> ## End of R code
> 
> The last answer above should be zero, but it's appearing as a very small
> negative number.  How should I deal with it?
> 
> Thanks lots,
> 
> Mike
> 
> 	[[alternative HTML version deleted]]
> 
>



More information about the R-help mailing list