Next: forstep() Up: Multivariate Macros Help File Previous: distcomp()   Contents

# facanal()

Usage:
 ```facanal(s, m [, method:Meth] [,start:psi0] [,rotate:Rotmeth] \ [,maxit:nmax] [,minit:nmin] [,crit:vector(nsig1,nsig2,dg)]\ [,minimizer:M] [,gold:ngold] [,quiet:T] [,silent:T] \ [,recordwhen:d1] [,printwhen:d2]), REAL p.d. symmetric matrix s, integer m > 0, psi0 positive vector of starting uniquenesses, Rotmeth one of "varimax", quartimax", "equimax", "none" (default), nmin >= 0, nmax > 0, ngold > 0, d1 >= 0, d2 >= 0, nsig1, nsig2 integers, dg REAL scalar, M one of "dfp", "bfs" (default) or "broyden", ```

Keywords: factor analysis
```facanal() uses an optimization macro (dfp(), bfs() or broyden()) to find
minimizes a criterion as a function of log(psi), psi = vector of
uniquenesses.

You can specify a rotation method and starting values.

facanal() is to be preferred to other macros, including ulsfactor() and
glsfactor(), for factor extraction.

By default, minimizer bfs() is used but you can specify another
minimizer.

facanal(r, m, method:Meth) computes estimated uniquenesses and unrotated
estimated loadings for a orthogonal factor analysis based a p by p
correlation or covariance matix r which must be symmetric and positive
definite.

Integer m > 0 is the number of factors assumed.  It must satisfy r <
(2*p + 1 - sqrt(8*p+1))/2

Meth is must be one of "mle" or "ml" (ML or maximum likelihood method),
"uls" (ULS or unweighted least squares method) or "gls" (GLS or
generalized least squares method).  If you omit method:Meth, the default
is method:"mle".

minimized value of the criterion being minimized.  This can be used in a
goodness of fit test.

See below for the value returned by facanal().  It is "invisible" unless
'quiet:T' or 'silent:T' is an argument.

facanal(r, m, method:Meth, start:psi0), does the same except that the
minimization iteration is started with uniquenesses psi0.  The default
starting values are psi0 = 1/diag(solve(r)).

and 'kaiser'.

facanal(r, m, method:Meth, rotate:Rot), where Rot is one of "varimax",
"quartimax", "equimax" or "none" (the default), carries out the
It does not affect the values of the uniquenesses or criterion.

facanal(r, m, method:Meth, rotate:Rot,kaiser:F), does the same except
Kaiser normalization is not done.

There are several keywords you can use to control the actual
minimization of the criterion.  Default values are in [..]

nmin:n1     integer n1 >= 0 = minimum number of interations performed
[0]
nmax:n2     integer n2 > 0 = maximum number of interations performed
[30]
crit:vector(nsig1,nsig2,dg)
nsig1    target number of significant digits in log uniquenesses
[5]
nsig2    target number of significant digits in the criterion [8]
dg       target upper limit for ||gradient|| [-1]
Negative values of nsig1, nsig2 or dg are ignored.
minimizer:M M = name of minimizer, one of "dfp" (Davidon-Fletcher-
Powell), "bfs" (Broyden-Fletcher-Shanno) or "broyden"
["bfs"]
ngold:n  integer n >= 0 = number of steps in golden mean linear
search by minimizer [1]; ignored with minimizer:"broyden"

facanal() requires and loads automatically one of the macros ulscrit(),
glscrit() or mlcrit() to compute the objective function, gradient vector

There are three keywords that you can use to control what gets printed.

quiet:T     suppresses printing of results;  the return value is
visible
silent:T    same as quiet:T except warning messages are also
suppressed
printwhen:d1  d1 >= 0 integer specifies (when d1 > 0) that partial
results are printed at iterations d1, 2*d1, 3*d1.  These
are the current values of x = log(uniquenesses), the F(x)
= criterion and the gradient vector dF(x)/dx

In addition to returning them, facanal() saves the estimated

Each time they are entered, ulscrit(), glscrit() or mlcrit() save a copy
of their argument psi in invisible variable _PSIULS, _PSIGLS or _PSIML.

You can use keyword 'recordwhen' to specify that partial results are
saved in side-effect structure BFSRECORD, DFPRECORD or BROYDNRECORD on
some or all iterations:

recordwhen:d2  d2 >= 0 integer specifies (when d2 > 0) that partial
results are saved at iterations d2, 2*d2, 3*d2, ...
Values of x = log(uniquenesses), F(x) = criterion and
dF(x)/df go in components 'xvalx', 'funval' and

facanal() always returns as structure a value which can be assigned.
Unless 'silent:T' or 'quiet:T' is an argument, the return value is
"invisible" and won't be automatically printed.

eigenvals:vals, gradient:g, method:Meth, rotation:Rot, iter:n, status:k)
where the values of the components are as follows:

psi         REAL vector of estimated uniquenesses
crit        Minimized criterion
vals        eigenvalues s relative to psi
g           REAL gradient vector at optimum
n > 0       integer = number of iterations
k >= 0      integer specifying which (1, 2 or 3) of the convergence
criterion signalled convergence; k = 0 means not
converged

Cmd> facanal(cor(y),2,rotate:"varimax") # y a 50 by 5 matrix
Convergence in 26 iterations by criterion 2
estimated uniquenesses:
(1)     0.39881  5.4107e-07     0.20203     0.32915     0.63907
(1,1)     0.71121     0.30883
(2,1)     0.13876     0.99033
(3,1)    -0.84817    -0.28032
(4,1)    -0.80203    -0.16613
(5,1)     0.59678   -0.069151
minimized ml criterion:
(1)    0.013439

Cmd> result <- facanal(cor(y),2,rotate:"varimax",method:"uls",\
silent:T)

Cmd> compnames(result)
(1) "psihat"
(3) "criterion"
(4) "eigenvals"
(6) "method"
(7) "rotation"
(8) "iter"
(9) "status"

Cmd> result[vector(8,9)] # status = 0 => did not converge
component: iter
(1)          30
component: status
(1)           0