[R] error in Fields TPS function {svd ...}

Martin Maechler maechler at stat.math.ethz.ch
Wed Oct 30 08:54:33 CET 2002

>>>>> "Jason" == Jason Bond <jbond at arg.org>
>>>>>     on Tue, 29 Oct 2002 14:17:28 -0800 writes:

    Jason> Hello, I was wondering whether anyone out there knows of the solution to a 
    Jason> problem that I'm having with the Fields package.  I am getting the error 
    Jason> message when I try and run the fields function tps (thin plate 
    Jason> splines).  Namely, for two different sets of variables, I get:

(if you had provided one of the sets of variables we would have
 a chance to reproduce your problem)

    >> bout <- Tps( bvolcap, bdsm)
    Jason> Error in svd(tempM) : error  159  in dsvdc
    >> wout <- Tps( wvolcap, wdsm)
    Jason> Error in svd(tempM) : error  546  in dsvdc

[Ok, I'm starting a general `sermon' ;-)]

1) After error messages like these, always first try
   ~~~~~~~~~~~  which shows you the function calls nesting
   leading to the error.

2) The above message indicates it comes from svd().
   This should lead you immediately to carefully look at the
   output of
     ?svd   [aka  help(svd) ]

   In this case, this will only help to suggest (to the author
   of Fields!) that maybe  La.svd() should be tried instead of svd().
   svd() is based on LINPACK which was state-of-the-art (in
   numerical linear algebra) in the 70's and (early) 80's. 
   It's successor, LAPACK, is +/- current state-of-the-art and
   that's why  help(svd) suggests using La.svd() for all new projects.

3) For non-standard packages (not "Base" or "Recommended") I'd
   suggest you always first ask the package maintainer, i.e.
   the one in the line "Maintainer : ..........."
   you get from 
	   library(help = Fields)

Back to the concrete problem:
svd's source has

    z <- .Fortran("dsvdc", as.double(x), n, n, p, d = double(mm), 
        double(p), u = u, n, v = v, p, double(n), as.integer(job), 
        info = integer(1), DUP = FALSE, PACKAGE = "base")[c("d", 
        "u", "v", "info")]
    if (z$info) 
        stop(paste("error ", z$info, " in dsvdc"))

which is where the error message is produced.
As R is GNU software and hence Open Source, we can `quickly'(:-)
jump to the Fortran source  <SOURCEDIR>/src/appl/dsvdc.f
and dig there. In the initial comments we find

c     on return

c         info      integer.
c                   the singular values (and their corresponding
c                   singular vectors) s(info+1),s(info+2),...,s(m)
c                   are correct (here m=min(n,p)).  thus if
c                   info.eq.0, all the singular values and their
c                   vectors are correct.  in any event, the matrix
c                   b = trans(u)*x*v is the bidiagonal matrix
c                   with the elements of s on its diagonal and the
c                   elements of e on its super-diagonal (trans(u)
c                   is the transpose of u).  thus the singular
c                   values of x and b are the same.

so you now only know that quite a few singular values could
*not* be computed for your matrix / data.

    Jason> Any help would be greatly appreciated.
    Jason> Jason
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request at stat.math.ethz.ch

More information about the R-help mailing list