Next: glsresids() Up: Multivariate Macros Help File Previous: glscrit()   Contents

glsfactor()

Usage:
glsfactor(s, m [, quiet:T,silent:T,start:psi0,uselogs:T], maxit:nmax,
  minit:nmin, print:T,crit:crvec]), REAL symmetric matrix s with no
  MISSING values, integers nmax > 0 and nmin > 0, crvec =
  vector(numsig, nsigsq, delta)



Keywords: factor analysis
You use glsfactor() to find GLS (generalized least squares) estimates of
the vector psi of factor analysis uniquenesses and loading matrix L by
means of nonlinear least squares.  It uses macro glsresids() to compute
residuals used by non-linear least squares macro levmar().

glsfactor(r, m) estimates uniquenesses and loadings for a m-factor
analysis based on p by p symmetric correlation or variance-covariance
matrix r.  m > 0 must be an integer < (2*p + 1 - sqrt(8*p+1))/2.  The
default starting value for the uniquenesses is psi0 = 1/diag(solve(r)).

glsfactor() prints the estimated uniquenesses psihat and loading matrix,
the minimized criterion value, and vals, a vector of numbers computed
from certain eigenvalues; see below.

The result is an "invisible" (assignable but not automatically printed)
variable of the form
   structure(psihat:psi,loadings:L,criterion:crit,eigenvals:vals,\
      status:iconv,iter:n)
The values of these components are as follows

   psi     length p vector of estimated uniquenesses
   L       p by m matrix of estimated loadings satisfying
           L' %*% dmat(1/psi) %*% L is diagonal
   crit    sum of squared "residuals" of r from rhat
   vals    1/v - 1, where v is the vector of eigenvalues of
           dmat(psi) %*% solve(r) in increasing order
   iconv   integer >= 0 indicating convergence status, with 0 and 4
           indicating non-convergence
   n       number of iterations

There are several keyword phrases that can be used as arguments to
control the behavior of glsfactor().
  start:psi0     psi0 a REAL vector of length p with min(psi0) > 0
                 to be used as starting values for the iteration
  uselogs:T      log(psi) is used in the iteration instead of psi;
                 this ensures psi does not become negative and may
                 speed convergence
  maxit:nmax     No more than nmax iterations are to be used; the
                 default is 30
  minit:nmin     At least nmin iterations will be performed; the
                 default is 1
  crit:crvec     crvec = vector(numsig, nsigsq, delta), 3 criteria
                 for convergence; a negative criterion is ignored;
                 see macro levmar() for details
  quiet:T        uniquenesses, loadings and vals are not printed;
                 only certain warning messages are printed
  silent:T       nothing is printed except error messages
  print:T        macro levmar() will print a status report on every
                 iteration

Values of iconv indicate the following situations
 iconv  Meaning
   0    Not converged
   1    Converged with relative change in psi or log(psi) < 10^-numsig
   2    Converged with relative change in rss <= 10^-nsigsq
   3    Converged with ||gradient|| < delta
   4    Interation stopped; could not reduce rss.
Without uselogs:T, there is no guarantee that min(psihat) > = 0.

Even with uselogs:T, there is no guarantee that the minimum is inside
the permissible range (r - dmat(psihat) positive semi-definite);
however, this often leads to an 'argument to solve() singular' error
message.

Everytime it is called by levmar(), macro glsresids() saves a copy of
the current value of psi in invisible variable _PSIGLS.  Type
'print(_PSIGLS)' to see this value.

glsfactor() is very much a work in progress, that may in fact be
abandoned in favor of other methods using optimization macros in macro
file Math.mac distributed with MacAnova.

See also ulsfactor() and glsresids().


Gary Oehlert 2003-01-15