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


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
ULS, GLS or ML estimates of uniquenesses and loadings.  The optimizer
minimizes a criterion as a function of log(psi), psi = vector of

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

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

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

In addition to the uniquenesses and loadings, facanal() prints the
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)).

You control rotation of the estimated loadings using keywords 'rotate'
and 'kaiser'.

facanal(r, m, method:Meth, rotate:Rot), where Rot is one of "varimax",
"quartimax", "equimax" or "none" (the default), carries out the
indicated rotation of the factor loadings using Kaiser normalization.
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
  nmax:n2     integer n2 > 0 = maximum number of interations performed
     nsig1    target number of significant digits in log uniquenesses
     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"
     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
and loading matrix.

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

   quiet:T     suppresses printing of results;  the return value is
   silent:T    same as quiet:T except warning messages are also
   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
uniquenesses, rotated loadings, minimized criterion, eigenvalues and
gradient vector in side-effect variables PSI, LOADINGS, CRITERION,
EIGENVALUES and GRADIENT, respectively.

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
               'gradients' of the structure.

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.

The result has the form structure(psihat:psi,loadings:l,criterion:crit,
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
   l           REAL p by m matrix of loadings
   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

  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
  varimax rotated estimated loadings:
  (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",\
  Cmd> compnames(result)
  (1) "psihat"
  (2) "loadings"
  (3) "criterion"
  (4) "eigenvals"
  (5) "gradient"
  (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
See also ulsfactor(), glsfactor(), ulscrit(), glscrit(), mlcrit(),

Gary Oehlert 2003-01-15