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().

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)).

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
status:iconv,iter:n)
The values of these components are as follows

psi     length p vector of estimated uniquenesses
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
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.