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

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